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

Dmi*_*ank 14 linux usb udev devices

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

当设备插入/拔出时,我会收到即时通知,这很棒。但是为了使它(几乎)完美,我还想获得像 一样的设备文件名/dev/ttyUSB0,甚至更好的是,它的所有符号链接。

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

小智 6

假设我正在尝试为我的 UVC 相机找到设备, lsusb 给我:

Bus 001 Device 004: ID 1e4e:0102 Cubeternet GL-UPC822 UVC WebCam
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是获得像`/dev/ttyUSB0`这样的设备节点的方式。 (7认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

我的设备名称/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
Run Code Online (Sandbox Code Playgroud)

用法:

$ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')"
/dev/sdb
Run Code Online (Sandbox Code Playgroud)

  • 如果 USB 设备不是块设备,则此操作将不起作用。 (3认同)