Як отримати ім'я файлу пристрою з виводу 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тощо?
Faheem Mitha

Відповіді:


6

Припустимо, що я намагаюся знайти пристрій для своєї UVC-камери, lsusb дає мені:

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

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


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 не є блочним пристроєм.
Кайл Фальконер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.