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

我需要编写一个重启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 

我已将其附加到:

 /dev/ttyUSB0 /dev/ttyUSB3 /dev/ttyUSB5 

但我想知道哪个设备与哪个总线设备有关。 通过示例,我需要获得以下内容:

 /dev/ttyUSB0 -> Bus 001 Device 006 /dev/ttyUSB3 -> Bus 001 Device 004 /dev/ttyUSB5 -> Bus 001 Device 007 

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

 lsusb hal lsmod 

但我无法得到这种关系。

由于我没有你的硬件,我无法给你一个确切的答案。

我建议您转到有问题的设备,例如:

 ls -l /dev/ttyUSB0 

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

然后去:

 ls -l /sys/dev/char/116:7 

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 /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum / /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum /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中设备hotplug条目中提到的总线和设备号。

我的系统上/ dev / video0的其他function:

 find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null 

确实没有一种方法可以将/dev/ttyUSB0等字符设备映射到相应的USB设备和总线编号。 但是,有可能!

这样的事情可能有用:

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

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

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}' awk '{$1 = sprintf("%03d", $1); print}' – 取这些数字并用零填充它们。

echo /dev/bus/usb – 所有这些爵士乐都被包装成一个echo语句,用空格替换换行符。 如果要切断尾随换行符,可以将-n添加到echo

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

这将输出如下内容:

 /dev/bus/usb/001/011 

……当然,这是设备。 如果您愿意,可以轻松输出诸如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;}'` 

您可以使用以下命令找到有关节点的所有信息:

 udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/