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?


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).


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

Cela ne fonctionnera pas si le périphérique USB n'est pas un périphérique bloc.
Kyle Falconer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.