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?
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')"
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