Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/05/2019, à 10:22

diesel

[LAISSÉ TOMBER] Message bizarre

Bonjour,

Dans un script, j'ai une ligne :

interface=$(basename /sys/bus/pci/devices/0000:00:19.0/net/*)

J'ai vérifié, la variable interface contient bien "enp0s25" qui est le nom de mon interface réseau. Et c'est la seule invocation de la commande "basename" dans le script.

Or, à la sortie du script (qui fonctionne très bien), j'ai ces deux lignes :

basename: missing operand
Try 'basename --help' for more information.

Quelqu'un y comprend quelque chose ?

Je dois aussi préciser que ce script est lancé via un autre script dans /etc/init.d qui contient, après la ligne d'invocation de mon script, la ligne

log_end_msg $?

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 03/05/2019, à 21:26)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#2 Le 01/05/2019, à 10:41

pingouinux

Re : [LAISSÉ TOMBER] Message bizarre

Bonjour,
Une explication est qu'il n'existe pas de fichier /sys/bus/pci/devices/0000:00:19.0/net/*, et que l'option nullglob de shopt soit positionnée.

$ shopt nullglob
nullglob       	on

Hors ligne

#3 Le 01/05/2019, à 11:00

diesel

Re : [LAISSÉ TOMBER] Message bizarre

pingouinux a écrit :

Bonjour,
Une explication est qu'il n'existe pas de fichier /sys/bus/pci/devices/0000:00:19.0/net/*, et que l'option nullglob de shopt soit positionnée.

$ shopt nullglob
nullglob       	on

Ben..., si, il existe bien.

jean-marie@serveur:~$ ls /sys/bus/pci/devices/0000:00:19.0/net
enp0s25
jean-marie@serveur:~$

Alors, c'est vrai que c'est un répertoire et pas un fichier.

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 01/05/2019, à 11:05)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#4 Le 01/05/2019, à 11:11

Nuliel

Re : [LAISSÉ TOMBER] Message bizarre

C'est quoi le but? Récupérer le nom de l'interface réseau?
Si oui,

basename /sys/bus/pci/devices/0000:00:19.0/net/*

devrait fonctionner

Hors ligne

#5 Le 01/05/2019, à 11:53

diesel

Re : [LAISSÉ TOMBER] Message bizarre

Ben..., oui, c'est bien pour récupérer le nom de l'interface réseau et ça fonctionne.

Par contre, je récupère un message d'erreur.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#6 Le 01/05/2019, à 12:02

Nuliel

Re : [LAISSÉ TOMBER] Message bizarre

Faut il ajouter des \ devant les : ?

basename /sys/bus/pci/devices/0000\:00\:19.0/net/*

Hors ligne

#7 Le 01/05/2019, à 12:02

kamaris

Re : [LAISSÉ TOMBER] Message bizarre

diesel83140 a écrit :

Je dois aussi préciser que ce script est lancé via un autre script dans /etc/init.d

Au moment où ton script est lancé l'interface n'existe pas encore ? C'est pas une explication de ce genre ?

Hors ligne

#8 Le 01/05/2019, à 12:13

diesel

Re : [LAISSÉ TOMBER] Message bizarre

kamaris a écrit :
diesel83140 a écrit :

Je dois aussi préciser que ce script est lancé via un autre script dans /etc/init.d

Au moment où ton script est lancé l'interface n'existe pas encore ? C'est pas une explication de ce genre ?

Pas du tout. Ce script sert pour l'option "reload" du script d'init.

A ce moment, ça fait belle lurette que l'interface a été créée.

Par ailleurs, je lance ce script à partir d'une session ssh au travers de cette même interface.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#9 Le 01/05/2019, à 12:17

diesel

Re : [LAISSÉ TOMBER] Message bizarre

Naziel a écrit :

Faut il ajouter des \ devant les : ?

basename /sys/bus/pci/devices/0000\:00\:19.0/net/*

Bien essayé, mais ne change rien.

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#10 Le 01/05/2019, à 13:35

LeoMajor

Re : [LAISSÉ TOMBER] Message bizarre

bonjour,

interface réellement active

interface=$(ifconfig | awk 'BEGIN{FPAT="^(enp|eth|wlp)[0-9a-z]+|[0-9]{6,}" }; /^(enp|eth|wlp)/{iface=$1}; /Octets/ { if($1>1000000)endface=iface}; END { if(endface)print endface } ')

Hors ligne

#11 Le 01/05/2019, à 14:02

diesel

Re : [LAISSÉ TOMBER] Message bizarre

LeoMajor a écrit :

bonjour,

interface réellement active

interface=$(ifconfig | awk 'BEGIN{FPAT="^(enp|eth|wlp)[0-9a-z]+|[0-9]{6,}" }; /^(enp|eth|wlp)/{iface=$1}; /Octets/ { if($1>1000000)endface=iface}; END { if(endface)print endface } ')

Oui...,

Mais ça ne répond pas au problème.

Sur cette machine, j'ai deux interfaces qui sont actives toutes les deux (mais à la limite, je m'en fiche qu'elles soient actives ou pas à ce moment là, je veux juste récupérer le nom).

Depuis l'arrivée de udev, les noms des interfaces ont changé (pas en cours d'exécution, quand-même) et rien ne me garantit que ça ne va pas encore changer.

C'est pourquoi je recherche le nom de l'interface à partir de sa position sur le bus PCI qui, pour le coup, d'autant qu'il s'agit de l'interface réseau intégrée à la carte mère, a peu de chance de changer.

De plus, la commande ifconfig a tendance à se déprécier au profit de la commande ip.

Et puis, j'ai une de mes interfaces réseau qui porte le doux nom de "enx00e04c534458". Je ne maîtrise pas du tout awk mais j'ai un gros doute sur le fait qu'elle ressorte de ta ligne de commande.

Enfin :

jean-marie@jean-marie:~$ ifconfig
enp25s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1482
        inet 192.168.0.2  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fd4a:6148:83fb:0:ce11:c081:9da7:5604  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::6:ea5c:9b1c:1ec6  prefixlen 64  scopeid 0x20<link>
        inet6 fd4a:6148:83fb:0:24df:3e3e:3b52:78f2  prefixlen 64  scopeid 0x0<global>
        ether 4c:cc:6a:f4:3d:3e  txqueuelen 1000  (Ethernet)
        RX packets 39383  bytes 41159297 (41.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31685  bytes 4647819 (4.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 201

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Boucle locale)
        RX packets 2865  bytes 294102 (294.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2865  bytes 294102 (294.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

jean-marie@jean-marie:~$ interface=$(ifconfig | awk 'BEGIN{FPAT="^(enp|eth|wlp)[0-9a-z]+|[0-9]{6,}" }; /^(enp|eth|wlp)/{iface=$1}; /Octets/ { if($1>1000000)endface=iface}; END { if(endface)print endface } ')
jean-marie@jean-marie:~$ echo $interface

jean-marie@jean-marie:~$

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 01/05/2019, à 14:38)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#12 Le 01/05/2019, à 15:20

LeoMajor

Re : [LAISSÉ TOMBER] Message bizarre

à adapter;
tu n'as pas "Octets" (16.04) . Cela devrait fonctionner aussi avec du wifi (usb ou pci)

interface=$(ifconfig | awk 'BEGIN{FPAT="^(enp|eth|wlp|lo)[0-9a-z]*|[0-9]{7,}" }; /^(enp|eth|wlp|lo)/{iface=$1}; /RX packets/ { if($1>1000000)endface[iface]=$1}; END { for (e in endface)if(!(e~/lo/))print e} ')

Hors ligne

#13 Le 01/05/2019, à 15:40

kamaris

Re : [LAISSÉ TOMBER] Message bizarre

Ben il y a fatalement un moment où basename est invoquée sans argument d'entrée, sinon elle ne dirait pas ce qu'elle dit en sortie.
Donc soit l'invocation que tu cites se passe comme le dit pingouinux en #2, soit il y en a une autre planquée quelque part qui se fait à vide.
Et le fait que enp0s25 soit un répertoire ou un fichier n'a strictement aucune importance, basename ne voit que des chaines de caractères.

Hors ligne

#14 Le 01/05/2019, à 19:46

diesel

Re : [LAISSÉ TOMBER] Message bizarre

Ben...,

Un grep "basename" sur le fichier du script ne m'en donne qu'un.

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 01/05/2019, à 19:47)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#15 Le 01/05/2019, à 19:49

Nuliel

Re : [LAISSÉ TOMBER] Message bizarre

Peux tu lancer le script avec

 bash -x script.sh

ça donnera peut être une piste sur le problème

Hors ligne

#16 Le 02/05/2019, à 08:22

diesel

Re : [LAISSÉ TOMBER] Message bizarre

Naziel a écrit :

Peux tu lancer le script avec

 bash -x script.sh

ça donnera peut être une piste sur le problème

jean-marie@serveur:~$ sudo bash -x script.sh
[sudo] password for jean-marie: 
++ basename /sys/bus/pci/devices/0000:00:19.0/net/enp0s25
+ interface=enp0s25
...

Et c'est tout.

En fait, si je lance le script seul

sudo ./script.sh

je n'ai aucun message de retour.

Alors que si je le lance à partir du script "mon_service" contenu dans le répertoire "/etc/init.d" qui contient

...
stop) # does nothing
    ;;
reload)
    /home/jean-marie/script.sh
    log_end_msg $?
    ;;
*)
    echo "Usage: $SCRIPTNAME {start|reload}" >&2
    exit 3
    ;;
esac

et que je le lance par

sudo service mon_service reload

alors, là, j'ai le message d'erreur "basename".

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 02/05/2019, à 08:38)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#17 Le 02/05/2019, à 14:09

bruno

Re : [LAISSÉ TOMBER] Message bizarre

Donne ton script en entier (en particulier le Shebang). Idem pour le script d'init (on ne sait pas ce que fait la fonction log_end_msg).
Et l'utilisation de scripts dans init.d doit être abandonnée au profit de services systemd.

#18 Le 02/05/2019, à 15:45

LeoMajor

Re : [LAISSÉ TOMBER] Message bizarre

l'expansion de * se fait avant l'injection dans la commande basename
en prévision

basename ~/Téléchargements/* || basename -a ~/Téléchargements/*  2>/dev/null

----
sinon pour ton histoire de pci ; classe pci 02 (réseaux)
par exemple:

:~$ lspci -nnv | awk '/\[02..\]/' 
01:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. RTL8192EE PCIe Wireless Network Adapter [10ec:818b]
1e:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)
:~$ hw=($(lspci -nnv | awk '/\[02..\]/ {print $1}' ))
:~$ tmp=$(for h in "${!hw[@]}"; do find /sys/devices -regex "\/sys\/devices\/.*${hw[$h]}.*\/net\/.*\/uevent" -type f -exec bash -c "echo -n \"${hw[$h]},\"; strings -s ","  {}" \; ; echo ; done)
:~$ tmp=$(awk -F, '{match($0,/.*INTERFACE=([a-z0-9+]+)/,p); print $1,p[1] }'  <<<"$tmp")
:~$ ~$ echo "$tmp"
01:00.0 wlp1s0
1e:00.0 enp30s0
:~$ declare -A net
:~$ while read pci int ; do test -n "$int" && net["$int"]="$pci" ; done <<<"$tmp
:~$ for n in "${!net[@]}"; do echo "$n,${net[$n]}"; done
wlp1s0,01:00.0
enp30s0,1e:00.0

cependant pour bien faire les choses, il faut faire la même chose avec l'usb(wifi par exemple) car l'usb est une sous classe pci et déductible aussi de udevadm. Si cela t'intéresse, tu fais signe.

Hors ligne

#19 Le 02/05/2019, à 16:15

melixgaro

Re : [LAISSÉ TOMBER] Message bizarre

Bonjour,

De toute façon, basename se fiche de l'existence du fichier

$ basename /chemin/perdu/sans/fichier/*
*

Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#20 Le 02/05/2019, à 16:19

kamaris

Re : [LAISSÉ TOMBER] Message bizarre

melixgaro a écrit :

Bonjour,

De toute façon, basename se fiche de l'existence du fichier

$ basename /chemin/perdu/sans/fichier/*
*

Pas forcément, cf. l'intervention de pingouinux en #2. (d'où l'importance de savoir qui exécute quoi et comment comme le demande bruno en #17)

Dernière modification par kamaris (Le 02/05/2019, à 16:22)

Hors ligne

#21 Le 02/05/2019, à 16:31

melixgaro

Re : [LAISSÉ TOMBER] Message bizarre

ah oui, en effet, donc l'exemple complet

$ shopt -s nullglob
$ shopt nullglob
nullglob       	on
$ basename /chemin/perdu/sans/fichiers/*
basename: missing operand
Try 'basename --help' for more information.
$ shopt -u nullglob
$ shopt nullglob
nullglob       	off
$ basename /chemin/perdu/sans/fichiers/*
*

Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#22 Le 02/05/2019, à 22:19

diesel

Re : [LAISSÉ TOMBER] Message bizarre

melixgaro a écrit :

ah oui, en effet, donc l'exemple complet

$ shopt -s nullglob
$ shopt nullglob
nullglob       	on
$ basename /chemin/perdu/sans/fichiers/*
basename: missing operand
Try 'basename --help' for more information.
$ shopt -u nullglob
$ shopt nullglob
nullglob       	off
$ basename /chemin/perdu/sans/fichiers/*
*

Certes...

Sauf que chez moi, dans tous les cas, le "basename /chemin/qui/va/bien/*" donne bien un résultat (enp0s25) ; voir mon post #16.

Donc, les histoires de "/chemin/perdu/sans/fichier/*"...

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 02/05/2019, à 22:36)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#23 Le 02/05/2019, à 22:30

diesel

Re : [LAISSÉ TOMBER] Message bizarre

bruno a écrit :

Donne ton script en entier (en particulier le Shebang). Idem pour le script d'init (on ne sait pas ce que fait la fonction log_end_msg).
Et l'utilisation de scripts dans init.d doit être abandonnée au profit de services systemd.

Ben..., le début du script, c'est

#! /bin/sh

# Author: Jean-Marie Delapierre

#-----------------------------------------------------------------------------------#
# Interfaces names                                                                  #
#-----------------------------------------------------------------------------------#

interface=$(basename /sys/bus/pci/devices/0000:00:19.0/net/*)
interface2=$(ip token | cut -d" " -f4 | grep -vE "^w.*|$interface")

...

Pour ce qui est du script d'init, il a été écrit à partir du squelette (fichier skeleton) disponible dans le répertoire /etc/init.d (ubuntu server 16.04).

La fonction log_end_msg est fournie par le fichier /lib/lsb/init-functions

Et j'ai bien noté que pour la nouvelle version du serveur sous ubuntu 18.04, le lancement se fera via systemd (j'avais déjà un mon_service.service en 16.04).

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 02/05/2019, à 22:33)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#24 Le 02/05/2019, à 23:33

melixgaro

Re : [LAISSÉ TOMBER] Message bizarre

kamaris a écrit :
melixgaro a écrit :

Bonjour,

De toute façon, basename se fiche de l'existence du fichier

$ basename /chemin/perdu/sans/fichier/*
*

Pas forcément, cf. l'intervention de pingouinux en #2. (d'où l'importance de savoir qui exécute quoi et comment comme le demande bruno en #17)

En fait, c'est le globbing qui provoque l'erreur dans le cas où nullglob est activé car le globbing ne renvoie alors rien et basename se retrouve sans argument. Donc je maintiens que basename se fiche de l'existence du chemin. Comme dans cet exemple qui fonctionnera avec ou sans nullglob (car pas de charactère * à remplacer)

$ basename /chemin/perdu/sans/fichiers/
fichiers

Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#25 Le 02/05/2019, à 23:40

kamaris

Re : [LAISSÉ TOMBER] Message bizarre

melixgaro a écrit :

Donc je maintiens que basename se fiche de l'existence du chemin.

Oui, bien entendu, ou comme je le disais en #13

kamaris a écrit :

basename ne voit que des chaines de caractères.

Hors ligne