Listar apenas os nomes de dispositivos de todas as interfaces de rede disponíveis


21

Quero obter uma lista de todos os nomes de dispositivos de rede disponíveis no meu servidor Linux. Eu percebi isso

ifconfig

faria o trabalho, no entanto, o ifconfig produz bastante resultado:

eth0      Link encap:Ethernet  Hardware Adresse 08:00:27:fc:5c:98  
          inet Adresse:192.168.2.222  Bcast:192.168.2.255  Maske:255.255.255.0
          inet6-Adresse: fe80::a00:27ff:fefc:5c98/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:329 errors:0 dropped:0 overruns:0 frame:0
          TX packets:177 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:41496 (40.5 KiB)  TX bytes:32503 (31.7 KiB)

eth1      Link encap:Ethernet  Hardware Adresse 08:00:27:e9:35:7d  
          [...]

eth2      Link encap:Ethernet  Hardware Adresse 08:00:27:ff:db:fe  
          [...]

lo        Link encap:Lokale Schleife  
          [...]

O que eu quero alcançar é uma lista como

eth0
eth1
eth2
lo

ou melhor ainda

eth0
eth1
eth2

Suponho que isso possa ser feito por uma combinação de "gato", "sed" e "grep", mas simplesmente não tenho idéia de como remover as informações desnecessárias.

Respostas:


17

Faça uma tentativa:

ifconfig -a | sed 's/[ \t].*//;/^$/d'

Isso omitirá lo:

ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'

Obrigado dennis, isso funcionou como um encanto ^^. Perfekt. Expressões Regulares são realmente algo que eu deveria olhar para ^^
ftiaronsem

Sei que o Linux e o BSD geralmente contêm *nixutilitários diferentes , mas é lamentável que essa solução não funcione em um Mac :( #
24516

ifconfigestá obsoleto, use em ipvez disso
pstanton

Isso parece funcionar no OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
Pausado até novo aviso.

22

Outra alternativa seria:

ip -o link show | awk -F': ' '{print $2}'

Ou talvez:

ls /sys/class/net

using ls /sys/class/neté uma solução melhor nos /etc/local.dscripts em openrc- as sedsoluções acima acabam com um extra :no final de cada interface quando executadas /etc/init.d/local(mas não quando o script é executado diretamente).
Stuart Cardall

+1 para -o- não sabia disso #
Patryk

16

Basta usar / sys / class / net e remover o caminho:

$ basename -a /sys/class/net/*
eth0
eth1
lo
ppp0
tun0

6

Tente o seguinte:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 extrai os 8 primeiros caracteres de cada linha
  • sort classifica as linhas
  • uniq -u imprime apenas linhas únicas que removerão as linhas em branco das linhas de descrição que possuem apenas espaços nos oito primeiros caracteres

Isso funciona em duas máquinas Linux que eu tentei, mas no meu MacBookPro (OS X 10.6.4), ifconfiguse guias em vez de espaços, por isso é um pouco mais complicado:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand converte guias em espaços
  • awk -F: '{print $1;}' imprime o primeiro campo antes de dois pontos.

Muito obrigado, especialmente pela resposta muito detalhada que explica os parâmetros usados. Se eu tiver um problema semelhante no futuro, sei em qual post procurar ;-). Infelizmente não estava cortando "lo", então a resposta aceita vai para dennis. Mas esta é realmente uma resposta muito útil, obrigado :-)
ftiaronsem

adiciona | grep -v lo:-)
Doug Harris

4
ls /sys/class/net/
eth0  eth1  eth2  lo

ou se você precisar apenas de eth *

ls /sys/class/net/eth*
eth0
eth1
eth2

3

Usando /syssistema de arquivos:

basename -a $(ls /sys/devices/**/net/* -d)

Usando ip e Perl:

ip -o l|perl -lane'$F[1]=~s/://g;print $F[1]'

1

Aqui está uma maneira de extrair os nomes de interface da ifconfigsaída:

ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p'

Se você deseja excluir determinados nomes, uma maneira é filtrar ainda mais com grep:

ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo

Se você deseja excluir mais nomes, adicione mais -e fooao grepcomando


Sua solução funciona igualmente bem como a de dennis. Infelizmente eu não posso aceitar dois posts, então o dennis foi simplesmente mais rápido. Mas, no entanto, obrigado, especialmente pela sua explicação grep.
ftiaronsem

1

para imprimir apenas a primeira coluna:

netstat -a | awk '{print $1}'

você pode incorporar outras regras no awk para adicionar ou remover entradas, conforme necessário.

EDIT: o mesmo acontece com ifconfig (como Doug apontou)

ifconfig | awk '{print $1}'

Este é um exemplo excluindo a interface 'lo'

ifconfig | awk '{if ($1 != lo) print $1}'

Isso não vai funcionar. awkirá ignorar o espaço em branco à esquerda e imprimir a primeira palavra em cada linha subseqüente.
Doug Harris

Infelizmente, isso de fato não está funcionando, sofrendo o problema exato que Doug apontou. Mas obrigado pela ajuda, no entanto, eu realmente aprecio você ajudando um novato como eu.
ftiaronsem

1
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'

fornece

lo:
eth0:
eth1:
eth2:

como saída


1

Embora exista uma solução aceita, gostaria de apresentar minha solução a isso.

Eu tenho várias interfaces virtuais e gostaria de obter uma lista, utilizável em vários scripts bash.

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.137  netmask 255.255.255.192  broadcast 11.22.33.191
        inet6 fe80::a00:27ff:fe8c:6bd3  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)
        RX packets 2969136  bytes 2394432908 (2.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1378821  bytes 358960701 (342.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.189  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.190  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

eth0:3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.180  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 673768  bytes 277972236 (265.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 673768  bytes 277972236 (265.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Não estou interessado em loopback, pois sei que está lá :)

Este one-liner faz o trabalho:

ifconfig | egrep '^eth' | cut -f 1-2 -d ':' | cut -f 1 -d ' '| pcregrep -o1 "(((eth\d)(:\d))|(eth\d))"

Produz uma saída como:

eth0
eth0:1
eth0:2
eth0:3

Desfrutar.


1

Toda a solução acima funciona bem. Ainda assim, você pode tentar isso

ifconfig | grep HW | cut -c 1-6

Como o loloopback não está atribuído a um endereço HW, ele não será exibido.

Resultado -

root @ glum: / home / amit # ifconfig | grep HW | cut -c 1-6
enp7s0
vmnet1
vmnet8
wlp6s0

1

A solução mais fácil está no man ifconfig (8)

man ifconfig (8) extract http://www.manpagez.com/man/8/ifconfig/ :

O sinalizador -l pode ser usado para listar todas as interfaces disponíveis no sistema, sem outras informações adicionais. O uso desse sinalizador é mutuamente exclusivo com todos os outros sinalizadores e comandos, exceto -d (apenas as interfaces de lista que estão inativas) e -u (apenas as interfaces de lista que estão ativas).

Portanto, para ter a lista, use:

ifconfig -l

Os nomes serão separados por um espaço, então você precisará usar sed para substituir esses espaços por \ n:

ifconfig -l | sed 's/ / /g'


1

Melhorado:

netstat -i | grep '^[a-z]' | awk '{print $1}' | grep -v 'lo'

11
Você provavelmente deveria fazer isso grep -v '^lo$'; seu comando atual excluirá o (exemplo hipotético) logicale as ridiculousinterfaces.
Scott

0

Nenhuma das soluções acima funcionou para mim, aqui está a minha solução:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. Listar todas as interfaces disponíveis
  2. Extraia apenas as linhas que contêm nomes de dispositivos (sem espaço no início)
  3. Remova a parte posterior não relacionada que é posterior ao primeiro espaço
  4. Excluir lointerface

Saídas:

eth0
eth0:1
wlan0

0

"ifcongif -l" deve fazer o trabalho. sua saída é assim "lo0 gif0 stf0 en0 ..." sem nova linha.

Encontrei-o em algum site, mas não consigo mais encontrá-lo. e ainda estou procurando o significado dessa bandeira "-l".


0

Às vezes, o nettools não está instalado por padrão. Então, eu gosto de usar comandos internos que têm mais garantia de serem encontrados em / bin, / usr / bin e / usr / sbin sem precisar se preocupar com pacotes pós-instalados.

endereço IP: mostre / manipule roteamento, dispositivos, roteamento de política e túneis (endereço)
grep: encontre um espaço e depois qualquer coisa depois de unitl:
cut: use (:) como delimitador e obtenha o campo 2
tr: exclua todos os espaços

$ ip addr | grep -E ': \ s. * ?:' | cut -d ":" -f 2 | tr-d ""

0

Testado no macOS, o seguinte funcionou. Eu precisava encontrar todas as interfaces que estavam UP. Isso se baseia na resposta de Dennis Williamson acima.

ifconfig -a | grep UP | sed 's/:.*//;/^$/d'


-1

ifconfig | grep flags | awk -F: '{print $1;}'


11
Você poderia, por favor, expandir e explicar o que isso faz? As respostas de uma linha geralmente não são um bom formato para o Superusuário.
Doktoro Reichard
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.