Как определить, когда устройство Android подключено через USB-модем, и получить это имя интерфейса?

uniq имеет опцию подсчета вхождений

grep -f fileA.txt fileB.txt | uniq -c

Однако имейте в виду, что если у вас есть дубликаты в вашем файле A, подсчет будет неверным, так как он будет искать их несколько раз. В этом случае сначала запустите файл A через uniq, чтобы удалить дубликаты, а затем используйте его для шаблонов.

Вы можете отфильтровать его в новый файл или обработать файл построчно и запустить его.

while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c
1
16.09.2017, 09:33
2 ответа

В идеальной ситуации? Перепишите это как правило udev, чтобы оно срабатывало автоматически при подключении. Его нужно будет оценивать после других правил, так что любое переименование интерфейса уже произошло к тому времени, когда оно будет оценено (/etc/udev/rules.d/99-x-local.conf, вероятно, это место для его размещения ), но основное правило должно выглядеть примерно так:

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'"

Первые четыре части точно соответствуют событию, генерируемому при подключении устройства, а точнее:

  • SUBSYSTEM=="net"соответствует сетевым устройствам
  • ENV{ID_BUS}=="usb"соответствует только тем сетевым устройствам, которые подключены через USB.
  • ENV{ID_USB_DRIVER}=="rndis_host"соответствует только USB-устройствам, которые используют драйвер хост-устройства RNDIS (, стандартный драйвер, используемый телефонами Android (, и я думаю, что Windows и Blackberry также )для USB-модема.
  • ACTION=="add"соответствует только событиям горячего подключения (, поэтому это запускается только при подключении устройства, хотя вы можете так же легко добавить второе подобное правило, соответствующее действию «удалить», чтобы что-то делать, когда телефон отключается ).

Последний элемент добавляет команду в очередь вещей, которую udev вызовет, когда обработка правила будет завершена. В этом случае добавляется вызов оболочки, который запишет имя интерфейса в нужное место (udev сам заменит $env{INTERFACE}фактическое имя интерфейса ).

Я не могу гарантировать, что это будет работать во всех случаях, но, по крайней мере, похоже, что это работает на моем Nexus 6P и теоретически должно работать на большинстве телефонов Android.

1
28.01.2020, 00:49

Если порядок не имеет значения, вы можете просто просмотреть все каталоги в /sys/class/net/, пока не найдете тот, который работает и не является петлевым устройством:

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
1
28.01.2020, 00:49

Теги

Похожие вопросы