Como detectar quando um dispositivo Android está conectado via tethering USB e obter seu nome de interface?

1

Eu herdei um script bash que precisa detectar o nome da interface de qualquer dispositivo Android conectado via tethering de USB e, em seguida, grava esse nome de interface para outra variável. Aqui está o código existente (simplificado).

if [ -s /sys/class/net/enp0s20f0u3/operstate ]; then
    /usr/bin/echo "enp0s20f0u3" > /var/tmp/myfile

elif [ -s /sys/class/net/enp0s20f0u5/operstate ]; then
    /usr/bin/echo "enp0s20f0u5" > /var/tmp/myfile

elif [ -s /sys/class/net/enp6s0u1/operstate ]; then
    /usr/bin/echo "enp6s0u1" > /var/tmp/myfile

elif [ -s /sys/class/net/enp0s20f0u4/operstate ]; then
    /usr/bin/echo "enp0s20f0u4" > /var/tmp/myfile

elif [ -s /sys/class/net/enp0s20f0u6/operstate ]; then
    /usr/bin/echo "enp0s20f0u6" > /var/tmp/myfile

elif [ -s /sys/class/net/enp0s20f0u10/operstate ]; then
    /usr/bin/echo "enp0s20f0u10" > /var/tmp/myfile

Se um dispositivo Android futuro receber um nome de interface diferente, o código precisará ser modificado manualmente depois que descobrirmos que o script não funcionou. Obviamente, esta é uma implementação muito pobre.

Qual é a melhor maneira de alcançar os mesmos resultados?

EDIT 1:

O que eu realmente quero dizer é: como esse código pode ser refatorado para que cada nome de interface não precise ser codificado?

    
por MountainX 14.09.2017 / 23:49

2 respostas

0

Em uma situação ideal? Reescreva isso como uma regra do udev para que seja ativada automaticamente na conexão. Ele terá que ser avaliado após outras regras para que qualquer renomeação de interface já tenha acontecido no momento em que é avaliada ( /etc/udev/rules.d/99-x-local.conf é provavelmente o local para colocá-lo), mas a regra básica deve ser semelhante a esta:

SUBSYSTEM=="net", ENV{ID_BUS}=="usb", ENV{ID_USB_DRIVER}=="rndis_host", ACTION=="add", RUN{program}+="/bin/sh -c 'echo $env{INTERFACE} > /var/tmp/myfile'"

As primeiras quatro partes correspondem ao evento exato gerado quando o dispositivo é conectado, mais especificamente:

  • SUBSYSTEM=="net" corresponde a dispositivos de rede
  • ENV{ID_BUS}=="usb" corresponde apenas aos dispositivos de rede conectados via USB.
  • ENV{ID_USB_DRIVER}=="rndis_host" corresponde apenas a dispositivos USB que usam o driver de dispositivo host RNDIS (o padrão usado por telefones Android (e eu acho que o Windows e o Blackberry também) para tethering por USB.
  • ACTION=="add" corresponde apenas aos eventos do hotplug (portanto, isso só é executado quando o dispositivo é conectado, embora você possa facilmente adicionar uma segunda regra semelhante correspondente à ação "remover" para fazer algo quando o telefone for desconectado). / li>

O item final adiciona um comando à fila de coisas que o udev invocará quando o processamento da regra estiver concluído. Nesse caso, ele está adicionando uma chamada de shell que gravará o nome da interface no local desejado (o próprio udev substituirá o $env{INTERFACE} pelo nome real da interface).

Não posso garantir que isso funcionará em todos os casos, mas pelo menos parece funcionar para o meu Nexus 6P e deve, em teoria, funcionar para a maioria dos telefones Android.

    
por 15.09.2017 / 21:13
0

Se não houver nenhum sinal na ordem, você pode percorrer todos os diretórios em /sys/class/net/ até encontrar um que esteja ativo e não seja o dispositivo de loopback:

for interface in /sys/class/net/*
do name=${interface##*/}  # just the final directory
   state=$(<$interface/operstate)   # read the file
   [ "$name" = lo ] && continue     # if lo continue to next
   [ "$state" = up ] || continue    # if not up continue to next
   echo $name >/var/tmp/myfile
   break                            # stop
done
    
por 16.09.2017 / 19:06