Como usar o ifconfig para mostrar apenas a interface ativa

22

Por padrão, ifconfigirá me mostrar todas as interfaces disponíveis, mas e se eu apenas quiser exibir activeoutras? Como, en0apenas abaixo.

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

Aviso ifconfig en0não vai satisfazer, en0nem sempre é o ativo;)

Estou executando o Mac OS X.

qweruiop
fonte
2
Seu sistema operacional seria algo importante a ser mencionado, pois as ifconfigimplementações variam. Além disso, por que o uso é ifconfigum requisito? Qual é o seu objetivo final?
Jordanm # 1/13
Olá @jordanm, meu objetivo é obter o endereço IP da interface atualmente ativa, geralmente uma interface Ethernet sem fio ou com fio.
Qweruiop 01/12/13
como você define a interface ativa?
AnonymousLurker

Respostas:

24

Para obter uma descrição completa de todos os serviços ativos, tente:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

Esse regex simples deve filtrar apenas interfaces ativas e todas as suas informações. Sugiro que você coloque um alias para isso no seu arquivo ~ / .profile ou ~ / .bash_profile (talvez esteja ativo?)

Para obter apenas o nome da interface (útil para scripts), use:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

Você precisa instalar o pcregrep para que isso funcione. Está na MacPorts no pacote pcre. Como alternativa, isso deve funcionar com o GNU grep usando em grep -Pzovez de, pcregrep -M -omas com o restante, mas não testei isso.

g.rocket
fonte
2

Se você quiser apenas imprimir a “entrada” se ela contiver status: active, poderá usar algo como este programa awk como um filtro para a saída ifconfig :

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

Quando cada “entrada” iniciar (uma linha está vazia ou não inicia com uma guia), comece a salvar a entrada em um buffer. Anexe a este buffer quaisquer linhas subsequentes que iniciem com uma guia. Preste atenção na corda mágica status: active; se uma linha como essa foi vista, imprima o buffer (a “entrada anterior”) quando uma nova “entrada” iniciar (ou a entrada terminar).

Salve o texto do programa acima em um arquivo e use-o assim:

ifconfig -a | awk -f /path/to/file

Ou, se você for chmod +xo arquivo, poderá simplificá-lo um pouco:

ifconfig -a | /path/to/file
Chris Johnsen
fonte
2

Se você não é adverso a alguns scripts de bash, pode fazer o seguinte:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

Isso listará as interfaces de rede ativas. Testado no Mac OS X 10.13.

O bom é que você não precisa instalar nada. Basta executar o acima em um terminal.

Claudio
fonte
Essa deve ser a melhor resposta, no entanto ifconfig -lu, não funcionará no debian. Mas a OP está usando o MacOS de qualquer maneira, portanto, essa solução funcionaria em sistemas com BSDs ifconfig. Eu postei outra resposta abaixo, que faz o mesmo sem usarifconfig -lu
Rakib Fiha 28/11
1

Lendo seus comentários e perguntas, parece que você realmente deseja obter apenas as interfaces que possuem um endereço IP atribuído a elas.

Você pode fazer isso rapidamente com ifconfige grep.

Executando o comando:

ifconfig | grep 'Link\|inet'

Deve produzir algo semelhante a:

eth0 Encap do link: Ethernet HWaddr 00: 11: 22: 33: 44: 55
Encaminhamento de link eth1: Ethernet HWaddr 00: 11: 22: 33: 44: 66  
          endereço inet: 192.168.0.8 Bcast: 192.168.0.255 Máscara: 255.255.255.0
lo Encap do link: Loopback local  
          inet addr: 127.0.0.1 Máscara: 255.0.0.0

Isso mostraria cada linha com um nome de interface e IP e se eles tivessem um.

Algumas mágicas mais específicas do REGEX podem fornecer exatamente o que você precisa.

Nathan McCoy
fonte
2
Obrigado, mas onde está a activeconsideração?
Qweruiop 01/12/13
se houver uma linha após a interface, ela possui um endereço IP atribuído a ela e, pelo que entendi, ele se constituiria em 'ativo'.
Nathan McCoy
1

Eu gostaria que a pergunta fosse um pouco mais clara. Assumindo que Active interface only, você pretendia mostrar apenas o nome das interfaces ativas (no meu caso UPe RUNNINGstatus active) sem outros detalhes. Então tente o seguinte:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

A saída seria semelhante a:

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

Ajuste o grep -vcampo e adicione mais interfaces indesejadas, como loopback-> loetc, se necessário.

Agora, se você quiser e precisaria verificar se as interfaces encontradas estão ativas no momento. Então podemos simplesmente passá-los como argumento para o exemplo ifconfig <interface>abaixo:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

Simplificando ainda mais e implementando-o em uma função:

checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}

A execução desta função retornará apenas as interfaces ativas. No meu caso:

awdl0
en0
llw0
Rakib Fiha
fonte
0

A seguir serão impressos apenas as interfaces configuradas para ter um IP

ifconfig | grep "inet.*broadcast"
Yousif Atique
fonte
0

Obtenha apenas o MAC da interface ATIVA:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
Alex P
fonte
Observe que o MacOS não possui ippor padrão; você precisa do HomeBrew para isso e execute brew install iproute2macuma vez. O código fonte está em github.com/brona/iproute2mac
Jeroen Wiert Pluimers
-1
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Como funciona:

  • ifconfig
  • Grep para linhas que contêm "inet addr"
    • Essas linhas contêm os IPs.
  • Grep para linhas que não contêm "127.0.0.1"
    • Geralmente não nos importamos com o host local.
    • -v é grep invertido
  • Nas linhas restantes, remova o "Bcast"
  • Corte o campo 2 usando ":" como delimitador
    • Imprime a resposta.
ohlemacher
fonte
-1
ifconfig en0 | grep status

Isso mostrará o status da conexão ethernet en0

swartenfagen
fonte