Encontre o endereço de transmissão IPv4 de um dispositivo

1

Eu preciso determinar o endereço de broadcast IPv4 de um dispositivo (se houver) com um script de shell. Se houver vários, escolha um (por exemplo, primeiro conforme ordenado por / sbin / ip).

Eu tenho uma solução, mas eu não gosto porque ela faz suposições sobre o formato de saída / sbin / ip, e eu não sei quão estável é o formato de saída entre os sistemas.

DEV=eth0
BROADCAST='ip address show $DEV | grep 'inet .* brd ' | head -1 | sed -e 's/^.* brd \([0-9\.]*\) .*$//''
echo $BROADCAST

Não há algo em / proc / ou / sys / que eu possa simplesmente criar um gato? Porque não?

Eu preciso que a solução funcione de forma confiável, pelo menos em toda a família Debian / Ubuntu Linux.

Edit: Esta não é uma questão sobre magia sed / awk / grep. A questão é:

  • Posso esperar que ip (de ifconfig ) entre as arquiteturas e os sabores do Linux tenham o mesmo formato de saída, de modo que eu possa analisar com segurança, por exemplo? um endereço de broadcast IPv4 da interface dele?
  • Se não: existe outra maneira de gerar um endereço de broadcast IPv4 da interface de uma forma mais previsível?
  • Por que não há / proc / sys / net / ipv4 / conf / eth0 / {endereço, máscara, transmissão} que eu possa simplesmente cat ?
por Nils Toedtmann 01.06.2015 / 20:04

4 respostas

6

Can i expect ip (of ifconfig for that matter) across architectures and Linux flavours to have the same output format, such that i can reliably parse

Eu não faria. Embora ifconfig esteja morto e, portanto, não deva mudar muito, houve pequenas alterações aplicado por distros para manter essa ferramenta obsoleta funcional, já que muitas pessoas não parecem querer aprender a fazer a troca. A saída de ip realmente não é ótima para analisar o IMO.

If not: is there another way to output an interface's IPv4 broadcast address in an more predictable manner?

Se eu fosse você, provavelmente procuraria instalar e usar uma ferramenta como o facter para fazer o trabalho para voce. Eu não acho que isso lhe dá o endereço de transmissão diretamente, mas deve ser trivial pegar o endereço / máscara de rede e executar a matemática para obter o endereço de transmissão.

Why is there no /proc/sys/net/...

O iproute2 se conecta ao kernel através do soquete NETLINK . O Ifconfig usa o método ioctl que está obsoleto. Se você deseja obter as informações corretas sem coletar a saída de algum programa de espaço do usuário ou instalar algo, será necessário usar uma dessas APIs.

Se você quiser, pode fazer algo como strace ip addr show ou strace ifconfig para ver a saída exata do que essas ferramentas estão fazendo para recuperar os valores.

Não sei a história do porquê, mas isso não é uma questão para este site. É assim que as coisas são. Se você quiser 'por que' vá falar com os desenvolvedores do kernel.

    
por 02.06.2015 / 02:48
1

Para o Redhat, o endereço IP de transmissão é calculado automaticamente usando ipcalc - AFAIK, não há arquivos de configuração que o contenham. Também pode ajudar: Red Hat Docs - Arquivos de configuração de interface

    
por 01.06.2015 / 23:06
0

Você já considerou dados de roteamento. Este script deve retornar o endereço de broadcast da interface da Internet:

ipcalc $(route | awk '$2 ~ /\*/ {print $1 "/" $3}') | \
    awk '/^Broadcast/ {print $2}'

Ou este usando ip route pode retornar vários endereços.

for x in $(ip route show | awk '/^[1-9]/ {print $1}'); do 
    ipcalc $x | awk '/^Broadcast/ {print $2}'; 
done

ipcalc pode não ser instalado por padrão.

    
por 02.06.2015 / 03:38
-1

awk é seu amigo.

ip a s dev $DEV | awk '/inet / {print $4}'
    
por 01.06.2015 / 20:24