Répertorier uniquement les noms de périphériques de toutes les interfaces réseau disponibles


21

Je veux obtenir une liste de tous les noms de périphériques réseau disponibles sur mon serveur Linux. Je pensais que

ifconfig

ferait le travail, cependant ifconfig produit beaucoup de sortie:

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  
          [...]

Ce que je veux réaliser, c'est une liste comme

eth0
eth1
eth2
lo

ou encore mieux

eth0
eth1
eth2

Je suppose que cela peut être fait par une combinaison de "chat", "sed" et "grep", mais je n'ai tout simplement aucune idée de la façon de supprimer les informations inutiles.

Réponses:


17

Essayez ceci:

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

Cela omettra lo:

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

Merci dennis, cela a fonctionné comme un charme ^^. Perfekt. Les expressions régulières sont vraiment quelque chose que je devrais examiner ^^
ftiaronsem

Je me rends compte que Linux et BSD contiennent souvent des *nixutilitaires différents , mais il est regrettable que cette solution ne fonctionne pas sur un Mac :(
blong

ifconfigest déprécié, utilisez ipplutôt
pstanton

Cela semble fonctionner pour OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
pause jusqu'à nouvel ordre.

22

Une autre alternative serait:

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

Ou peut-être:

ls /sys/class/net

l'utilisation ls /sys/class/netest une meilleure solution dans les /etc/local.dscripts dans openrc- les sedsolutions ci-dessus se retrouvent avec un supplément :à la fin de chaque interface lors de l'exécution /etc/init.d/local(mais pas lorsque le script est exécuté directement).
Stuart Cardall

+1 pour -o- ne le savait pas
Patryk

16

Utilisez simplement / sys / class / net et supprimez le chemin:

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

6

Essaye ça:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 extrait les 8 premiers caractères de chaque ligne
  • sort trie les lignes
  • uniq -u imprime uniquement les lignes uniques qui supprimeront les lignes vides pour les lignes de description qui n'ont que des espaces dans leurs huit premiers caractères

Cela fonctionne sur deux machines Linux que j'ai essayées, mais sur mon MacBookPro (OS X 10.6.4), ifconfigutilise des tabulations au lieu d'espaces, c'est donc un peu plus compliqué:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand convertit les tabulations en espaces
  • awk -F: '{print $1;}' imprime le premier champ avant deux points.

Merci beaucoup, surtout pour la réponse très détaillée expliquant les paramètres utilisés. Si je vais avoir un problème similaire à l'avenir, je sais à quel poste regarder ;-). Malheureusement, il n'a pas coupé "lo", donc la réponse acceptée va à dennis. Mais c'est vraiment une réponse très utile, merci :-)
ftiaronsem

ajouter | grep -v lo:-)
Doug Harris

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

ou si vous n'avez besoin que d'eth *

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

3

Utilisation du /syssystème de fichiers:

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

Utiliser ip et Perl:

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

1

Voici une façon d'extraire les noms d'interface de la ifconfigsortie:

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

Si vous souhaitez exclure certains noms, une méthode consiste à filtrer davantage avec grep:

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

Si vous souhaitez exclure plus de noms, ajoutez-en plus -e fooà la grepcommande.


Votre solution fonctionne aussi bien que celle de Dennis. Malheureusement, je ne peux pas accepter deux postes, donc dennis était tout simplement plus rapide. Mais merci quand même, surtout pour votre explication grep.
ftiaronsem

1

pour simplement imprimer la première colonne:

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

vous pouvez incorporer d'autres règles dans awk pour ajouter ou supprimer des entrées selon vos besoins.

EDIT: il en va de même avec ifconfig (comme l'a souligné Doug)

ifconfig | awk '{print $1}'

Ceci est un exemple excluant l'interface 'lo'

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

Ça ne marchera pas. awkignorera le premier espace blanc et imprimera également le premier mot de chaque ligne suivante.
Doug Harris

Malheureusement, cela ne fonctionne pas en effet, souffrant du problème exact que Doug a souligné. Mais merci pour votre aide, néanmoins j'apprécie vraiment que vous aidiez un nouveau comme moi.
ftiaronsem

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

fournit

lo:
eth0:
eth1:
eth2:

en sortie


1

Même s'il existe une solution acceptée, je voudrais présenter ma solution à cela.

J'ai un tas d'interfaces virtuelles, et je voudrais obtenir une liste, utilisable dans divers 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

Je ne suis pas intéressé par le bouclage, car je sais qu'il est là :)

Ce one-liner fait le travail:

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

Produit une sortie comme:

eth0
eth0:1
eth0:2
eth0:3

Prendre plaisir.


1

Toutes les solutions ci-dessus fonctionnent bien. Vous pouvez toujours essayer ceci

ifconfig | grep HW | cut -c 1-6

Étant donné que, loqui est un bouclage, aucune adresse matérielle n'est attribuée, il n'apparaîtra pas.

Production -

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

1

La solution la plus simple est chez l'homme ifconfig (8)

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

L'indicateur -l peut être utilisé pour répertorier toutes les interfaces disponibles sur le système, sans autre information supplémentaire. L'utilisation de cet indicateur est mutuellement exclusive avec tous les autres indicateurs et commandes, à l'exception de -d (uniquement les interfaces de liste qui sont en panne) et -u (uniquement les interfaces de liste qui sont en hausse).

Donc, pour avoir la liste, utilisez:

ifconfig -l

Les noms seront séparés par un espace, vous devez donc utiliser sed pour remplacer ces espaces par un \ n:

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


1

Amélioré:

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

1
Vous devriez probablement faire cela grep -v '^lo$'; votre commande actuelle exclura (exemple hypothétique) logicalet les ridiculousinterfaces.
Scott

0

Aucune des solutions ci-dessus n'a fonctionné pour moi, voici ma solution:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. Liste toutes les interfaces disponibles
  2. Extraire uniquement les lignes contenant les noms des périphériques (pas d'espace au début)
  3. Retirez la partie arrière non liée qui se trouve après du premier espace
  4. Exclure l' lointerface

Les sorties:

eth0
eth0:1
wlan0

0

"ifcongif -l" devrait faire l'affaire. sa sortie est comme ceci "lo0 gif0 stf0 en0 ..." sans nouvelle ligne.

Je l'ai trouvé sur un site Web mais je ne le trouve plus. et je cherche toujours la signification de ce drapeau "-l".


0

Parfois, nettools n'est pas installé par défaut. Donc, j'aime utiliser des commandes intégrées qui ont plus de garantie d'être trouvées dans / bin, / usr / bin et / usr / sbin sans avoir à se soucier des paquets post-installés.

ip addr: afficher / manipuler le routage, les périphériques, le routage des politiques et les tunnels (adresse)
grep: trouver un espace puis n'importe quoi après unitl:
cut: utiliser (:) comme délimiteur et obtenir le champ 2
tr: supprimer tous les espaces

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

0

Testé sur macOS, ce qui suit a fonctionné. J'avais besoin de trouver toutes les interfaces UP. Ceci est basé sur la réponse de Dennis Williamson ci-dessus.

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


-1

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


1
Pourriez-vous développer et expliquer ce que cela signifie? Les réponses sur une ligne ne sont généralement pas un bon format pour le superutilisateur.
Doktoro Reichard
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.