如何检测 Android 设备何时通过 USB 网络共享连接并获取其接口名称?

如何检测 Android 设备何时通过 USB 网络共享连接并获取其接口名称?

我继承了一个 bash 脚本,该脚本需要检测通过 USB 网络共享连接的任何 Android 设备的接口名称,然后将该接口名称写入另一个变量。这是现有的代码(简化)。

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

如果未来的Android设备被赋予不同的接口名称,那么在我们发现脚本不起作用后,就必须手动修改代码。显然,这是一个非常糟糕的实施。

有什么更好的方法可以达到相同的结果?

编辑1:

我真正的意思是,如何重构这段代码,以便不需要对每个接口名称进行硬编码?

答案1

在理想的情况下?将其重写为 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"仅匹配使用 RNDIS 主机设备驱动程序的 USB 设备(Android 手机(我认为 Windows 和黑莓也是如此)用于 USB 网络共享的标准驱动程序)。
  • ACTION=="add"仅匹配热插拔事件(因此仅在设备连接时运行,尽管您可以轻松地在“删除”操作上添加第二个类似的规则匹配以在手机拔出插头时执行某些操作)。

最后一项将一个命令添加到规则处理完成时 udev 将调用的事物队列中。在本例中,它添加了一个 shell 调用,该调用将把接口名称写到所需的位置(udev 本身将替换$env{INTERFACE}实际的接口名称)。

我不能保证这在所有情况下都有效,但它至少似乎适用于我的 Nexus 6P,并且理论上应该适用于大多数 Android 手机。

答案2

如果顺序没有意义,您可能会循环遍历所有目录,/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

相关内容