Come ottenere il nome del dispositivo dall'output di lsusb o dal percorso del dispositivo


11

Domanda correlata: notifica di connessione / disconnessione USB

Quando il dispositivo è collegato / scollegato, ricevo una notifica istantanea, è fantastico. Ma per renderlo (quasi) perfetto, voglio anche ottenere il nome del dispositivo come /dev/ttyUSB0, e, ancora meglio, tutti i collegamenti simbolici ad esso.

Ma non riesco a trovare come ottenere queste informazioni da udev, o da lsusb, o in qualche altro modo. L'unico ID del dispositivo che ho è un percorso del dispositivo simile /devices/pci0000:00/0000:00:1d.0/usb5/5-1. Come ottenere il nome del dispositivo da esso?


1
Sfoglia le directory sotto /dev/disk/, i percorsi per etichetta e per ID potrebbero essere utili.
Lornix,

Grazie, ma /dev/diskcontiene solo dispositivi di archiviazione. Di ', non c'è niente /dev/ttyUSB0.
Dmitry Frank,

Qual è il tuo caso d'uso? Cosa c'è di speciale /dev/ttyUSB0ecc?
Faheem Mitha,

Risposte:


5

Supponendo che sto cercando di trovare il dispositivo per la mia fotocamera UVC, lsusb mi dà:

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

Il nome del dispositivo è quindi /dev/bus/usb/001/004(il primo componente è l'ID del bus, il successivo è l'ID del dispositivo).


5
Questo non è il modo in cui si può ottenere un nodo del dispositivo simile /dev/ttyUSB0.
Dmitry Frank,

5

Ho appena creato una sceneggiatura per questo, non è carina ma funziona per me.

Ho testato questo script su Arch Linux con queste configurazioni:

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

E il mio nome del dispositivo /dev/sdbè piuttosto diverso dal tuo, spero che funzionerà anche per te.

Nota anche che questo script dipende dal usbutilspacchetto per il usb-devicesprogramma, credo che sia installato di default su tutti i Linux, ma potrei sbagliarmi.

Script 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

Uso:

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

Questo non funzionerà se il dispositivo USB non è un dispositivo a blocchi.
Kyle Falconer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.