Comment obtenir le nom de fichier du périphérique à partir de la sortie lsusb ou par le chemin du périphérique

11

Question connexe: notification de connexion / déconnexion USB

Lorsque l'appareil est branché / débranché, je reçois une notification instantanée, c'est génial. Mais pour le rendre (presque) parfait, je veux également obtenir le nom de fichier de l'appareil comme /dev/ttyUSB0, et, mieux encore, tous les liens symboliques vers celui-ci.

Mais, je ne trouve pas comment obtenir ces informations de udev, ou de lsusb, ou d'une autre manière. Le seul ID de l'appareil que j'ai est un chemin d'accès comme celui-ci /devices/pci0000:00/0000:00:1d.0/usb5/5-1. Comment obtenir le nom de fichier de l'appareil?

Dmitry Frank
la source
1
Parcourez les répertoires sous /dev/disk/, les chemins par étiquette et par id peuvent être utiles.
lornix
Merci, mais /dev/diskne contient que des périphériques de stockage. Dis, il n'y a rien /dev/ttyUSB0.
Dmitry Frank
Quel est votre cas d'utilisation? Quelle est la particularité de /dev/ttyUSB0etc?
Faheem Mitha

Réponses:

5

En supposant que j'essaie de trouver l'appareil pour ma caméra UVC, lsusb me donne:

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

Le nom de fichier du périphérique est alors /dev/bus/usb/001/004(le premier composant est l'identifiant du bus, le suivant est l'identifiant du périphérique).

gkanwar
la source
5
Ce n'est pas ainsi que l'on peut obtenir un nœud de périphérique comme /dev/ttyUSB0.
Dmitry Frank
5

Je viens de construire un script pour ça, ce n'est pas joli mais ça marche pour moi.

J'ai testé ce script sur Arch Linux avec ces configurations:

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

Et le nom de mon appareil /dev/sdbest assez différent du vôtre, j'espère qu'il fonctionnera également pour vous.

Notez également que ce script dépend du usbutilspackage du usb-devicesprogramme, je pense qu'il est installé par défaut sur tous les linux, mais je peux me tromper.

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

Usage:

$ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')"
/dev/sdb
VinGarcia
la source
Cela ne fonctionnera pas si le périphérique USB n'est pas un périphérique bloc.
Kyle Falconer