如何获取/ 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/