วิธีรับชื่อไฟล์อุปกรณ์จากเอาต์พุต lsusb หรือตามเส้นทางอุปกรณ์


11

คำถามที่เกี่ยวข้อง: การแจ้งเตือนการเชื่อมต่อ USB / ตัดการเชื่อมต่อ

เมื่อเสียบอุปกรณ์ / ถอดปลั๊กฉันได้รับการแจ้งเตือนทันทีว่ายอดเยี่ยม แต่เพื่อให้สมบูรณ์แบบ (เกือบ) ฉันต้องการได้ชื่อไฟล์ของอุปกรณ์เช่น/dev/ttyUSB0และที่ดีกว่านั้นคือการเชื่อมโยงทั้งหมดกับมัน

แต่ฉันไม่สามารถหาข้อมูลนี้ได้จากudevหรือจากlsusbหรืออย่างอื่น /devices/pci0000:00/0000:00:1d.0/usb5/5-1รหัสเฉพาะของอุปกรณ์ที่ฉันมีเป็นเส้นทางอุปกรณ์เช่น จะรับชื่ออุปกรณ์ได้อย่างไร


1
เรียกดูไดเรกทอรีภายใต้/dev/disk/เส้นทางแบบ by-label และ by-id อาจถูกใช้งาน
lornix

ขอบคุณ แต่/dev/diskมีเพียงอุปกรณ์จัดเก็บข้อมูล /dev/ttyUSB0กล่าวว่าไม่มีอะไรที่เกี่ยวกับ
Dmitry Frank

กรณีการใช้งานของคุณคืออะไร? มีอะไรพิเศษเกี่ยวกับ/dev/ttyUSB0ฯลฯ
Faheem Mitha

คำตอบ:


6

สมมติว่าฉันพยายามหาอุปกรณ์สำหรับกล้อง UVC ของฉัน lsusb ให้ฉัน:

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

ชื่อไฟล์อุปกรณ์นั้น/dev/bus/usb/001/004(ส่วนประกอบแรกคือบัส ID, ถัดไปคือรหัสอุปกรณ์)


5
/dev/ttyUSB0นี้ไม่ได้เป็นวิธีหนึ่งที่จะได้รับโหนดอุปกรณ์เช่น
Dmitry Frank

5

ฉันเพิ่งสร้างสคริปต์เพื่อมันไม่สวย แต่ใช้งานได้สำหรับฉัน

ฉันทดสอบสคริปต์นี้บน Arch Linux ด้วยการกำหนดค่านี้:

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

และชื่ออุปกรณ์ของฉัน/dev/sdbซึ่งค่อนข้างแตกต่างจากของคุณฉันหวังว่ามันจะใช้ได้สำหรับคุณเช่นกัน

โปรดทราบด้วยว่าสคริปต์นี้ขึ้นอยู่กับusbutilsแพ็คเกจของusb-devicesโปรแกรมฉันเชื่อว่ามันจะติดตั้งตามค่าเริ่มต้นบน linux ทั้งหมด แต่ฉันอาจผิด

สคริปต์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

การใช้งาน:

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

สิ่งนี้จะไม่ทำงานหากอุปกรณ์ USB ไม่ใช่อุปกรณ์บล็อค
Kyle Falconer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.