web-dev-qa-db-ja.com

udevルールからXウィンドウを表示するスクリプトを実行します

http://unix.stackexchange.comhttp://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スクリプトを実行するにはどうすればよいですか? 何か足りないものがあれば提案してください。

1
Pandya

ほとんどの場合、コマンドは実行されていますが、出力を表示する場所がわかりません。 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"'
2
YoMismo

私は最近、 エレガントな方法 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から削除します。

0
Thomas Venries

これを読んでいる他の人にとって、Kali Linux 2016でスクリプトを機能させることができた唯一の方法は、次のようなものでした。

#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'
0
sMyles