我需要编写一个用于重启 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
但我无法建立这种关系。
答案1
确实没有好的将字符设备映射/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}'
- 取出这些数字并用零填充。
echo /dev/bus/usb
...- 所有这些代码都包含在一个语句中,用于用空格替换换行符。如果要截断尾随的换行符,echo
可以添加 to -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;}'`
答案2
由于我没有您的硬件,所以我无法给您确切的答案。
我建议您转到有问题的设备,例如:
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
。在我的系统上,它们与 /var/log/syslog 中的设备热插拔条目中提到的总线和设备编号相匹配。
在我的系统上 /dev/video0 还可以运行其他程序:
find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
答案3
您可以使用以下命令找到有关节点的许多信息:
udevadm info -a -p /sys/bus/usb-serial/devices/<specific tty>/
例如
udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
最后一个斜线是可选的
如果没有组件,您将看到“未找到 syspath”
在许多情况下,此命令带来相同的信息udevadm info --name=/dev/<specific tty> --attribute-walk