So erhalten Sie den Gerätedateinamen aus der lsusb-Ausgabe oder über den Gerätepfad

So erhalten Sie den Gerätedateinamen aus der lsusb-Ausgabe oder über den Gerätepfad

Verwandte Frage:Benachrichtigung über USB-Verbindung/-Trennung

Wenn das Gerät angeschlossen/abgezogen wird, erhalte ich sofort eine Benachrichtigung. Das ist großartig. Aber um es (fast) perfekt zu machen, möchte ich auch den Gerätedateinamen /dev/ttyUSB0und, noch besser, alle symbolischen Links dazu erhalten.

Ich kann jedoch nicht herausfinden, wie ich diese Informationen von udev, von lsusb, oder sonst wie bekomme. 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 bekomme ich daraus den Gerätedateinamen?

Antwort1

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

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

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

Antwort2

Ich habe gerade ein Skript dafür erstellt. Es sieht nicht schön aus, funktioniert aber für mich.

Ich habe dieses Skript unter Arch Linux mit diesen 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 deutlich von Ihrem. Ich hoffe, dass er bei Ihnen auch funktioniert.

Beachten Sie auch, dass dieses Skript vom usbutilsProgrammpaket abhängt usb-devices. Ich glaube, es ist standardmäßig auf allen Linux-Betriebssystemen 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

Verwendung:

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

Antwort3

Ich verwende diese kleine Bash-Funktion

getdevice() {
    idV=${1%:*}
    idP=${1#*:}
    for path in `find /sys/ -name idVendor | rev | cut -d/ -f 2- | rev`; do
        if grep -q $idV $path/idVendor; then
            if grep -q $idP $path/idProduct; then
                find $path -name 'device' | rev | cut -d / -f 2 | rev
            fi
        fi
    done
}

Beispiel

# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 8087:0a2b Intel Corp.
Bus 001 Device 012: ID 0bda:2832 Realtek Semiconductor Corp. RTL2832U DVB-T
Bus 001 Device 053: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 051: ID 1cf1:0030 Dresden Elektronik
Bus 001 Device 006: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 004: ID 05e3:0606 Genesys Logic, Inc. USB 2.0 Hub / D-Link DUB-H4 USB 2.0 Hub
Bus 001 Device 003: ID 0658:0200 Sigma Designs, Inc. Aeotec Z-Stick Gen5 (ZW090) - UZB
Bus 001 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

und entsprechende Geräte

# getdevice 051d:0002
hiddev0
hidraw0

# getdevice 1a86:7523
ttyUSB0

# getdevice 0658:0200
ttyACM1

verwandte Informationen