如何获取 /dev/ttyUSB 的总线和设备关系

Ern*_*oso 15 server usb udev usb-modem

我需要编写一个脚本来重新启动 USB 加密狗。我拥有所有工具,但无法将我的 /dev/ttyUSBx 链接到物理总线和设备。一个问题是我有三个具有相同 ID 供应商和 ID 产品的加密狗。

如果我做 lsusb 输出是:

Bus 001 Device 004: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 007: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 80ee:0021
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Run Code Online (Sandbox Code Playgroud)

我已将其附加到:

/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5
Run Code Online (Sandbox Code Playgroud)

但是我想知道哪个设备与哪个总线设备相关。例如,我需要获得以下信息:

/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007
Run Code Online (Sandbox Code Playgroud)

我正在使用 Ubuntu Server 10.04 并测试了这些工具:

lsusb
hal
lsmod
Run Code Online (Sandbox Code Playgroud)

但我无法得到这种关系。

Joh*_*ber 11

因为我没有你的硬件,我不能给你一个确切的答案。

我建议你去有问题的设备,例如:

ls -l /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)

并获取主次节点号。假设他们是 116, 7

然后去:

ls -l /sys/dev/char/116:7
Run Code Online (Sandbox Code Playgroud)

( char,因为 tty 是字符设备,如果您要跟踪磁盘设备,您将指定block而不是char)

在命令的输出中,您将看到类似以下内容的内容:

lrwxrwxrwx 1 root root 0 Sep 6 00:17 116:7 -> ../../devices//sys/devices/pci0000:00/0000:00:13.5/pci0000:00/0000:00:13.5/usb1/1-3/1-3:1.1/sound/card1/pcmC1D0c

该目录/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/及其子目录有很多关于设备的信息。例如,/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum。在我的系统上,这些与 /var/log/syslog 中的设备热插拔条目中提到的总线和设备编号相匹配。

在我的系统上为 /dev/video0 工作的其他东西:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
Run Code Online (Sandbox Code Playgroud)


小智 11

将字符设备映射到相应的 USB 设备和总线编号确实不是一个方法/dev/ttyUSB0但是,这是可能的!

像这样的事情可能会奏效:

udevadm info --name=/dev/ttyUSB0 --attribute-walk

从那里,您将获得有关设备及其父设备的大量信息。现在,这只是解析这些数据以获得您想要的。我过去使用过这个:

echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"
Run Code Online (Sandbox Code Playgroud)

现在,如果那不是一口,我不知道是什么!让我们分解一下:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - 返回有关设备及其父设备的信息

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- 解析这些数据并返回任何包含“devnum”或“busnum”属性的行。我们假设首先列出“busnum”......在这种情况下......我们可以抓住输出的前两行。

head -n 2- 获取输出的前 2 行。我们可以在这里变得更花哨,但我们只是假设最接近的父级的“busnum”和“devnum”将首先列出。

awk '{$1 = sprintf("%03d", $1); print}' - 获取这些数字并用零填充它们。

echo /dev/bus/usb... - 所有这些爵士乐都包含在一个echo语句中,用空格替换换行符。如果要切断尾随的换行符,可以添加-nto echo

tr " " "/" - 用正斜杠替换输出中的空格

这将输出如下内容:

/dev/bus/usb/001/011
Run Code Online (Sandbox Code Playgroud)

...当然,这就是设备。如果您愿意,您可以busnum:001 devnum:011通过一些调整轻松输出类似的内容:

echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`
Run Code Online (Sandbox Code Playgroud)