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
vir
、loopback
、wl
(wireless)のようなインターフェースを除外したい場合は、次のようにしてください。
ip link | awk -F: '$0 !~ "lo|vir|wl|^[^0-9]"{print $2;getline}'
ここでは、区切り文字としてコロンを使用しています-F:
次に、行が$0
は、正規表現を使用した特定の文字列に一致しません。
すべてのネットワークインターフェースを一覧表示する/sys/class/
など、すべてのインターフェースが/sys/class/net/
の下に表示されるため、
これを直接使用して、次のような単純なキーワードで正確なインターフェース名を返すことができます。
ls /sys/class/net | grep enp
物理インターフェースが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}}'
ifconfig
(bit old and deprecated)ツールまたはip
コマンドを使用します。 ip route
を使用すると、利用可能なルートのリストが得られます。次に、_defaultを含む行のみをgrep
で取得し、sed
完全なコマンドは次のようになります。
ip route | grep default | sed -e "s/^.*dev.//" -e "s/.proto.*//"
これが最善の解決策です
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}')