web-dev-qa-db-ja.com

(ubuntu 16.04)デバイスに依存しないUSB挿入イベントを検出するにはどうすればよいですか?

デバイスに関係なく、USBインサートを検出しようとしています。例:電話、バッテリーパック、生体認証システムなど。Linuxで認識される場合と認識されない場合があります(ドライバーがないか、「ドライブ/実行」するものがありません)。おそらく、Linuxは(デバイスに関係なく)USBインサートを検出し、認識されたデバイスのみの登録と操作に進みます。たとえば、認識されたUSBデバイスの詳細が/ dev/bus/usb /などに一覧表示されます。代わりに、USBスロットに挿入されたすべてのものをトラップ/処理したいと思います。これはおそらく、認識されたデバイスでのみ起動するため、udevadmのようなものに依存できないことを意味します。これは、カーブの早い段階で挿入イベントをトラップする必要があることも意味します。どうすればよいですか?

6
Vivek

@meuhコメント ここ で言及されているように、ダムデバイスでこれを達成できるとは思わない。実際に通信するデバイスでは、udevadm monitorは正常に機能します。 Android電話(電源オン))の接続と取り外しの例を次に示します。

$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[115749.498687] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
KERNEL[115749.499591] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
UDEV  [115749.511659] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
UDEV  [115749.516846] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
KERNEL[115767.515839] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
KERNEL[115767.516143] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
UDEV  [115767.517088] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
UDEV  [115767.522116] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)

フラッシュドライブは、同様ですが、はるかに冗長な結果を生成します。この情報を利用して何らかのアクションをトリガーしたい場合は、出力をファイルにリダイレクトし、tailを使用してファイルの新しいアクティビティを監視できます。

Android電話(電源はオフですが充電中))を使用したテストでは、lsusb -v |grep Power出力に何の変化も見られず、IMHOは、電力を消費または供給するだけのダムデバイスを検出できないことを確認しています。

ダムではないデバイスを検出するもう1つの簡単な方法は、ベースライン情報を保存し、現在の情報をそれに比較することです。これを行うには多くの方法があります。上記のudevadmに代わる簡単な方法のひとつは、デバイスが接続されていない状態でシステムのベースラインデータを収集することです。例:ベースラインデータを収集する:lsusb > baseline.txt現在のデータを確認して比較:

真実である間; lsusb> compare.txtを実行します; diff compare.txtbaseline.txt;睡眠1;完了

これにより、現在のUSB接続が1秒に1回ベースラインと比較されます。

スクリプトが検出時にベースラインデータを更新する場合、この方法でデバイスの取り外しを検出することもできます。

1
Elder Geek

USB経由ですべてのトラフィックをキャプチャする1つの方法は、usbmonカーネルモジュールを挿入した後にwiresharkを使用することです。

Wireshark USBモニタリング

それはあなたが得ることができるのとほぼ同じくらい「カーブの早い段階」です。しかし、私はあなたの意図が何か面白いことをするためにイベントのようなある種のプログラムトリガーを使用することであると仮定しています-したがって、 'lsusb -t'を実行すると、挿入されたUSBデバイスの静的リストとそれぞれのドライバーが表示されます(存在する場合)、lsusbを実行するcronジョブを作成し、それを以前のバージョンと比較して、新しいデバイスが挿入されているかどうかを確認できます。ドライバーが関連付けられていなくてもかまいません。

この単純なソリューションの欠点は、cronが挿入と検出の間に与える大きな待ち時間です。

0
einonm