Cómo obtener el nombre de archivo del dispositivo desde la salida lsusb o por ruta del dispositivo

Cómo obtener el nombre de archivo del dispositivo desde la salida lsusb o por ruta del dispositivo

Pregunta relacionada:Notificación de conexión/desconexión USB

Cuando el dispositivo se conecta o desconecta, recibo una notificación instantánea, eso es genial. Pero para hacerlo (casi) perfecto, también quiero obtener el nombre de archivo del dispositivo como /dev/ttyUSB0y, mejor aún, todos los enlaces simbólicos al mismo.

Pero no puedo encontrar cómo obtener esta información de udev, o de lsusb, o de alguna otra manera. La única identificación del dispositivo que tengo es una ruta de dispositivo como /devices/pci0000:00/0000:00:1d.0/usb5/5-1. ¿Cómo obtener el nombre de archivo del dispositivo?

Respuesta1

Suponiendo que estoy intentando encontrar el dispositivo para mi cámara UVC, lsusb me da:

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

El nombre de archivo del dispositivo es entonces /dev/bus/usb/001/004(el primer componente es la identificación del bus, el siguiente es la identificación del dispositivo).

Respuesta2

Acabo de crear un script para eso, no es bonito pero funciona para mí.

Probé este script en Arch Linux con estas configuraciones:

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

Y el nombre de mi dispositivo es /dev/sdbbastante diferente al tuyo, espero que te funcione también.

También tenga en cuenta que este script depende del usbutilspaquete del usb-devicesprograma, creo que está instalado de forma predeterminada en todos los Linux, pero podría estar equivocado.

Guion 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

Respuesta3

Yo uso esta pequeña función bash

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
}

Ejemplo

# 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

y dispositivos correspondientes

# getdevice 051d:0002
hiddev0
hidraw0

# getdevice 1a86:7523
ttyUSB0

# getdevice 0658:0200
ttyACM1

información relacionada