Scripting
腳本“通過 wifi 或乙太網”
我有一個可以通過 wifi 或乙太網連接的主機。根據我要採取行動的連結。
如何用腳本檢測到?
用於每種類型的連結的介面是不同的。比如說,乙太網介面可以是eth0,而 WLAN 介面可以是wlan0。知道你能找到哪些是活躍的名字並採取相應的行動。
要列出所有介面並顯示它們的狀態,請使用命令
ip link show
。此命令適用於現代風格的 Linux,其餘的 utils 和 Bash shell 也是如此。我想你可以讓它適應任何作業系統(在 Windows 中,我建議使用 cygwin 和awk或 Python 來解析ipconfig或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 ( lo: ):
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
我們只需要介面名稱,第二個單詞:
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)
當然,如果您有多個活動介面,則將列表儲存在一組名稱中,並在結果周圍添加括號和空格。例如(從現在開始,我不會過濾 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
命令使用數字表達式,您可以省略 $ in $ i 和 $NIFACES 之間的雙括號)。在我的情況下,腳本輸出是:
There exist 2 active interfaces: lo ens32
我希望這個方法對你有用。祝你好運!