Obter nomes de dispositivos da interface Wi-Fi

Respostas:

15

No linux, você possui iw(mostra / manipula dispositivos sem fio e suas configurações) e quando usado com o devcomando:

Commands:
    dev
        List all network interfaces for wireless hardware.

isso é

iw dev

você terá algo como:

phy#0
    Interface wlan0
        ifindex 3
        wdev 0x1
        addr 00:12:32:e4:18:24
        type managed
phy#1
    Interface wlan1
        ifindex 4
        wdev 0x2
        addr 00:12:22:c6:b2:0a
        type managed

Se você deseja extrair apenas nomes de interfaces, sempre pode processar a saída, por exemplo

iw dev | awk '$1=="Interface"{print $2}'

lembre-se de que a página de ajuda indica claramente:

Do NOT screenscrape this tool, we don't consider its output stable.
don_crissti
fonte
Gosto dessa resposta, resolve o problema, mas o pouco sobre não raspar me preocupa e me faz pensar que pode haver uma maneira melhor. Eu gostaria de deixar isso em aberto por enquanto.
Matt Copperwaite
9

No Ubuntu, pelo menos, há o /proc/net/wirelessarquivo que contém detalhes sobre as interfaces Wi-Fi. Quais saídas para mim:

$ cat /proc/net/wireless
Inter-| sta-|   Quality        |   Discarded packets               | Missed | WE
 face | tus | link level noise |  nwid  crypt   frag  retry   misc | beacon | 22
wlp5s0: 0000   36.  -74.  -256        0      0      0     16  33004        0

É um pouco confuso, mas o nome do dispositivo está lá.

Para obter apenas o nome da interface:

cat /proc/net/wireless | perl -ne '/(\w+):/ && print $1'

O perlcódigo imprime a sequência de caracteres da palavra que precede os dois pontos.

Matt Copperwaite
fonte
Isso não funcionou para mim - provavelmente porque tenho minha placa sem fio desativada (mas detectável).
imbuedHope
9

Se você possui o sysfs montado em / sys, os seguintes comandos funcionam:

# find /sys/class/net -follow -maxdepth 2 -name wireless | cut -d / -f 5
wlan0
# find /sys/class/net -follow -maxdepth 2 -name phy80211 | cut -d / -f 5
wlan0

Ou, sem find:

for dev in `ls /sys/class/net`; do
  if [ -d "/sys/class/net/$dev/wireless" ]; then echo $dev; fi;
done

O primeiro localiza todos os dispositivos /sys/class/netcom um wirelessdiretório (que pode ser mais do que apenas dispositivos WiFi) e o segundo localiza dispositivos compatíveis com 802.11

Testado no kernel 4.4

Josh
fonte
7

Com base na resposta de Josh , usarei um shell glob para identificar os /sys/class/netdiretórios com um wirelessdiretório interno e awkpegar o nome do dispositivo:

# find the directories
$ printf '%s\n' /sys/class/net/*/wireless # substitute with phy80211 if desired
/sys/class/net/wlp4s0/wireless
# filter out the "device" part
$ printf '%s\n' /sys/class/net/*/wireless | awk -F'/' '{ print $5 }'
wlp4s0
D. Ben Knoble
fonte
1

Modo universal (não raiz) testado no Android 4, Android 7.1 e Android 9 e ArchLinux.

ls /sys/class/ieee80211/*/device/net/
VasileM
fonte