Como obter o nome do arquivo do dispositivo da saída lsusb ou pelo caminho do dispositivo

8

Pergunta relacionada: Notificação de conexão / desconexão USB

Quando o dispositivo está conectado / desconectado, recebo uma notificação instantânea, ótimo. Mas para torná-lo (quase) perfeito, também quero obter o nome do arquivo do dispositivo como /dev/ttyUSB0 e, melhor ainda, todos os links simbólicos para ele.

Mas não consigo encontrar como obter essas informações em udev ou lsusb ou de alguma outra forma. O único ID do dispositivo que tenho é um caminho de dispositivo como /devices/pci0000:00/0000:00:1d.0/usb5/5-1 . Como obter o nome do arquivo do dispositivo?

    
por Dmitry Frank 12.06.2014 / 16:47

2 respostas

4

Supondo que eu esteja tentando encontrar o dispositivo para minha câmera UVC, o lsusb me dá:

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

O nome do arquivo do dispositivo é, então, /dev/bus/usb/001/004 (o primeiro componente é o id do barramento, o próximo é o id do dispositivo).

    
por 12.11.2014 / 04:07
3

Acabei de criar um script para isso, não é bonito, mas funciona para mim.

Eu testei este script no Arch Linux com estas configurações:

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

E o nome do meu dispositivo é /dev/sdb , o que é bem diferente do seu, espero vai funcionar para você também.

Observe também que este script depende do pacote usbutils package para usb-devices , acredito que esteja instalado por padrão em todo o linux, mas eu posso estar errado.

Script 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

Espero que ajude.

    
por 22.06.2016 / 05:39