lsusb, lsblk 또는 유사한 명령을 사용하여 비저장 장치만 보려면 어떻게 해야 합니까?

lsusb, lsblk 또는 유사한 명령을 사용하여 비저장 장치만 보려면 어떻게 해야 합니까?

내부 및 외부 저장 장치(예: 내부 HDD, USB 스틱 등)가 포함된 장치 목록을 탐색하지 않고 연결된 USB 장치(예: USB 마우스, USB 키보드) 목록을 보고 싶습니다. lsusb와 lsblk를 살펴봤지만 해결책을 찾는 데 어려움을 겪고 있습니다.

이를 달성하기 위한 grep 필터나 대체 명령이 있습니까?

답변1

grep -v "Mass Storage"사용할 수 있지만 lsusb일부 극단적인 경우에는 문자열이 표시되지 않을 수도 있습니다.

답변2

sudo lshw -businfo | grep -i usb | grep -v storage

개인적으로 나는 호스트 컨트롤러와 허브를 보고 싶지 않을 것이므로 필터링하여 다음과 같이 할 것입니다.

sudo lshw -businfo | grep -i usb | grep -v -E "storage| Host Controller| Hub"

답변3

아이디어: 나열된 각 장치에 대해 쿼리 lsusb하고 "대량 저장 장치" 장치로 등록되지 않은 장치에 속하는 행만 인쇄합니다.

꽤 많은 연구 결과에 따르면 /sys/bus/usb올바른 버스/장치 쌍에 대한 파일 시스템은 USB 장치에 쿼리하여 확인할 수 있다고 합니다(정확하길 바랍니다. 이것이 내가 이해하는 것만큼 신뢰할 수 없다면 지적해 주십시오). "대량 저장" 장치 계층 구조로 등록되고 해당 값을 추출(설정된 경우) bInterfaceClass하는 경우 08해당 장치는 "대량 저장" 장치입니다.

물론 이것은 자체 스크립트로 사용하는 것이 더 적합하지만 빠르게 실행하려면 다음을 수행하십시오.

lsusb | perl -wne '
    use strict;

    my ($pbus, $pdev) = map {int($_)} /^Bus ([0-9]+) Device ([0-9]+)/;
    my $f = "/sys/bus/usb/devices/usb${pbus}/${pbus}-${pdev}/${pbus}-${pdev}:1.0/bInterfaceClass";

    if (-f $f) {
        open(my $fh, "<", $f);

        my $bic = <$fh>;
        chomp($bic);

        next if $bic eq "08";
    }

    print
'

lsusb위 스크립트의 출력을 출력과 비교합니다 (누락된 Seagate 항목 참고).

user@[REDACTED] ~ % lsusb
Bus 002 Device 003: ID 0bc2:aa15 Seagate RSS LLC Basic
Bus 002 Device 002: ID 0424:5537 Microchip Technology, Inc. (formerly SMSC) USB5537B
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 004: ID 04d8:0b29 Microchip Technology, Inc. U2417H_0B29_15083001
Bus 001 Device 002: ID 0424:2137 Microchip Technology, Inc. (formerly SMSC) USB2137B
Bus 001 Device 005: ID 8087:0033 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
user@[REDACTED] ~ % lsusb | perl -wne '
    use strict;

    my ($pbus, $pdev) = map {int($_)} /^Bus ([0-9]+) Device ([0-9]+)/;
    my $f = "/sys/bus/usb/devices/usb${pbus}/${pbus}-${pdev}/${pbus}-${pdev}:1.0/bInterfaceClass";

    if (-f $f) {
        open(my $fh, "<", $f);

        my $bic = <$fh>;
        chomp($bic);

        next if $bic eq "08";
    }

    print
'
Bus 002 Device 002: ID 0424:5537 Microchip Technology, Inc. (formerly SMSC) USB5537B
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 004: ID 04d8:0b29 Microchip Technology, Inc. U2417H_0B29_15083001
Bus 001 Device 002: ID 0424:2137 Microchip Technology, Inc. (formerly SMSC) USB2137B
Bus 001 Device 005: ID 8087:0033 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

관련 정보