Cara mendapatkan nama file perangkat dari output lsusb atau berdasarkan jalur perangkat

11

Pertanyaan terkait: Pemberitahuan koneksi USB / putuskan sambungan

Ketika perangkat dicolokkan / dicabut, saya mendapatkan notifikasi instan, itu hebat. Tetapi untuk membuatnya (hampir) sempurna, saya juga ingin mendapatkan nama file perangkat seperti /dev/ttyUSB0, dan, bahkan lebih baik, semua symlinks untuk itu.

Tetapi, saya tidak dapat menemukan cara mendapatkan informasi ini dari udev, atau dari lsusb, atau entah bagaimana caranya . Satu-satunya ID perangkat yang saya miliki adalah jalur perangkat seperti /devices/pci0000:00/0000:00:1d.0/usb5/5-1. Bagaimana cara mendapatkan nama file perangkat dari itu?

Dmitry Frank
sumber
1
Jelajahi direktori di bawah /dev/disk/, jalur dengan label dan by-id mungkin berguna.
lornix
Terima kasih, tetapi /dev/diskhanya berisi perangkat penyimpanan. Katakan, tidak ada apa-apa tentang itu /dev/ttyUSB0.
Dmitry Frank
Apa kasus penggunaan Anda? Apa yang spesial tentang /dev/ttyUSB0dll?
Faheem Mitha

Jawaban:

5

Seandainya saya sedang mencari perangkat untuk kamera UVC saya, lsusb memberi saya:

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

Nama file perangkat kemudian /dev/bus/usb/001/004(komponen pertama adalah id bus, berikutnya adalah id perangkat).

gkanwar
sumber
5
Ini bukan cara orang bisa mendapatkan simpul perangkat seperti /dev/ttyUSB0.
Dmitry Frank
5

Saya baru saja membuat skrip untuk itu, tidak cantik tapi berfungsi untuk saya.

Saya menguji skrip ini di Arch Linux dengan konfigurasi ini:

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

Dan nama perangkat saya /dev/sdbyang sangat berbeda dari milik Anda, saya harap itu akan bekerja untuk Anda juga.

Juga perhatikan bahwa skrip ini tergantung pada usbutilspaket untuk usb-devicesprogram, saya percaya ini diinstal secara default pada semua linux, tetapi saya mungkin salah.

Skrip 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

Pemakaian:

$ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')"
/dev/sdb
VinGarcia
sumber
Ini tidak akan berfungsi jika perangkat USB bukan perangkat blokir.
Kyle Falconer