web-dev-qa-db-ja.com

udevルールを使用してUSB挿入時にスクリプトを実行する

USBデバイスを接続するたびに実行するスクリプトを設定しようとしています。ファイル/ etc/udev/rules.d/90-local.rulesを作成し、次のルールを追加しました:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"

問題は、ドライブが接続されているときに何も起こらないことです。スクリプトは、デバッグの目的で、端末からインストールして正常に機能するnotify-sendを使用して通知を送信するようになっています。

正確なコマンドをターミナルで問題なく実行したので、スクリプトへのパスは正しいです。

17
JTeK

同じ問題がありました。これは私のために働きました:

スクリプトを/usr/local/binにコピーして、.rulesファイルのディレクトリを変更してみてください。

また、SYSFSが何かはわかりませんが、ATTRプロパティを使用したいと思います。

次の行は、私の.rulesファイルの内容です。

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"
6
plk

notify-sendには、DBusセッションバスへのアクセスが必要です。これには、次の2つの理由でこれを行うことはできません。

  • セッションに関する情報はありません。 udevによって開始されたとき、スクリプトはnothingがどこにログインしているか、またはまったくログインしているかどうかを認識しています。 X11でのマルチシートはまだ扱いにくいですが、ユーザー切り替えはX11とコンソールセッションの両方で機能します。また、多くの人がネットワーク経由でSSH、VNC、NXを使用しています。

    DISPLAY=:0は半分の時間で動作しますが、それでも推測でも十分です。)

  • DBusポリシーによって拒否されました。スクリプトが何らかの方法でX11セッションを検出した場合でも、スクリプトがユーザーアカウントではなくrootとして実行されているため、通知を送信できません。

7
user1686

代わりに、ベンダーIDと製品IDでデバイスを一致させることができます。次のカスタムルールが機能します。

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"

デバイスを接続した後、lsusb出力またはdmesgでidVendorおよびidProductを確認できます。

1
Aleh

Alehの回答のフォローアップ:removeイベントも監視する場合は、ID_SERIALという名前の環境変数を探す必要があります。アンダースコアで区切られたベンダーIDと製品IDが含まれています。

ACTION=="add|remove", SUBSYSTEM=="usb", ENV{ID_SERIAL}=="0763_019b" RUN+="/usr/bin/aconnect 20 128"

ルールも短くなりました。

1
krlmlr

SUBSYSTEM = "usb"をSUBSYSTEMS = "usb"に置き換えてみてください

0
arnaud

おそらく、USBデバイスに「落ち着く」機会を与えるために、スクリプト内にsleepを追加する必要があるかもしれません。たとえば、USB 3Gモデム、/ dev/ttyUSBを取得するためのモード切り替え、カーネルによる起動および実行。

0
t0mm13b