$ ip addr show dev wlp9s0
3: wlp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 70:cd:0d:57:0a:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.178.57/24 brd 192.168.178.255 scope global dynamic noprefixroute wlp9s0
valid_lft 846797sec preferred_lft 846797sec
inet6 2a02:8012:de3:1:929a:6dd0:d7df:53b1/128 scope global dynamic noprefixroute
valid_lft 5503sec preferred_lft 1903sec
inet6 2a02:8012:de3:1:b9ec:8f1a:9da8:2c47/64 scope global dynamic noprefixroute
valid_lft 6907sec preferred_lft 3307sec
inet6 fe80::929a:6dd0:d7df:53b1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
因此,如果该输出包含您的 MAC,您可以假设它确实来自无线设备。有点。如果您将 MAC 设置为ff:ff:ff:ff:ff:ff
当然,您可能有多个无线设备,因此这可能是覆盖这种可能性的更好选择:
devices=( $(awk -F":" '!/\|/{print $1}' /proc/net/wireless ) )
for device in "${devices[@]}"; do
ip addr show dev "$device" |
grep -wq "$mac" && echo "Is wireless" || echo "Is not wireless"
done
$ nmcli -e no -g GENERAL.HWADDR,GENERAL.TYPE dev show
08:00:27:8E:46:AB
ethernet
BC:AE:C5:7D:A0:AA
wifi
08:00:27:A7:C4:90
ethernet
00:00:00:00:00:00
loopback
它似乎不允许通过 MAC 直接轮询设备,因此仍然需要进行后处理 - 例如awk
$ nmcli -e no -g GENERAL.HWADDR,GENERAL.TYPE dev show |
awk -vRS= -v mac='BC:AE:C5:7D:A0:AA' '$1 == mac {print $2}'
wifi
$ nmcli -e no -g GENERAL.HWADDR,GENERAL.TYPE dev show |
awk -vRS= -v mac='08:00:27:A7:C4:90' '$1 == mac {print $2}'
ethernet
如果你想把它变成某种指标函数,你可以这样做:
$ declare -f -p isWifi
isWifi ()
{
nmcli -e no -g GENERAL.HWADDR,GENERAL.TYPE dev show | awk -vRS= -v mac="$1" '
$1 == mac {found = 1; wifi = ($2 == "wifi"); exit}
END {exit(found == 1 ? (wifi == 1 ? 0 : 1) : 2)}
'
}
除了他们的方法(我认为)还可以将虚拟无线接口报告为真实无线接口(我再次认为
/sys/class/net/*/
只需进一步检查就可以轻松解决)的怪癖之外, @PhilippWendler在下面有一种更简单的方法/sys/class/net
,只需进行检查,我相信这很简单,所以也请查看他们的答案。另一种方法是使用
lshw
+jq
; 它应该相当健壮,因为它依赖于lshw
检测和jq
解析。假设
bash
(由于&>/dev/null
重定向;&>/dev/null
可以更改为>/dev/null 2>&1
与不兼容的 shell 和 POSIX 合规性一起使用bash
):echo
仅当“网络”设备被分类为“无线接口”且其 MAC 地址为“01:23:45:67:89:ab”时,此选项才为“是”;当然,为了便于使用,最好将其重构为一个函数:用法:
您还可以删除
echos
以使函数返回状态代码并能够对其执行一些不同的逻辑:/sys
无需任何特殊工具即可轻松提取此信息:Kos的答案是一个更好的方法,请使用它。我在这里依赖于简单的文本解析,因此,如果由于某种奇怪的机会,MAC 地址的字符串出现在我解析的输出的其他部分中,我会错误地声称它是无线设备。例如,如果您
ff:ff:ff:ff:ff:ff
在 的输出中搜索ip addr
,您将找到它,但这不是现有无线设备的有效 MAC。科斯的回答可以优雅地处理这个问题。这是一种方法,但我不确定它有多强大:
该
iwconfig
命令仅显示无线卡的信息,因此如果您的 MAC 不在其输出中,则它不应来自无线设备。或者,您可以做一些更迂回的事情,例如从中获取设备名称
/proc/net/wireless
,然后检查ip
. 像这样:在我的系统上,
/proc/net/wireless
看起来像这样:因此,该
awk
命令用作:
字段分隔符,因此第一个字段 ,$1
将是wlp9s0
,并!/\|/
确保我们只打印不包含的行|
,因此我们只获取设备行而不是标题。接下来,输出ip addr
如下所示:因此,如果该输出包含您的 MAC,您可以假设它确实来自无线设备。有点。如果您将 MAC 设置为
ff:ff:ff:ff:ff:ff
当然,您可能有多个无线设备,因此这可能是覆盖这种可能性的更好选择:
在使用 NetworkManager 的系统上,您可以考虑使用
nmcli
来获取设备 MAC(称为 HWADDR)和类型:它似乎不允许通过 MAC 直接轮询设备,因此仍然需要进行后处理 - 例如
awk
如果你想把它变成某种指标函数,你可以这样做:
然后
(MAC BC:AE:C5:7D:A0:AA 已找到并且是 wifi)
(MAC 08:00:27:8E:46:AB 已找到,但不是 wifi)
(MAC FF:FF:FF:FF:FF:FF 未找到)。