Script para definir o endereço IP conectado a uma interface para uma variável de shell

3

Eu quero escrever um script para definir o endereço IP do dispositivo conectado a uma interface como "eth0" para uma variável. Eu posso obter o endereço IP por este comando:

arp -i eth0 -a

A saída do comando acima é:

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

Eu quero adicionar um script ao arquivo .bashrc para definir o endereço IP da saída do comando acima para a variável $RASPBERRY_IP e usá-lo em outro script. Alguma ideia de como fazer isso?

    
por Mehrdad 11.08.2015 / 09:57

2 respostas

5

arp manipula as entradas no cache ARP do kernel, você provavelmente obterá muitas entradas (depende do tamanho da LAN). Como você está interessado apenas nos endereços IP, use a opção -n para que arp mostre endereços numéricos em vez de nomes de host primeiro.

Além disso, você normalmente obtém muitos endereços IP dependendo do tamanho da sua LAN, então você provavelmente deve usar uma matriz em vez de uma variável para armazenar os endereços IP.

O seguinte comando retira os endereços IP do cache arp e os coloca no array addrs :

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

Aqui está um exemplo:

$ 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

Você também pode usar sed :

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

Os endereços IP serão mostrados na primeira coluna, estamos extraindo a primeira coluna por [0-9][^ ]* . ^[0-9] aqui é para garantir que a linha comece com um numérico, então a primeira linha contendo o cabeçalho é descartada da saída.

Em uma nota diferente, se você tiver apenas uma entrada, poderá salvá-la em uma variável:

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

Ou

addr="$(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*//p')"
    
por heemayl 11.08.2015 / 11:37
3

Aqui está outra ideia usando awk

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

Exemplo

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

ou com uma variável

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

Para obter um índice específico sem uma matriz

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

Para obter o valor máximo para idx

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

Exemplo

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