#1 Le 23/04/2019, à 12:18
- diesel
[RESOLU, on va dire] On doit bien pouvoir faire plus simple
je suis en train de me monter un routeur et j'ai besoin dans un script d'utiliser les caractéristiques des interfaces réseau.
J'ai une interface qui est réalisée à partir du circuit ethernet de la carte mère (son adresse PCI est fixe et connue)
L'autre interface est réalisée avec un media amovible (PCcard ou USB) et est susceptible de changer (pas en permanence, mais si elle tombe en panne...).
Pour identifier mes interfaces et leurs caractéristiques, j'ai écrit le code suivant qui fonctionne
interface_network_1=$(basename /sys/devices/pci0000:00/0000:00:19.0/net/*)
interface_network_2=$(ip -o link | cut -d " " -f 2 | sed s/:$// | grep -vE "lo|$interface_network_1")
ip_network_1=$(ip -o -4 addr show "$interface_network_1" | sed 's/ */ /g' | cut -d " " -f 4 | sed "s/[0-9][0-9]*\//0\//")
ip_interface_network_2=$(ip -o -4 addr show "$interface_network_2" | sed 's/ */ /g' | cut -d " " -f 4 | cut -d "/" -f 1)
Ce qui me donne
jean-marie@routeur$ echo $interface_network_1
enp0s25
jean-marie@routeur$ echo $interface_network_2
enp22s0
jean-marie@routeur$ echo $ip_network_1
192.168.1.0/24
jean-marie@routeur$ echo $ip_interface_network_2
192.168.2.1
jean-marie@routeur$
Mais il doit certainement y avoir plus simple pour arriver au même résultat.
Les dieux du bash : à vos claviers.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 24/04/2019, à 16:20)
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 23/04/2019, à 12:38
- pingouinux
Re : [RESOLU, on va dire] On doit bien pouvoir faire plus simple
Bonjour,
Pour voir s'il est possible de simplifier, il faudrait connaître les retours de :
ls /sys/devices/pci0000:00/0000:00:19.0/net/*
ip -o link
ip -o -4 addr show "$interface_network_1"
ip -o -4 addr show "$interface_network_2"
Hors ligne
#3 Le 23/04/2019, à 12:49
- diesel
Re : [RESOLU, on va dire] On doit bien pouvoir faire plus simple
C'est parti !
jean-marie@routeur$ ls /sys/devices/pci0000:00/0000:00:19.0/net
enp0s25
jean-marie@routeur$ ip -o link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1\ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000\ link/ether 00:1e:37:18:68:b4 brd ff:ff:ff:ff:ff:ff
3: enp22s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000\ link/ether 00:06:29:92:ac:55 brd ff:ff:ff:ff:ff:ff
jean-marie@routeur$ ip -o -4 addr show "$interface_network_1"
2: enp0s25 inet 192.168.1.1/24 brd 192.168.1.255 scope global enp0s25\ valid_lft forever preferred_lft forever
jean-marie@routeur$ ip -o -4 addr show "$interface_network_2"
3: enp22s0 inet 192.168.2.1/24 brd 192.168.2.255 scope global enp22s0\ valid_lft forever preferred_lft forever
jean-marie@routeur$
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 23/04/2019, à 12:49)
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 23/04/2019, à 13:10
- diesel
Re : [RESOLU, on va dire] On doit bien pouvoir faire plus simple
Pour la deuxième ligne, j'ai trouvé, je crois, mieux
interface_network_2=$(basename -a /sys/class/net/* | grep -vE "lo|$interface_network_1")
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
#5 Le 23/04/2019, à 13:15
- pingouinux
Re : [RESOLU, on va dire] On doit bien pouvoir faire plus simple
Je ne suis pas sûr que ça simplifie beaucoup (première ligne inchangée) .
interface_network_1=$(basename /sys/devices/pci0000:00/0000:00:19.0/net/*)
interface_network_2=$(ip -o link | awk '{sub(":$","",$2);if($2!="lo" && $2!='\"$interface_network_1\"') print $2}'")
ip_network_1=$(ip -o -4 addr show "$interface_network_1" | awk '{sub("[^./]+/","0/",$4);print $4}')
ip_interface_network_2=$(ip -o -4 addr show "$interface_network_2" | awk '{sub("/.+","",$4);print $4}')
Hors ligne
#6 Le 23/04/2019, à 13:20
- diesel
Re : [RESOLU, on va dire] On doit bien pouvoir faire plus simple
Merci Pingouinux.
Pour la deuxième ligne, je crois que j'ai trouvé mieux (post #4)
Et "awk", je ne m'y suis jamais mis et ça me fait peur.
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
#7 Le 23/04/2019, à 14:22
- diesel
Re : [RESOLU, on va dire] On doit bien pouvoir faire plus simple
Bon, j'ai fait (un peu) mieux
interface_network_1=$(basename /sys/bus/pci/devices/pci0000:00/0000:00:19.0/net/*)
interface_network_2=$(basename -a /sys/class/net/* | grep -vE "lo|$interface_network_1")
ip_network_1=$(ip -br -4 addr show "$interface_network_1" | grep -oE "([0-9]+\.){3}[0-9]+.*" | sed "s/[0-9][0-9]*\//0\//")
ip_interface_network_2=$(ip -br -4 addr show "$interface_network_2" | grep -oE "([0-9]+\.){3}[0-9]+")
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 24/04/2019, à 16:22)
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
#8 Le 02/05/2019, à 08:15
- bruno
Re : [RESOLU, on va dire] On doit bien pouvoir faire plus simple
Je ne comprends pas pourquoi tu vas chercher un nom via l'interface PCI, tous les noms d'interfaces réseau sont disponibles sous forme de liens symboliques dans /sys/class/net. Une simple boucle permet de récupérer les nom et les IPv4 :
#!/bin/bash
function get_interfaces_names () {
for name in /sys/class/net/* ; do
interface_name=$(/usr/bin/basename "${name}")
ipv4=$(ip addr show dev "${interface_name}" | awk '/inet / {print $2}' | cut -d'/' -f1)
echo "${interface_name}" : "${ipv4}"
done
}
get_interfaces_names