Scripting

腳本“通過 wifi 或乙太網”

  • November 19, 2020

我有一個可以通過 wifi 或乙太網連接的主機。根據我要採取行動的連結。

如何用腳本檢測到?

用於每種類型的連結的介面是不同的。比如說,乙太網介面可以是eth0,而 WLAN 介面可以是wlan0。知道你能找到哪些是活躍的名字並採取相應的行動。

要列出所有介面並顯示它們的狀態,請使用命令ip link show。此命令適用於現代風格的 Linux,其餘的 utils 和 Bash shell 也是如此。我想你可以讓它適應任何作業系統(在 Windows 中,我建議使用 cygwin 和awk或 Python 來解析ipconfignetsh輸出,或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

我希望這個方法對你有用。祝你好運!

引用自:https://unix.stackexchange.com/questions/620139