Linuxサーバーで使用可能なすべてのネットワークデバイス名のリストを取得したい。私はそれを考えました
ifconfig
仕事をしますが、ifconfigはかなり多くの出力を生成します:
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
[...]
私が達成したいのは、次のようなリストです
eth0
eth1
eth2
lo
またはさらに良い
eth0
eth1
eth2
これは「cat」、「sed」、「grep」の組み合わせで実行できると思いますが、不要な情報を取り除く方法の手がかりはありません。
これを試してみてください:
ifconfig -a | sed 's/[ \t].*//;/^$/d'
これはlo
を省略します:
ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'
別の代替案は次のとおりです。
ip -o link show | awk -F': ' '{print $2}'
または多分:
ls /sys/class/net
/ sys/class/netを使用してパスを取り除いてください:
$ basename -a /sys/class/net/*
eth0
eth1
lo
ppp0
tun0
これを試して:
ifconfig | cut -c 1-8 | sort | uniq -u
cut -c 1-8
は、各行の最初の8文字を抽出しますsort
は行をソートしますuniq -u
は最初の8文字にスペースしかない説明行の空白行を削除する一意の行のみを出力しますこれは私が試した2つのLinuxマシンで機能しますが、私のMacBookPro(OS X 10.6.4)では、ifconfig
はスペースではなくタブを使用するため、少し複雑です。
ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
expand
はタブをスペースに変換しますawk -F: '{print $1;}'
は、コロンの前の最初のフィールドを出力します。ls /sys/class/net/
eth0 eth1 eth2 lo
または、eth *のみが必要な場合
ls /sys/class/net/eth*
eth0
eth1
eth2
/sys
ファイルシステムの使用:
basename -a $(ls /sys/devices/**/net/* -d)
IpとPerlの使用:
ip -o l|Perl -lane'$F[1]=~s/://g;print $F[1]'
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'
提供する
lo:
eth0:
eth1:
eth2:
出力として
最初の列だけを印刷するには:
netstat -a | awk '{print $1}'
他のルールをawkに組み込んで、必要に応じてエントリを追加または削除できます。
編集:同じことがifconfigにも当てはまります(ダグが指摘したように)
ifconfig | awk '{print $1}'
これは「lo」インターフェースを除いた例です
ifconfig | awk '{if ($1 != lo) print $1}'
ifconfig
出力からインターフェース名を抽出する1つの方法を次に示します。
ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p'
特定の名前を除外する場合の1つの方法は、grep
でさらにフィルターすることです。
ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo
さらに名前を除外する場合は、grep
コマンドに-e foo
を追加します。
受け入れられた解決策が存在するにもかかわらず、私はこれに対する私の解決策を提示したいと思います。
たくさんの仮想インターフェイスがあり、さまざまな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
私はループバックがあることに気付いているので、ループバックには興味がありません:)
このワンライナーは仕事を成し遂げます:
ifconfig | egrep '^eth' | cut -f 1-2 -d ':' | cut -f 1 -d ' '| pcregrep -o1 "(((eth\d)(:\d))|(eth\d))"
次のような出力を生成します。
eth0
eth0:1
eth0:2
eth0:3
楽しい。
最も簡単な解決策は、ifconfig(8)の男です。
man ifconfig(8)抽出 http://www.manpagez.com/man/8/ifconfig/ :
-lフラグを使用すると、システムで使用可能なすべてのインターフェースをリストできます。他の追加情報はありません。このフラグの使用は、-d(ダウンしているインターフェースのみをリスト)および-u(アップしているインターフェースのみをリスト)を除いて、他のすべてのフラグおよびコマンドと相互に排他的です。
したがって、リストを取得するには、次を使用します。
ifconfig -l
名前はスペースで区切られるため、sedを使用してこれらのスペースを\ nで置き換える必要があります。
ifconfig -l | sed 's/ / /g'
改善:
netstat -i | grep '^[a-z]' | awk '{print $1}' | grep -v 'lo'
上記のソリューションはすべて正常に動作します。まだこれを試すことができます
ifconfig | grep HW | cut -c 1-6
ループバックであるlo
にはHWアドレスが割り当てられていないため、表示されません。
出力-
root @ glum:/ home/amit#ifconfig | grep HW | cut -c 1-6 enp7s0 vmnet1 vmnet8 wlp6s0
「ifcongif -l」で十分です。その出力は改行のないこの「lo0 gif0 stf0 en0 ...」のようになります。
一部のウェブサイトで見つけましたが、もう見つかりません。そして、その「-l」フラグの意味をまだ探しています。
上記の解決策のどれも私にとってうまくいきませんでした、これが私の解決策です:
ifconfig -a | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
lo
インターフェースを除外する出力:
eth0
eth0:1
wlan0
MacOSでテストしたところ、以下が機能しました。稼働しているすべてのインターフェースを見つける必要がありました。これは、上記のDennis Williamsonからの回答に基づいています。
ifconfig -a | grep UP | sed 's/:.*//;/^$/d'
Nettoolsがデフォルトでインストールされないことがあります。そのため、私は、インストール済みパッケージについて心配することなく、/ bin、/ usr/bin、および/ usr/sbin内にあることが保証されている組み込みコマンドを使用するのが好きです。
ip addr:ルーティング、デバイス、ポリシールーティング、トンネル(アドレス)の表示/操作
grep:スペースを検索してから、unitlの後のすべてを検索します。
cut:(:)を区切り文字として使用し、フィールド2を取得
tr:スペースを削除します
$ ip addr | grep -E ':\ s。* ?:' |カット-d ":" -f 2 | tr -d ""