Jak uzyskać nazwę pliku urządzenia z wyjścia lsusb lub według ścieżki urządzenia

11

Powiązane pytanie: Powiadomienie o połączeniu / rozłączeniu USB

Gdy urządzenie jest podłączone / odłączone, otrzymuję natychmiastowe powiadomienie, to świetnie. Ale aby był (prawie) idealny, chcę również uzyskać nazwę pliku urządzenia /dev/ttyUSB0, a jeszcze lepiej wszystkie dowiązania symboliczne do niego.

Ale nie mogę znaleźć sposobu na uzyskanie tych informacji z udev, z lsusblub w jakikolwiek inny sposób. Jedyny identyfikator posiadanego urządzenia to ścieżka urządzenia /devices/pci0000:00/0000:00:1d.0/usb5/5-1. Jak uzyskać z niego nazwę urządzenia?

Dmitry Frank
źródło
1
Przejrzyj katalogi poniżej /dev/disk/, mogą się przydać ścieżki by-label i by-id.
lornix
Dzięki, ale /dev/diskzawiera tylko urządzenia pamięci masowej. Powiedz, że nic nie ma /dev/ttyUSB0.
Dmitry Frank
Jaki jest twój przypadek użycia? Co jest specjalnego w /dev/ttyUSB0etc?
Faheem Mitha

Odpowiedzi:

6

Przypuśćmy, że próbuję znaleźć urządzenie dla mojej kamery UVC, lsusb daje mi:

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

Nazwa pliku urządzenia to /dev/bus/usb/001/004(pierwszy komponent to identyfikator magistrali, następny to identyfikator urządzenia).

gkanwar
źródło
5
W ten sposób nie można uzyskać węzła urządzenia /dev/ttyUSB0.
Dmitry Frank
5

Właśnie zbudowałem skrypt do tego, nie jest ładny, ale działa dla mnie.

Testowałem ten skrypt na Arch Linux z następującymi konfiguracjami:

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

A nazwa mojego urządzenia /dev/sdbjest zupełnie inna niż twoja, mam nadzieję, że to również zadziała.

Zauważ też, że ten skrypt zależy od usbutilspakietu dla usb-devicesprogramu, uważam, że jest instalowany domyślnie na wszystkich systemach Linux, ale mogę się mylić.

Skrypt 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

Stosowanie:

$ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')"
/dev/sdb
VinGarcia
źródło
To nie zadziała, jeśli urządzenie USB nie jest urządzeniem blokowym.
Kyle Falconer