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

関連情報