Lsusb çıkışından veya aygıt yoluna göre aygıt dosya adı nasıl alınır


11

İlgili soru: USB bağlantı / bağlantı kesme bildirimi

Cihaz takıldığında / çıkarıldığında, anında bildirim alırım, bu harika. Ancak (neredeyse) mükemmel hale getirmek için, cihazın dosya /dev/ttyUSB0adını ve hatta daha da iyisi, tüm sembolik bağlantıları almak istiyorum.

Ancak, bu bilgiyi başka bir udevyerden lsusb, bir yerden ya da başka bir şekilde nasıl bulacağımı bulamıyorum . Sahip olduğum cihazın tek kimliği, gibi bir cihaz yoludur /devices/pci0000:00/0000:00:1d.0/usb5/5-1. Cihazın dosya adı nasıl alınır?


1
Aşağıdaki dizinlere göz atın, /dev/disk/by-label ve by-id yolları yararlı olabilir.
lornix

Teşekkürler, ancak /dev/diskyalnızca depolama aygıtları içerir. Söyle, hiçbir şey yok /dev/ttyUSB0.
Dmitry Frank

Kullanım durumunuz nedir? /dev/ttyUSB0Vb hakkında özel nedir ?
Faheem Mitha

Yanıtlar:


6

UVC kameram için cihazı bulmaya çalıştığımı varsayarsak, lsusb bana şunu verir:

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

Cihazın dosya adı /dev/bus/usb/001/004(ilk bileşen veri yolu kimliğidir, sonraki öğe cihaz kimliğidir) olur.


5
Cihaz düğümü gibi bir yol bu değildir /dev/ttyUSB0.
Dmitry Frank

5

Bunun için bir senaryo hazırladım, hoş değil ama benim için çalışıyor.

Bu komut dosyasını Arch Linux'ta şu yapılandırmalarla test ettim:

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

Cihazımın adı /dev/sdbsizinkinden oldukça farklı, umarım sizin için de çalışır.

Ayrıca, bu komut dosyasının program için usbutilspakete bağlı olduğunu unutmayın, usb-devicesvarsayılan olarak tüm linux üzerine yüklendiğine inanıyorum, ancak yanlış olabilir.

Senaryo 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

Kullanımı:

$ ./usbname "$(lsusb | grep '<my_usb_label_or_id>')"
/dev/sdb

USB cihazı bir blok cihaz değilse bu çalışmaz.
Kyle Falconer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.