Как получить имя файла устройства из вывода lsusb или по пути устройства

11

Связанный вопрос: уведомление о подключении / отключении через USB

Когда устройство подключено / отключено, я получаю мгновенное уведомление, это здорово. Но чтобы сделать его (почти) идеальным, я также хочу получить имя файла устройства /dev/ttyUSB0и, что еще лучше, все символические ссылки на него.

Но я не могу найти, как получить эту информацию udev, или откуда lsusb, или как-то еще. Единственный идентификатор устройства, которое у меня есть, это путь к устройству /devices/pci0000:00/0000:00:1d.0/usb5/5-1. Как получить имя файла устройства от него?

Дмитрий Франк
источник
1
Просмотрите каталоги под /dev/disk/, могут быть полезны пути by-label и by-id.
Lornix
Спасибо, но /dev/diskсодержит только устройства хранения. Скажи, ничего не значит /dev/ttyUSB0.
Дмитрий Франк
Какой у вас вариант использования? Что особенного в этом /dev/ttyUSB0?
Фахим Митха

Ответы:

6

Предположим, я пытаюсь найти устройство для своей UVC камеры, lsusb дает мне:

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

Тогда имя файла устройства /dev/bus/usb/001/004(первый компонент - идентификатор шины, следующий - идентификатор устройства).

gkanwar
источник
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
VinGarcia
источник
Это не будет работать, если USB-устройство не является блочным устройством.
Кайл Фалконер