web-dev-qa-db-fra.com

Script pour définir l'adresse IP connectée à une interface sur une variable Shell

Je veux écrire un script pour définir l'adresse IP du périphérique connecté à une interface telle que "eth0" à une variable. Je peux obtenir l'adresse IP par cette commande:

arp -i eth0 -a

La sortie de la commande ci-dessus est:

? (10.42.0.38) at b8:27:eb:07:5d:60 [ether] on eth0

Je souhaite ajouter un script au fichier .bashrc pour définir l'adresse IP de la sortie de la commande ci-dessus sur la variable $RASPBERRY_IP et l'utiliser dans un autre script. Une idée comment faire ça?

3
Mehrdad

arp manipule les entrées dans le cache ARP du noyau, vous allez probablement en obtenir beaucoup (dépend de la taille du réseau local). Comme vous ne vous intéressez qu'aux adresses IP, vous devez utiliser l'option -n pour que arp affiche d'abord les adresses numériques au lieu des noms d'hôte.

En outre, vous obtiendrez généralement un grand nombre d’adresses IP en fonction de la taille de votre réseau local. Vous devriez donc probablement utiliser un tableau au lieu d’une variable pour stocker les adresses IP.

La commande suivante extrait les adresses IP du cache arp et les place dans le tableau addrs:

addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )

Voici un exemple :

$ addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )

$ echo "${addrs[0]}"  ## First IP
192.168.2.27

$ echo "${addrs[2]}"  ## Second IP
192.168.1.1

$ echo "${#addrs[@]}"  ## Number of IP addresses
37

Vous pouvez aussi utiliser sed:

addrs=( $(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*/\1/p') )

Les adresses IP seront affichées dans la première colonne, nous extrayons la première colonne par [0-9][^ ]*. ^[0-9] vous devez vous assurer que la ligne commence par un caractère numérique afin que la première ligne contenant l'en-tête soit supprimée de la sortie.


Sur une note différente, si vous n'avez qu'une seule entrée, vous pouvez l'enregistrer dans une variable:

addr="$(arp -ni eth0 | grep -o '^[0-9][^ ]*')"

Ou

addr="$(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*/\1/p')"
5
heemayl

Voici une autre idée utilisant awk

arp -ni eth0 | awk 'NR>1 {print $1}'

Exemple

$ arp -ni eth0 | awk 'NR>1 {print $1}'
192.168.20.3
192.168.20.1
192.168.20.11

ou avec une variable

$ addresses=$(arp -ni eth0 | awk 'NR>1 {print $1}')
$ echo $addresses
192.168.20.3 192.168.20.1 192.168.20.11

Pour obtenir un index spécifique sans tableau

$ arp -ni eth0 | awk -v idx=3 'NR>1 && NR==idx+1 {print $1}'
192.168.20.11

Pour obtenir la valeur maximale de idx

arp -ni eth0 | awk 'NR>1 {idx_max++} END {print idx_max}'

Exemple

$ idx_max=$(arp -ni eth0 | awk 'NR>1 {idx_max++} END {print idx_max}')
$ echo $idx_max
3
3
A.B.