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/ttyUSBに接続されていることがわかります。
私はあなたが何を求めているのかよくわかりません。 「ポート」について何度か言及していますが、この例では、答えは/dev/ttyUSB0
であり、これはポートではなくデバイス開発パスです。したがって、この答えは、各デバイスの開発パスを見つけることです。
以下は、/sys
内のデバイスをウォークスルーして、ID_SERIAL
属性を持つUSBデバイスを探す簡単で汚いスクリプトです。通常、実際の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
/dev
に表示されるデバイスの/sys
ディレクトリにはdev
ファイルがあります。したがって、この基準に一致するディレクトリを検索します。
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"
この行が何をするか知っているといいのですが:-)
usb0
に接続されている場合、このコマンドを使用してデバイスを探索できます。
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
プラグインしたデバイスが何であるかを知っていると仮定すると、少なくとも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
が提供するデバイス番号をリストしています。
たぶん、最後に接続したUSBシリアルアダプターへのパスだけを知りたいですか?
dmesg | awk '/tty/ && /USB/ {print "/dev/"$10}'|tail -1
以下のようなものを試すことができます。
echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev