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?


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


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

Ini tidak akan berfungsi jika perangkat USB bukan perangkat blokir.
Kyle Falconer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.