Criar mapa network_iface_name - endereço IPv4

4

Gostaria de implementar um script bash que cria um mapeamento entre os nomes das placas de rede (ou interfaces) no meu computador e seu endereço IP (no formato CIDR, se possível).

O objetivo é ter algo como uma matriz associativa ou um arquivo semelhante a:

lo: "127.0.0.1/8"
eth0: "192.168.1.123/24"
br-priv: ""      # <-- No IP assigned
wlan0: "10.42.0.10/24"

Eu tenho os comandos ifconfig e ip disponíveis, mas a análise de suas saídas é um pouco complicada, porque o endereço IP e o nome da interface não aparecem na mesma linha, então eu teria que encontrar o endereço IP da interface e, em seguida, reverter para encontrar o nome da rede, ou vice-versa.

Existe alguma outra maneira de encontrar os endereços IP das minhas interfaces?

Eu tenho todos os nomes de interfaces (como nomes de diretório) em /sys/class/net/

root@borrajax:~# ls /sys/class/net/
br-priv/   eth0/    lo/    mon0/   wlan0/

Mas não consegui encontrar o IP deles nesses diretórios. Fazer isso seria ótimo, porque eu poderia simplesmente percorrer o diretório, recuperar o nome do diretório e depois ler o IP de algum outro arquivo.

O objetivo é rodar em um sistema embarcado rodando OpenWRT , mas uma solução para um sistema baseado em Debian pode ser adequada. A versão do meu bash é 4.2.28, apenas no caso.

    
por BorrajaX 07.07.2014 / 15:40

1 resposta

5

Use a opção "-o" de ip :

ip  -o addr  | sed -e 's/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/: ""/;t;s/^[0-9]*: \([^ :]*\).*/: ""/g' | sort -r | sort -u -t: -k1,1

O resultado deve estar no seu caso:

br-priv: "" 
eth0: "192.168.1.123/24"
lo: "127.0.0.1/8"
wlan0: "10.42.0.10/24"

O comando imprime apenas um IPv4 por dispositivo de rede (é possível configurar vários endereços IP na mesma interface).

Explicações:

A expressão sed

s/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/: ""/;

substitui 1: lo inet 127.0.0.1/8 brd 255 [...] por lo: "127.0.0.1/8"

t;

pula para o final se isso puder ser feito (= um endereço IPv4 foi encontrado), caso contrário:

s/^[0-9]*: \([^ :]*\).*/: ""/

substituir linhas sem endereços IPv4, por exemplo 1: lo inet6 ::1/128 [...] com lo: "" .

Todas as linhas são impressas automaticamente (sem -n flag).

O comando sort -r classifica agora a linha reversa. As linhas com endereços IPv4 (por exemplo, lo: "127.0.0.1/8" ) são, em todos os casos, antes das linhas sem ( lo: "" ).

O comando sort -u -t: -k1,1 aplica classificação única ao primeiro campo (os nomes da interface, o separador é definido como : ). Em nosso exemplo, apenas a linha " lo: "127.0.0.1/8" " sobrevive como ocorre primeiro (devido à classificação anterior).

    
por 07.07.2014 / 16:24