如何从lsusb输出或设备路径获取设备文件名


11

相关问题:USB连接/断开通知

插入/拔出设备后,我会立即收到通知,这很棒。但是要使其(几乎)完美,我还希望获得设备文件名,例如/dev/ttyUSB0,甚至更好的是所有指向它的符号链接。

但是,我找不到如何从udev,或从lsusb或其他方式获取此信息。我拥有的设备的唯一ID是类似的设备路径/devices/pci0000:00/0000:00:1d.0/usb5/5-1。如何从中获取设备文件名?


1
浏览目录下的目录/dev/disk/,by-label和by-id路径可能有用。
lornix 2014年

谢谢,但/dev/disk仅包含存储设备。说,什么都没有/dev/ttyUSB0
德米特里·弗兰克

您的用例是什么?等有什么特别之处/dev/ttyUSB0
Faheem Mitha

Answers:


6

假设我想为我的UVC相机找到设备,lsusb给我以下信息:

Bus 001 Device 004: ID 1e4e:0102 Cubeternet GL-UPC822 UVC WebCam

然后,设备文件名是/dev/bus/usb/001/004(第一个组件是总线ID,下一个是设备ID)。


5
这不是获得设备节点之类的方法/dev/ttyUSB0
德米特里·弗兰克

5

我刚刚为此构建了一个脚本,它虽然不漂亮,但对我有用。

我在具有以下配置的Arch Linux上测试了此脚本:

$ uname -a
Linux 4.4.13-1-lts #1 SMP Wed Jun 8 16:44:31 CEST 2016 x86_64 GNU/Linux

我的设备名称与您的设备名称/dev/sdb完全不同,我希望它也对您有用。

另请注意,此脚本取决于usbutils程序的软件包usb-devices,我相信默认情况下,它已在所有linux上安装,但我可能错了。

剧本usbname

#!/usr/bin/bash

# Input should be a single line from lsusb output:
DATA=$1

# Read the bus number:
BUS=`echo $DATA | grep -Po 'Bus 0*\K[1-9]+'`

# Read the device number:
DEV=`echo $DATA | grep -Po 'Device 0*\K[1-9]+'`

FOUND=false
USB_Serial=""

# Search for the serial number of the PenDrive:
while read line
do
  if [ $FOUND == true ]; then
    USB_Serial=`echo "$line" | grep -Po 'SerialNumber=\K.*'`
    if [ "$USB_Serial" != "" ]; then
      break;
    fi
  fi

  if [ "`echo "$line" | grep -e "Bus=0*$BUS.*Dev#= *$DEV"`" != "" ]; then
    FOUND=true
  fi
done <<< "$(usb-devices)"

# Get the base name of the block device, e.g.: "sdx"
BASENAME=`file /dev/disk/by-id/* | grep -v 'part' | grep -Po "$USB_Serial.*/\K[^/]+$"`

# Build the full address, e.g.: "/dev/sdx"
NAME="/dev/$BASENAME"

# Output the address:
echo $NAME

用法:

$ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')"
/dev/sdb

如果USB设备不是块设备,则无法使用。
Kyle Falconer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.