지정된 장치 ID에 대한 USB 장치 경로를 가져옵니다.

지정된 장치 ID에 대한 USB 장치 경로를 가져옵니다.

USB를 내 컴퓨터의 포트에 연결한 후 이렇게 하면 lsusb내가 찾고 있는 장치가 표시됩니다.

Bus 001 Device 004: ID 04f2:b573 Some Manufacturer

아래에 장치를 나열하면 ...등과 같은 /dev/많은 장치 경로를 볼 수 있습니다 . 내가 이해한 바에 따르면 이러한 경로 중 하나는 내 USB 장치이거나 내 USB 장치가 연결된 위치입니다./dev/tty0/dev/ttyUSB0

어느 것이 ID를 갖고 있는지 어떻게 알 수 있나요 04f2:b573?


이 문제그러나 내 것과 비슷합니다 (참조수락된 답변$ID_SERIAL) 정확히 무엇인지 , 내가 찾고 있는 ID와 동일하게 설정하는 방법, 심지어 올바른 경로가 무엇인지 모릅니다 (그의 예에서는 /dev/ttyACM0,,,..와 같은 여러 장치 경로를 보여주기 때문입니다)./dev/sdb/dev/input/event5

또한 두 번째 답변은 장치가 에 연결되어 있다는 것을 알고 있다고 가정합니다. /dev/ttyUSB0이는 미리 알지 못합니다(그런데 이 특정 경로에서 테스트해도 아무 것도 제공되지 않았습니다).

답변1

어느 것이 ID를 갖고 있는지 어떻게 알 수 있나요 04f2:b573?

이 작업을 수행하는 더 좋은 방법이 있을 수 있지만 빠르고 더러운 방법은 다음과 같습니다.

find_by_id(){
    v=${1%:*}; p=${1#*:}  # split vid:pid into 2 vars
    v=${v#${v%%[!0]*}}; p=${p#${p%%[!0]*}}  # strip leading zeros
    grep -il "^PRODUCT=$v/$p" /sys/bus/usb/devices/*:*/uevent |
    sed s,uevent,, |
    xargs -r grep -r '^DEVNAME=' --include uevent
}
find_by_id 04f2:b573

내 기존 Huawei 휴대폰이 두 개의 직렬 tty로 표시됩니다.

$ find_by_id 12d1:
/sys/bus/usb/devices/3-1:1.0/ttyUSB0/tty/ttyUSB0/uevent:DEVNAME=ttyUSB0
/sys/bus/usb/devices/3-1:1.1/ttyUSB1/tty/ttyUSB1/uevent:DEVNAME=ttyUSB1

마지막 grep을 다음으로 변경할 수 있습니다.

xargs -r egrep -rB2 '^DEVNAME=|^IFINDEX=' --include uevent

USB 네트워크 인터페이스도 찾으려면:

$ find_by_id 0e8d:
/sys/bus/usb/devices/1-6.2.3:1.0/net/usb0/uevent-INTERFACE=usb0
/sys/bus/usb/devices/1-6.2.3:1.0/net/usb0/uevent:IFINDEX=10

$ find_by_id 03f0:
/sys/bus/usb/devices/1-6.3:1.1/usbmisc/lp1/uevent-MAJOR=180
/sys/bus/usb/devices/1-6.3:1.1/usbmisc/lp1/uevent-MINOR=1
/sys/bus/usb/devices/1-6.3:1.1/usbmisc/lp1/uevent:DEVNAME=usb/lp1

답변2

/sys/bus/usb/devices에 기호 링크가 포함되어 있기 때문에 @mosvy의 답변은 데비안 시스템에서 작동하지 않습니다. 또한 grep -R파일 시스템에 심볼릭 링크 루프가 포함되어 있으므로 심볼릭 링크를 따라가는 방식으로는 작동하지 않습니다 .

원하는 것을 얻는 더 쉬운 방법은 다음과 같습니다.

lsusb | grep NameOfYourDevice | sed -nr 's|Bus (.*) Device ([^:]*):.*|/dev/bus/usb/\1/\2|p'

lsusb(usbutils 패키지의) 출력을 /dev/bus/usb/... 경로로 변환합니다.

블록/문자 장치 이름이 필요한 경우 다음과 같이 시도하십시오.

device() {
    v=${1%:*}; p=${1#*:}
    for dir in `find /sys/ -name idVendor | rev | cut -d/ -f 2- | rev`; do
        if grep -q $v $dir/idVendor; then
            if grep -q $p $dir/idProduct; then
                find $dir -name 'device' | rev | cut -d / -f 2 | rev
            fi
        fi
    done
}

답변3

모든 *unix 시스템에서 작동하는지 잘 모르겠습니다. 하지만 내 컴퓨터에서는 /dev/bus/{BUSID}/{DEVICEID}버스 ID와 장치 ID에 액세스할 수 있습니다 lsusb.

관련 정보