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 23/04/2019, à 13: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. wink smile smile smile

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 24/04/2019, à 17: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, à 13: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, à 13: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, à 13: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, à 14: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, à 14: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, à 14: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, à 15: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, à 17: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, à 09: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

Hors ligne