![lsusb 출력 또는 장치 경로로 장치 파일 이름을 얻는 방법](https://linux55.com/image/38026/lsusb%20%EC%B6%9C%EB%A0%A5%20%EB%98%90%EB%8A%94%20%EC%9E%A5%EC%B9%98%20%EA%B2%BD%EB%A1%9C%EB%A1%9C%20%EC%9E%A5%EC%B9%98%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
관련 질문:USB 연결/연결 해제 알림
장치가 연결되거나 연결 해제되면 즉시 알림을 받습니다. 정말 좋습니다. 하지만 (거의) 완벽하게 만들기 위해 장치 파일 이름(예 /dev/ttyUSB0
: , 더 나아가 모든 심볼릭 링크) 도 가져오고 싶습니다 .
udev
그러나 이 정보를 , 또는 기타 에서 가져오는 방법을 찾을 수 없습니다 lsusb
. 내가 가지고 있는 장치의 고유 ID는 장치 경로입니다 /devices/pci0000:00/0000:00:1d.0/usb5/5-1
. 예: 장치 파일 이름을 어떻게 얻을 수 있나요?
답변1
UVC 카메라용 장치를 찾으려고 한다고 가정하면 lsusb는 다음을 제공합니다.
Bus 001 Device 004: ID 1e4e:0102 Cubeternet GL-UPC822 UVC WebCam
그런 다음 장치 파일 이름 /dev/bus/usb/001/004
(첫 번째 구성 요소는 버스 ID이고 그 뒤에 장치 ID가 옵니다)입니다.
답변2
방금 이것에 대한 스크립트를 만들었습니다. 예쁘지는 않지만 저에게는 작동합니다.
다음 구성을 사용하여 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
또한 이 스크립트는 모든 Linux에 기본적으로 설치되어 있다고 생각되는 package 에 의존 usb-devices
하지만 제가 틀렸을 수도 있습니다.
스크립트 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
답변3
나는 이 작은 bash 기능을 사용합니다.
getdevice() {
idV=${1%:*}
idP=${1#*:}
for path in `find /sys/ -name idVendor | rev | cut -d/ -f 2- | rev`; do
if grep -q $idV $path/idVendor; then
if grep -q $idP $path/idProduct; then
find $path -name 'device' | rev | cut -d / -f 2 | rev
fi
fi
done
}
예
# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 8087:0a2b Intel Corp.
Bus 001 Device 012: ID 0bda:2832 Realtek Semiconductor Corp. RTL2832U DVB-T
Bus 001 Device 053: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
Bus 001 Device 051: ID 1cf1:0030 Dresden Elektronik
Bus 001 Device 006: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 004: ID 05e3:0606 Genesys Logic, Inc. USB 2.0 Hub / D-Link DUB-H4 USB 2.0 Hub
Bus 001 Device 003: ID 0658:0200 Sigma Designs, Inc. Aeotec Z-Stick Gen5 (ZW090) - UZB
Bus 001 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
및 해당 장비
# getdevice 051d:0002
hiddev0
hidraw0
# getdevice 1a86:7523
ttyUSB0
# getdevice 0658:0200
ttyACM1