#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
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
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
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
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
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
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
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
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
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
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
Donc je maintiens que basename se fiche de l'existence du chemin.
Oui, bien entendu, ou comme je le disais en #13
basename ne voit que des chaines de caractères.
Hors ligne