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

11

: Pregunta notificación de desconexión / conexión USB

Cuando el dispositivo está enchufado / desconectado, recibo una notificación instantánea, eso es genial. Pero para hacerlo (casi) perfecto, también quiero obtener el nombre de archivo del dispositivo /dev/ttyUSB0, y, mejor aún, todos los enlaces simbólicos.

Pero, no puedo encontrar cómo obtener esta información udev, o de lsusbalguna 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?

Dmitry Frank
fuente
1
Examine los directorios debajo /dev/disk/, las rutas de etiqueta y de identificación pueden ser útiles.
lornix
Gracias, pero /dev/disksolo contiene dispositivos de almacenamiento. Por ejemplo, no hay nada acerca /dev/ttyUSB0.
Dmitry Frank
¿Cuál es su caso de uso? ¿Qué tiene de especial, /dev/ttyUSB0etc.?
Faheem Mitha

Respuestas:

5

Suponiendo que estoy tratando de 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).

gkanwar
fuente
55
Esta no es la forma en que uno puede obtener un nodo de dispositivo como /dev/ttyUSB0.
Dmitry Frank
5

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 /dev/sdbes bastante diferente al tuyo, espero que también funcione para ti.

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

Guión 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
VinGarcia
fuente
Esto no funcionará si el dispositivo USB no es un dispositivo de bloque.
Kyle Falconer