AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 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

Dado o endereço MAC, como saber se a interface é wifi

  • 772

Existe uma maneira, na linha de comando, dado um endereço MAC de uma interface de rede local na máquina atual (por exemplo 01:23:45:67:89:ab), para determinar se essa interface é WiFi ou com fio?

Estou tentando fazer isso em um script de shell.

networking
  • 4 4 respostas
  • 2446 Views

4 respostas

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

    Além da peculiaridade de que o método deles ( eu acho ) também poderia relatar interfaces sem fio virtuais como interfaces sem fio reais (o que, novamente, acho que deveria ser facilmente resolvido apenas inspecionando /sys/class/net/*/um pouco mais) @PhilippWendler tem uma maneira ainda mais simples abaixo, que envolve simplesmente inspecionar /sys/class/net, que acredito ser o mais simples possível, então verifique também a resposta deles.


    Outra maneira de usar lshw+ jq; deve ser bastante robusto, pois depende lshwde detecção e jqanálise.

    Isso pressupõe bash(por causa do &>/dev/nullredirecionamento; &>/dev/nullpode ser alterado para >/dev/null 2>&1uso com bashshells não compatíveis e conformidade com POSIX):

    {
        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
    

    Isto será echo"sim" apenas caso um dispositivo de "rede" seja classificado como "Interface sem fio" e seu endereço MAC seja "01:23:45:67:89:ab"; naturalmente, seria melhor refatorar isso em uma função para facilitar o uso:

    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
    }
    

    Uso:

    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
    

    Você também pode remover o echospara que a função retorne um código de status e para poder executar alguma lógica diferente nela:

    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

    Parece muito fácil extrair essas informações /syssem ferramentas especiais:

    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

    A resposta de Kos é uma maneira melhor, use-a. Estou confiando na análise de texto ingênua aqui, então se, por algum estranho acaso, a string do endereço MAC aparecer em alguma outra parte das saídas que analiso, afirmarei incorretamente que é um dispositivo sem fio. Por exemplo, se você procurar ff:ff:ff:ff:ff:ffna saída de ip addr, você o encontrará, mas esse não é um MAC válido de um dispositivo sem fio existente. A resposta de Kos pode lidar com isso com elegância.


    Aqui está uma maneira, mas não tenho certeza de quão robusta ela é:

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

    O iwconfigcomando mostra apenas informações para placas wireless, portanto, se o seu MAC não estiver na saída, não deverá ser de um dispositivo wireless.

    Como alternativa, você pode fazer algo mais indireto, como obter o nome do dispositivo /proc/net/wirelesse verificar o MAC na saída de ip. Assim:

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

    No meu sistema, /proc/net/wirelessfica assim:

    $ 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
    

    Portanto, o awkcomando está sendo usado :como separador de campo, para que o primeiro campo, $1, seja wlp9s0e !/\|/garanta que imprimiremos apenas nas linhas que não contêm |, para obtermos apenas linhas de dispositivo e não cabeçalhos. A seguir, a saída de ip addrfica assim:

    $ 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
    

    Portanto, se essa saída contém o seu MAC, você pode presumir que é realmente de um dispositivo sem fio. Tipo. Se você configurar seu MAC para serff:ff:ff:ff:ff:ff

    Claro, você pode ter mais de um dispositivo sem fio, então esta pode ser uma opção melhor para cobrir essa possibilidade:

    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

    Em sistemas que usam NetworkManager, você pode considerar usar nmclipara obter o MAC do dispositivo (conhecido como HWADDR) e o TYPE:

    $ 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
    

    Parece não permitir a pesquisa direta de dispositivos pelo MAC, portanto o pós-processamento ainda é necessário - por exemplo, comawk

    $ 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
    

    Se você quiser transformar isso em algum tipo de função de indicador, você pode fazer algo assim:

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

    Então

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

    (MAC BC:AE:C5:7D:A0:AA encontrado e IS wifi)

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

    (MAC 08:00:27:8E:46:AB encontrado, mas NÃO é wifi)

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

    (MAC FF:FF:FF:FF:FF:FF não encontrado).

    • 4

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve