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?


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).


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

Dies funktioniert nicht, wenn das USB-Gerät kein Blockgerät ist.
Kyle Falconer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.