AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1512429
Accepted
Jason C
Jason C
Asked: 2024-05-01 21:32:22 +0800 CST2024-05-01 21:32:22 +0800 CST 2024-05-01 21:32:22 +0800 CST

给定MAC地址,如何判断接口是否是wifi

  • 772

有没有办法在命令行上给定当前计算机上本地网络接口的 MAC 地址(例如01:23:45:67:89:ab),以确定该接口是 WiFi 还是有线?

我正在尝试在 shell 脚本中执行此操作。

networking
  • 4 4 个回答
  • 2446 Views

4 个回答

  • Voted
  1. Best Answer
    kos
    2024-05-01T23:06:23+08:002024-05-01T23:06:23+08:00

    除了他们的方法(我认为)还可以将虚拟无线接口报告为真实无线接口(我再次认为/sys/class/net/*/只需进一步检查就可以轻松解决)的怪癖之外, @PhilippWendler在下面有一种更简单的方法/sys/class/net,只需进行检查,我相信这很简单,所以也请查看他们的答案。


    另一种方法是使用lshw+ jq; 它应该相当健壮,因为它依赖于lshw检测和jq解析。

    假设bash(由于&>/dev/null重定向;&>/dev/null可以更改为>/dev/null 2>&1与不兼容的 shell 和 POSIX 合规性一起使用bash):

    {
        LANG=C lshw -json -class network | 
        jq -e --arg serial '01:23:45:67:89:ab' '.[] | select(.description == "Wireless interface" and .serial == $serial)'
    } &>/dev/null && echo yes || echo no
    

    echo仅当“网络”设备被分类为“无线接口”且其 MAC 地址为“01:23:45:67:89:ab”时,此选项才为“是”;当然,为了便于使用,最好将其重构为一个函数:

    is_wireless_adapter() {
        {
            LANG=C lshw -json -class network | 
            jq -e --arg serial "$1" '.[] | select(.description == "Wireless interface" and .serial == $serial)'
        } &>/dev/null && echo yes || echo no
    }
    

    用法:

    is_wireless_adapter <MAC_ADDRESS>
    
    % ip address
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host noprefixroute 
        valid_lft forever preferred_lft forever
    2: enp100s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
        link/ether 48:21:0b:3d:b7:87 brd ff:ff:ff:ff:ff:ff
    3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether e0:d0:45:66:b0:c5 brd ff:ff:ff:ff:ff:ff
        altname wlp0s20f3
        inet 192.168.1.3/24 brd 192.168.1.255 scope global dynamic noprefixroute wlo1
        valid_lft 86077sec preferred_lft 86077sec
        inet6 fe80::1c63:81ea:f46a:b3db/64 scope link noprefixroute 
        valid_lft forever preferred_lft forever
    % is_wireless_adapter '48:21:0b:3d:b7:87'
    no
    % is_wireless_adapter 'e0:d0:45:66:b0:c5'
    yes
    

    您还可以删除echos以使函数返回状态代码并能够对其执行一些不同的逻辑:

    is_wireless_adapter() {
        {
            LANG=C lshw -json -class network | 
            jq -e --arg serial "$1" '.[] | select(.description == "Wireless interface" and .serial == $serial)'
        } &>/dev/null
    }
    
    • 14
  2. Philipp Wendler
    2024-05-02T17:41:35+08:002024-05-02T17:41:35+08:00

    /sys无需任何特殊工具即可轻松提取此信息:

    for i in /sys/class/net/*/; do 
      [[ 01:23:45:67:89:ab = $(cat "$i/address") && -d "$i/wireless" ]] && 
        echo "Device is wireless"
    done
    
    • 6
  3. terdon
    2024-05-01T21:55:25+08:002024-05-01T21:55:25+08:00

    Kos的答案是一个更好的方法,请使用它。我在这里依赖于简单的文本解析,因此,如果由于某种奇怪的机会,MAC 地址的字符串出现在我解析的输出的其他部分中,我会错误地声称它是无线设备。例如,如果您ff:ff:ff:ff:ff:ff在 的输出中搜索ip addr,您将找到它,但这不是现有无线设备的有效 MAC。科斯的回答可以优雅地处理这个问题。


    这是一种方法,但我不确定它有多强大:

    mac=01:23:45:67:89:ab
    iwconfig 2>/dev/null | grep -w "$mac" && echo "Is wireless" || echo "Is not wireless"
    

    该iwconfig命令仅显示无线卡的信息,因此如果您的 MAC 不在其输出中,则它不应来自无线设备。

    或者,您可以做一些更迂回的事情,例如从中获取设备名称/proc/net/wireless,然后检查ip. 像这样:

    device=$(awk -F":" '!/\|/{print $1}' /proc/net/wireless )
    ip addr show dev "$device" |
      grep -wq "$mac" && echo "Is wireless" || echo "Is not wireless"
    

    在我的系统上,/proc/net/wireless看起来像这样:

    $ cat /proc/net/wireless
    Inter-| sta-|   Quality        |   Discarded packets               | Missed | WE
     face | tus | link level noise |  nwid  crypt   frag  retry   misc | beacon | 22
    wlp9s0: 0000   40.  -70.  -256        0      0      0      0   1249        0
    

    因此,该awk命令用作:字段分隔符,因此第一个字段 ,$1将是wlp9s0,并!/\|/确保我们只打印不包含的行|,因此我们只获取设备行而不是标题。接下来,输出ip addr如下所示:

    $ 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
    
    • 5
  4. steeldriver
    2024-05-02T07:43:57+08:002024-05-02T07:43:57+08:00

    在使用 NetworkManager 的系统上,您可以考虑使用nmcli来获取设备 MAC(称为 HWADDR)和类型:

    $ 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)}
      '
    }
    

    然后

    $ isWifi BC:AE:C5:7D:A0:AA; echo "$?"
    0
    

    (MAC BC:AE:C5:7D:A0:AA 已找到并且是 wifi)

    $ isWifi 08:00:27:A7:C4:90; echo "$?"
    1
    

    (MAC 08:00:27:8E:46:AB 已找到,但不是 wifi)

    $ isWifi FF:FF:FF:FF:FF:FF; echo "$?"
    2
    

    (MAC FF:FF:FF:FF:FF:FF 未找到)。

    • 4

相关问题

  • 如何设置 VLAN 转发?

  • 如何将主机 Ubuntu 上的 VPN (tun0) 网络适配器映射到 VirtualBox 来宾 Windows?

  • 如何限制下载/上传带宽?

  • 如何通过 Windows 网络共享文件?

  • 面板小程序以文本形式显示当前网络流量?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve