デバイスポートを確認するコマンド(例:/dev/ttyUSB0)

デバイスポートを確認するコマンド(例:/dev/ttyUSB0)

Linuxポートについて質問があります。 USB経由でデバイスを接続し、そのポートを確認したい場合は、そのバスのバス番号とデバイス番号のみを指定するlsusbコマンドを使用してこれを行うことはできません。

[ziga@Ziga-PC ~]$ lsusb
Bus 003 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

デバイスが直接接続されているポートを知らせるコマンドはありますか?これまでの唯一の方法は、切断して再接続してから次のコマンドを使用することです。

[ziga@Ziga-PC ~]$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    0.929510] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.378109] systemd[1]: Starting system-getty.slice.
[    4.378543] systemd[1]: Created slice system-getty.slice.
[    8.786474] usb 3-4.4: FTDI USB Serial Device converter now attached to ttyUSB0

最後の行から、私のデバイスが次に接続されていることがわかります。/dev/ttyUSB0

ベストアンサー1

何を求めているのか分からない。 「ポート」に何度も言及しましたが、あなたの例では/dev/ttyUSB0ポートではなくデバイス開発パスと答えました。したがって、この答えは各デバイスの開発パスを見つけることです。

以下は、属性を持つUSBデバイス/sysを探すデバイスを繰り返す迅速で汚れたスクリプトです。ID_SERIAL通常、実際のUSBデバイスにのみこのプロパティがあるため、フィルタリングに使用できます。これを行わないと、リストに実際のデバイスではなく多くの項目が表示されます。

#!/bin/bash

for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && exit
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && exit
        echo "/dev/$devname - $ID_SERIAL"
    )
done

私のシステムでは、次のような結果が発生します。

/dev/ttyACM0 - LG_Electronics_Inc._LGE_Android_Phone_VS930_4G-991c470
/dev/sdb - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/sdb1 - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/input/event5 - Logitech_USB_Receiver
/dev/input/mouse1 - Logitech_USB_Receiver
/dev/input/event2 - Razer_Razer_Diamondback_3G
/dev/input/mouse0 - Razer_Razer_Diamondback_3G
/dev/input/event3 - Logitech_HID_compliant_keyboard
/dev/input/event4 - Logitech_HID_compliant_keyboard

説明する:

find /sys/bus/usb/devices/usb*/ -name dev

表示されているデバイスのディレクトリに/devファイルがあります。そのため、この基準に一致するディレクトリを検索します。dev/sys
 

syspath="${sysdevpath%/dev}"

私たちはディレクトリパスが欲しいので/dev
 

devname="$(udevadm info -q name -p $syspath)"

/devこれにより、そのデバイスに対応するパスが提供されます。/sys
 

[[ "$devname" == "bus/"* ]] && exit

これにより、実際のデバイスではない項目がフィルタリングされます。それ以外の場合は、USBコントローラやハブなどを取得できます。サブシェルを終了exitし、ループの次の反復を開始します。
 

eval "$(udevadm info -q property --export -p $syspath)"

このudevadm info -q property --exportコマンドは、シェルが変数として解析できる形式ですべてのデバイス属性を一覧表示します。だから私たちはevalそれを求めています。これがコードを括弧で囲んでサブシェルを使用し、ループを通過するたびに変数が消去される理由です。
 

[[ -z "$ID_SERIAL" ]] && exit

実際のデバイスではないアイテムの追加のフィルタリング。
 

echo "/dev/$devname - $ID_SERIAL"

この行が何をしているのか知ってほしい:-)

おすすめ記事