指定されたデバイスIDへのUSBデバイスパスを取得します。

指定されたデバイスIDへのUSBデバイスパスを取得します。

USBをマイコンピュータのポートに接続した後、これを行うと、lsusbあなたが探しているデバイスが表示されます。

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

以下にデバイスをリストすると、...などのような多くの/dev/デバイスパスが表示されます。私が理解しているように、これらのパスの1つは私のUSBデバイス、または私のUSBデバイスが接続されている場所です。/dev/tty0/dev/ttyUSB0

どれがIDを持っているのか、どうすればわかりますか04f2:b573


この問題しかし、私と似ています(参照受け入れられた回答$ID_SERIAL)正確には何か、私が探しているIDと同じように設定する方法、さらには正しいパスが何であるかわかりません(その例では/dev/ttyACM0、、、、..などの複数のデバイスパスを表示するためです)。/dev/sdb/dev/input/event5

また、2番目の答えは、デバイスがに接続されていることを知っていると仮定します。/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携帯電話は2つのシリアル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の答えはDebianシステムでは機能しません。また、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

関連情報