http://unix.stackexchange.com & http://stackoverflow.com udevルールによる起動スクリプトに関連するいくつかの質問を見つけました。しかし、Bashスクリプトを実行するための正確な解決策や特定の答えを見つけることができません。
だから、私は(標準的な)質問をしています:udevルールを使用してBashスクリプトを実行/起動/実行する方法は?
devルールの記述 で見つけたもう1つのことは次のとおりです。
udevは、これらのプログラムをアクティブな端末で実行せず、シェルのコンテキストで実行しません。プログラムが実行可能としてマークされていることを確認してください。シェルスクリプトの場合は、適切なShebang(#!/ bin/shなど)で開始し、端末に標準出力が表示されないようにしてください。
したがって、可能であれば、「udevルールでbashスクリプトを実行する方法」を知りたいと思います。
これはbash-scriptを実行する簡単な例です。
99-myrule.rules
の下に/etc/udev/rules.d
と書きました。
ACTION=="add", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", RUN+="/home/pandya/example.sh"
lsusb
出力からベンダーと製品IDを見つけました:
$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade
そして、(上記のSanDiskの)ペンドライブが接続されたときに実験コマンドzenity --info
を実行したいと思います。
だから、私は/home/pandya/example.sh
(udevルールのRUN+=
から呼び出されます)contiansを書きました:
#!/bin/bash
zenity --info &
exit
ただし、このスクリプトは実行されていません(実行権限があるにもかかわらず)。私も以下を試しました:
export DISPLAY=:0
の前のスクリプト内のzenity --info
bash -c 'DISPLAY=:0 zenity --info
そしてもちろん:
Sudo restart udev
Sudo udevadm control --reload-rules
しかし、出力zenity --info
を取得できません。
したがってudevルールのメナスでBashスクリプトを実行するにはどうすればよいですか? 何か足りないものがあれば提案してください。
ほとんどの場合、コマンドは実行されていますが、出力を表示する場所がわかりません。 root以外のユーザーでXにログインしていて、そのルールはrootとして実行されている可能性が高いと思います。次のコマンドを試してください。
su - your_X_user_here -c 'export DISPLAY=:0;zenity --info'
Bash Scriptを実行するには、次のコマンドに従います。
su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'
私は最近、 エレガントな方法 DISPLAYを気にせずにudevルールからGUIまたはXタスクを表示することを発見しました。原則は、export
を使用するシェルスクリプトでも同じです。
IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"
$env{ENV}
:current-tty-userがXを開始する場合、それ以外の場合はrootから削除します。
これを読んでいる他の人にとって、Kali Linux 2016でスクリプトを機能させることができた唯一の方法は、次のようなものでした。
#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'