So erhalten Sie den Dateinamen des Geräts von der lsusb-Ausgabe oder nach Gerätepfad

11

Verwandte Frage: Benachrichtigung über USB-Verbindung / Trennung

Wenn das Gerät ein- oder ausgesteckt ist, erhalte ich sofort eine Benachrichtigung, das ist großartig. Aber um es (fast) perfekt zu machen, möchte ich auch den Dateinamen des Geräts /dev/ttyUSB0und, noch besser, alle Symlinks dazu erhalten.

Aber ich kann nicht finden, wie ich diese Informationen von udevoder von lsusboder irgendwie anders bekommen kann. Die einzige ID des Geräts, die ich habe, ist ein Gerätepfad wie /devices/pci0000:00/0000:00:1d.0/usb5/5-1. Wie erhalte ich den Dateinamen des Geräts?

Dmitry Frank
quelle
1
Durchsuchen Sie die Verzeichnisse unter /dev/disk/, die Pfade nach Bezeichnung und nach ID können hilfreich sein.
Lornix
Danke, /dev/diskenthält aber nur Speichergeräte. Sag mal, da ist nichts dran /dev/ttyUSB0.
Dmitry Frank
Was ist Ihr Anwendungsfall? Was ist das Besondere an /dev/ttyUSB0etc?
Faheem Mitha

Antworten:

5

Angenommen, ich versuche, das Gerät für meine UVC-Kamera zu finden, gibt mir lsusb:

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

Der Dateiname des Geräts lautet dann /dev/bus/usb/001/004(die erste Komponente ist die Bus-ID, die nächste die Geräte-ID).

gkanwar
quelle
5
Dies ist nicht die Art und Weise, wie man Geräteknoten wie bekommen kann /dev/ttyUSB0.
Dmitry Frank
5

Ich habe gerade ein Skript dafür erstellt, es ist nicht schön, funktioniert aber für mich.

Ich habe dieses Skript unter Arch Linux mit folgenden Konfigurationen getestet:

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

Und mein Gerätename /dev/sdbunterscheidet sich erheblich von Ihrem. Ich hoffe, dass er auch für Sie funktioniert.

Beachten Sie auch, dass dieses Skript vom usbutilsPaket für das usb-devicesProgramm abhängt. Ich glaube, es ist standardmäßig unter allen Linux installiert, aber ich könnte mich irren.

Skript 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

Verwendungszweck:

$ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')"
/dev/sdb
VinGarcia
quelle
Dies funktioniert nicht, wenn das USB-Gerät kein Blockgerät ist.
Kyle Falconer