web-dev-qa-db-ja.com

イーサネットネットワークインターフェイスの名前を取得するBashスクリプト

Ubuntu 16.04では、特定のパラメーターに基づいて有線イーサネットインターフェイスのIPアドレスを動的に構成するスクリプトを作成しました。今問題は私のスクリプトで名前がeth0であると想定していることですが、これは常に正しいとは限りません。有線ネットワークインターフェイスが1つしかない(プラグインする必要はない)と想定していますが、ワイヤレスインターフェイスも使用できるとしたら、どうすればよいですか。その名前を取得しますか(有線のものだけ)?

ifconfigコマンドを使用すると、次のようになります。

enp7s0    Link encap:Ethernet  HWaddr fc:3f:db:a2:6d:46  
          inet addr:192.168.0.101  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::149f:3103:af2f:1ec5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6784 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7493 errors:1 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4565079 (4.5 MB)  TX bytes:827825 (827.8 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:8037 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8037 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:2261250 (2.2 MB)  TX bytes:2261250 (2.2 MB)

wlp19s0   Link encap:Ethernet  HWaddr c8:ff:28:93:26:32  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:180463 errors:0 dropped:0 overruns:0 frame:0
          TX packets:121275 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:229823414 (229.8 MB)  TX bytes:15675806 (15.6 MB)

私が欲しいのは:

enp7s0
3
rok

virloopbackwl(wireless)のようなインターフェースを除外したい場合は、次のようにしてください。

ip link | awk -F: '$0 !~ "lo|vir|wl|^[^0-9]"{print $2;getline}'

ここでは、区切り文字としてコロンを使用しています-F:次に、行が$0は、正規表現を使用した特定の文字列に一致しません。

3

すべてのネットワークインターフェースを一覧表示する/sys/class/など、すべてのインターフェースが/sys/class/net/の下に表示されるため、

これを直接使用して、次のような単純なキーワードで正確なインターフェース名を返すことができます。

ls /sys/class/net | grep enp

7
千木郷

物理インターフェースが1つしかなく、一部のwlanインターフェースなどがないと仮定します。トリックは、インターフェースを取得することです。/sys/class/netにあり、それらがどこに行くのかを調べます。

find /sys/class/net ! -type d | xargs --max-args=1 realpath  | awk -F\/ '/pci/{print $NF}'

より多くのインターフェイスを取得する場合は、まずlspciをgrepする必要があります。

lspci  | awk '/Ethernet/{print $1}'

すべてが次のようになります。

pci=`lspci  | awk '/Ethernet/{print $1}'`; find /sys/class/net ! -type d | xargs --max-args=1 realpath  | awk -v pciid=$pci -F\/ '{if($0 ~ pciid){print $NF}}'
1
user2563336

ifconfig(bit old and deprecated)ツールまたはipコマンドを使用します。 ip routeを使用すると、利用可能なルートのリストが得られます。次に、_defaultを含む行のみをgrepで取得し、sed

完全なコマンドは次のようになります。

ip route | grep default | sed -e "s/^.*dev.//" -e "s/.proto.*//"

1
inckka

これが最善の解決策です

ip route get 8.8.8.8 | awk-'{printf $ 5}'

または

echo $(ip route get 8.8.8.8 | awk-'{printf $ 5}')

bashスクリプトでは、main_interfaceを宣言して、どこでも$ main_interfaceとして使用できます

main_interface = $(ip route get 8.8.8.8 | awk-'{printf $ 5}')

0
Tanzil Hussain