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


17

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を使用して通知を送信するように仕組まれています。これはインストールされ、端末から正常に機能します。

スクリプトへのパスは正しいです。端末で問題なく正確なコマンドを実行したためです。


ウイルス対策は実行されていますか?これは、任意の数のAVプログラムからアクションをトリガーする動作です。警告を期待していますが、通知を無効にしている場合は、ログを除いて表示されない場合があります。インターネットを無効にしてから、AVプログラムを無効にしてから、もう一度試してみることをお勧めします。
zenbike

AVをインストールせずにUbuntu 11.04を実行します。
JTeK

@zenbike:カスタムudevルールを追加すると、ウイルス対策プログラムがトリガーされるのはなぜですか?
-user1686

デバイスの挿入時にスクリプトを開始すると、リムーバブルデバイスをスキャンするAVセットで誤検知が発生する可能性があります。なぜか分からない。サムドライブとAvira AVに工場でインストールされたスクリプトを使用してそれが起こったのは知っています。
zenbike

回答:


6

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

スクリプトをコピー/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"

そのATTRS{vendor}=="SanDisk "部分は、それだけSandiskが検出されることを意味しますか?
blade19899

7

notify-send DBusセッションバスにアクセスする必要がありますが、次の2つの理由でアクセスできません。

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

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

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


2
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;通知送信で私のためにトリックをしました
-mlt

1

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

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

デバイスを接続すると、lsusb出力またはdmesgでidVendorとidProductを確認できます。


私はそれを試してみましたが、うまくいきませんでした...(ATTR {idProduct} == "5530")...ベンダーも必要ですか?私はそうは思わないだろう
...-JTeK

その場合、問題はスクリプト自体にある可能性があります。たとえば、$ PATH env変数に依存する場合があります。テストのために、export PATH = '';のように実行してみてください。/home/jesse/Documents/Scripts/cruzer.sh
Aleh

1

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

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

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


0

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


0

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


いいえ、SUBSYSTEM=="usb"大丈夫です。
krlmlr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.