デバイスのポートを決定するコマンド(/ dev / ttyUSB0など)


46

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に接続されていることがわかります。


何を達成しようとしていますか?デバイス/devをのエントリに関連付けlsusbますか?または/dev、物理USBデバイスから派生したすべてのデバイスを一覧表示しますか?それとも、ただ欲しいls /dev/ttyUSB*ですか?
パトリック14

デバイスのポートを取得し、デバイスの切断と再接続を要求しないコマンドが必要です。ls /dev/ttyUSB*maybee 10ポートのみをリストしますが、このリストから、どのポートがデバイス用であるかわかりません。
71GA 14

これが役立つことがわかりました。lsusb -v
tjaart55

回答:


80

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

以下は、属性を/sys持つUSBデバイスを探す際にデバイスをウォークスルーする簡単で汚いスクリプト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/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        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

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

syspath="${sysdevpath%/dev}"

ディレクトリパスが必要なので、を取り除き/devます。
 

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

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

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

これは、実際のデバイスではないものを除外します。そうでなければ、USBコントローラーとハブのようなものが得られます。
 

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

このudevadm info -q property --exportコマンドは、シェルが変数に解析できる形式ですべてのデバイスプロパティを一覧表示します。したがって、これを単に呼び出しますeval。これは、サブシェルを使用し、各ループで変数が消去されるように、括弧でコードをラップする理由でもあります。
 

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

実際のデバイスではないもののより多くのフィルタリング。
 

echo "/dev/$devname - $ID_SERIAL"

この行が何をするのか知っていることを願っています:-)


2
ありがとうございました。私はあなたのアンサーから多くのことを学びます、そして今、私は用語が私にとって完全に明確ではなかったのを見ます。もっと短い方法はありますか?Linux自体にすでに統合されているコマンドはありますか?
71GA 14

いや。既存のコマンドがあった場合、私は喜んでそれをお勧めします。
パトリック14

/ bin / bashを/ bin / shに変更し、互換性を
最大限に

10

以下に接続している場合、このコマンドを使用してデバイスを探索できますusb0

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

一番上の答えは私のマシンではうまくいきませんでしたが、これはうまくいきました。ありがとう!
-johnny_boy

2

以下のようなものを試すことができます。

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev

私の目を見て! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (同等の、しかしきれいな...しかし、まだ奇妙なコード。なぜttyUSBだけを一緒にしないのですか?また、2倍の回転は何ですか?)
Peter

1
rev最後のフィールドにアクセスするので、これを置き換えることができ、使用されている$NF与える:dmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
レオGermond

2

おそらく最後に接続したUSBシリアルアダプターへのパスだけを知りたいですか?

dmesg | awk '/tty/ && /USB/ {print "/dev/"$10}'|tail -1

2

接続したデバイスが何であるかを知っていると仮定すると、14.04 Ubuntuでは、少なくとも、usb-devices情報を調べて情報を見つけることができるコマンドがあります。

$ usb-devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 3
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev=04.04
S:  Manufacturer=Linux 4.4.0-131-generic ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=0000:00:1a.0
C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub

そして、最初の行には、バスとポート、およびlsusb提供するデバイス番号がリストされています。


これは正解です。なぜ投票数が増えないのかはわかりません。残りはAWKなどの台無しです
エリックDrechsel

1
これは/dev/*パスを表示しません
xinthose
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.