Cách lấy tên tệp thiết bị từ đầu ra lsusb hoặc theo đường dẫn thiết bị


11

Câu hỏi liên quan: Thông báo kết nối / ngắt kết nối USB

Khi thiết bị được cắm / rút phích cắm, tôi nhận được thông báo ngay lập tức, điều đó thật tuyệt. Nhưng để làm cho nó (gần như) hoàn hảo, tôi cũng muốn có được tên tệp thiết bị như thế /dev/ttyUSB0, và, thậm chí tốt hơn, tất cả các liên kết tượng trưng cho nó.

Nhưng, tôi không thể tìm cách lấy thông tin này từ udevhoặc từ lsusbhoặc bằng cách nào khác. ID duy nhất của thiết bị tôi có là đường dẫn thiết bị như thế nào /devices/pci0000:00/0000:00:1d.0/usb5/5-1. Làm thế nào để có được tên tệp thiết bị từ nó?


1
Duyệt các thư mục bên dưới /dev/disk/, các đường dẫn by-nhãn và by-id có thể được sử dụng.
lornix

Cảm ơn, nhưng /dev/diskchỉ chứa các thiết bị lưu trữ. Nói, không có gì về /dev/ttyUSB0.
Dmitry Frank

Trường hợp sử dụng của bạn là gì? Có gì đặc biệt về /dev/ttyUSB0vv?
Faheem Mitha

Câu trả lời:


5

Giả sử tôi đang cố gắng tìm thiết bị cho máy ảnh UVC của mình, lsusb cho tôi:

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

Tên tệp thiết bị là sau đó /dev/bus/usb/001/004(thành phần đầu tiên là id bus, tiếp theo là id thiết bị).


5
Đây không phải là cách người ta có thể có được nút thiết bị như thế nào /dev/ttyUSB0.
Dmitry Frank

5

Tôi vừa mới xây dựng một kịch bản cho điều đó, nó không hay nhưng hiệu quả với tôi.

Tôi đã thử nghiệm tập lệnh này trên Arch Linux với các cấu hình này:

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

Và tên thiết bị của tôi /dev/sdbkhá khác với tên của bạn, tôi hy vọng nó cũng sẽ phù hợp với bạn.

Cũng lưu ý rằng tập lệnh này phụ thuộc vào usbutilsgói cho usb-deviceschương trình, tôi tin rằng nó được cài đặt mặc định trên tất cả linux, nhưng tôi có thể sai.

Kịch bản 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

Sử dụng:

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

Điều này sẽ không hoạt động nếu thiết bị USB không phải là thiết bị chặn.
Kyle Falconer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.