Wi-Fiまたはイーサネットで接続できるホストがあります。リンクにしたがってアクションをとりたいです。
スクリプトでこれをどのように検出しますか?
ベストアンサー1
各リンクタイプに使用されるインターフェイスは異なります。イーサネットインターフェイスは異なる場合があります。eth0WLANインターフェイスは無線LAN0。活動中の名前を知り、それに応じて行動します。
すべてのインターフェイスを一覧表示してそのステータスを表示するには、コマンドを使用しますip link show
。このコマンドはLinuxの最新バージョンで動作するため、残りのユーティリティとBashシェルもすべてのOSに適用できると仮定します(Windowsではcygwinを使用することをお勧めします。アッまたはPythonで解析するIP構成またはNetsh出力またはPowerShell Get-NetAdapterモジュール)。
出力例:
user@host$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:9b:90:7d brd ff:ff:ff:ff:ff:ff
grep
その後、数字で始まる行を見つけてインターフェイス名/ステータスをフィルタリングできます。
user@host$ ip link show | grep "^[0-9]"
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
アクティブインタフェースにはUPという単語があるため、アクティブインタフェースを取得するにはローカルインタフェースlocalhost(見てください:):
user@host$ ip link show | grep "^[0-9]" | grep -v "lo: " | grep "UP"
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
インターフェイス名、つまり2番目の単語だけが必要です。
user@host$ ip link show | grep "^[0-9]" | grep -v "lo: " | grep "UP" | cut -d ':' -f 2
ens32
この結果を一部の変数(Bash)に保存できます。
ACTIVEIF=$(ip link show | grep "^[0-9]" | grep -v "lo: " | grep "UP" | cut -d ':' -f 2)
もちろん、アクティブなインターフェイスが複数ある場合は、結果の周りに括弧とスペースを追加して名前の配列にリストを保存します。これからは物理インターフェイスが 1 つだけなので lo: をフィルタリングしません。):
ACTIVEIFACES=( $(ip link show | grep "^[0-9]" | grep "UP" | cut -d ':' -f 2) )
配列変数の内容を確認するには:
user@host$ set | grep ^ACTIVEIFACES
ACTIVEIFACES=([0]="lo" [1]="ens32")
スクリプトにリストします。
ACTIVEIFACES=( $(ip link show | grep "^[0-9]" | grep "UP" | cut -d ':' -f 2) )
NIFACES=${#ACTIVEIFACES[@]}
if [ $NIFACES -ne 0 ] ; then
echo "There exist $NIFACES active interfaces:"
for ((i=0; i<NIFACES; i++)) ; do
echo "${ACTIVEIFACES[$i]}"
done
else
echo "There is no active interfaces detected"
fi
(このfor
コマンドは数値式を使用するため、二重括弧の間の$ iと$NIFACESの$を省略できます。)
私の場合、スクリプトの出力は次のようになります。
There exist 2 active interfaces:
lo
ens32
この方法があなたにうまくいくことを願っています。頑張ってください!