[unix] 장치의 포트를 결정하는 명령 (예 : / 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에 연결되어 있음을 알 수 있습니다 .



답변

나는 당신이 무엇을 요구하는지 잘 모르겠습니다. ‘port’를 여러 번 언급했지만 예제에서 대답은 /dev/ttyUSB0포트가 아니라 장치 dev 경로 라고 말합니다 . 따라서이 답변은 각 장치의 개발 경로를 찾는 것입니다.

아래는 속성 /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"

나는 당신 이이 줄이 무엇인지 알기를 바랍니다 🙂


답변

다음에 연결된 경우이 명령을 사용하여 장치를 탐색 할 수 있습니다 usb0.

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


답변

아래에서 이와 같은 것을 시도 할 수 있습니다.

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


답변

아마도 마지막에 연결된 USB 직렬 어댑터의 경로 만 알고 싶습니까?

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


답변

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됩니다.


답변