Ajuda a testar o arquivo especial em '/ sys / class / net /'

1

Antecedentes

Estou gerenciando uma interface de celular. Eu tenho um script bash que está testando a interface. Em questão está o arquivo localizado em /sys/class/net/wwan1/carrier , onde wwan1 é uma interface não configurada .

Este é obviamente um arquivo especial, mas não tenho certeza de como testá-lo corretamente em um script bash. Veja abaixo ...

Considere o seguinte:

file /sys/class/net/wwan0/carrier # a good interface
/sys/class/net/wwan0/carrier: ASCII text

file /sys/class/net/wwan1/carrier # an unconfigured interface
/sys/class/net/wwan1/carrier: ERROR: cannot read '/sys/class/net/wwan1/carrier' (Invalid argument)

Algum cat data:

$ cat /sys/class/net/wwan0/carrier # good interface
1

$ cat /sys/class/net/wwan1/carrier # unconfigured
cat: /sys/class/net/wwan1/carrier: Invalid argument

Este erro de cat é o problema.

O arquivo localizado em /sys/class/net/wwan1/carrier é relatado por ls , no entanto:

$ cd /sys/class/net/wwan1
$ ls -al
total 0
drwxr-xr-x 4 root root    0 Dec 27 17:36 .
drwxr-xr-x 3 root root    0 Dec 27 17:36 ..
-r--r--r-- 1 root root 4096 Dec 28 20:24 addr_assign_type
-r--r--r-- 1 root root 4096 Dec 28 20:24 address
-r--r--r-- 1 root root 4096 Dec 28 20:24 addr_len
-r--r--r-- 1 root root 4096 Dec 28 20:24 broadcast
-r--r--r-- 1 root root 4096 Dec 28 18:57 carrier
lrwxrwxrwx 1 root root    0 Dec 28 20:24 device -> ../../../1-1:1.10
-r--r--r-- 1 root root 4096 Dec 28 20:24 dev_id
-r--r--r-- 1 root root 4096 Dec 28 20:24 dormant
-r--r--r-- 1 root root 4096 Dec 28 20:24 duplex
-rw-r--r-- 1 root root 4096 Dec 28 20:24 flags
-rw-r--r-- 1 root root 4096 Dec 28 20:24 ifalias
-r--r--r-- 1 root root 4096 Dec 28 20:24 ifindex
-r--r--r-- 1 root root 4096 Dec 28 20:24 iflink
-r--r--r-- 1 root root 4096 Dec 28 20:24 link_mode
-rw-r--r-- 1 root root 4096 Dec 28 20:24 mtu
-rw-r--r-- 1 root root 4096 Dec 28 20:24 netdev_group
-r--r--r-- 1 root root 4096 Dec 28 18:57 operstate
drwxr-xr-x 2 root root    0 Dec 28 20:24 power
-r--r--r-- 1 root root 4096 Dec 28 20:24 speed
drwxr-xr-x 2 root root    0 Dec 28 20:24 statistics
lrwxrwxrwx 1 root root    0 Dec 27 17:36 subsystem -> ../../../../../../../../../../class/net
-rw-r--r-- 1 root root 4096 Dec 28 20:24 tx_queue_len
-r--r--r-- 1 root root 4096 Dec 28 20:24 type
-rw-r--r-- 1 root root 4096 Dec 27 17:36 uevent

O problema

Estou testando uma variedade de possíveis configurações de interface e problemas em um script bash. Uma delas é que a interface é desconfigurada. Estou investigando /sys porque descobri que a saída de ifconfig e ip não é confiável.

Minha pergunta

Como posso testar o valor do arquivo /sys/class/net/wwan1/carrier em uma instrução bash if (o arquivo em si é ilegível, mas está presente, isto é, é uma interface não configurada ? tentei:

if [[ -e "/sys/class/net/wwan1/carrier" ]]; then
    echo "Good"
else
    echo "Bad"
fi

Também usei os testes -b, -c, -f , todos os quais não conseguem distinguir entre o estado 'legível' deste arquivo em /sys/class/net/wwan1/ - o arquivo 'ruim' e /sys/class/net/wwan0/ - o 'bom' arquivo.

Editar

Os testes -r e -s são bons nos dois casos, o que é um problema, pois cat falhará no primeiro caso.

Editar stat output

$ stat /sys/class/net/wwan0/carrier
  File: '/sys/class/net/wwan0/carrier'
  Size: 4096            Blocks: 0          IO Block: 4096   regular file
Device: fh/15d  Inode: 5657        Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-12-28 17:01:06.976418548 +0000
Modify: 2015-12-28 17:01:06.976418548 +0000
Change: 2015-12-28 17:01:06.976418548 +0000
 Birth: -

e

$ stat /sys/class/net/wwan1/carrier
  File: '/sys/class/net/wwan1/carrier'
  Size: 4096            Blocks: 0          IO Block: 4096   regular file
Device: fh/15d  Inode: 6181        Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-12-28 18:57:37.876419704 +0000
Modify: 2015-12-28 18:57:37.876419704 +0000
Change: 2015-12-28 18:57:37.876419704 +0000
 Birth: -
    
por datUser 28.12.2015 / 22:00

1 resposta

1

Eu experimentei minha interface WiFi, que também tem o arquivo carrier pseudo: /sys/class/net/wlan0/carrier . (nota: usei nmtui para ativar / desativar redes sem fio).

Parece que há três estados:

  • ./carrier não legível (por exemplo, quando a interface está desativada no Network Manager).
  • ./carrier contém "1" (quando a interface está ativada e está conectada a uma rede WiFi)
  • ./carrier contém "0" (quando a interface está ativada e está não conectada a uma rede WiFi)

  if ! cat /sys/class/net/wlan0/carrier > /dev/null; then
    echo "Not connected to any network"
  elif [ "$(head -c1 /sys/class/net/wlan0/carrier)" -eq 1 ]; then
    echo "Connected to a wireless network"
  elif [ "$(head -c1 /sys/class/net/wlan0/carrier)" -eq 0 ]; then
    echo "Not connected to a wireless network"
  else
    echo "Unknown/Unhandled state"
  fi
    
por 28.12.2015 / 23:29