いくつかの問題を発見しましたhttp://unix.stackexchange.com&存在するhttp://stackoverflow.comudevルールの起動スクリプトに関連しています。ただし、実行する正確な解決策や具体的な答えが見つかりません。吹くスクリプト。
だから私は次のような(標準的な)質問をします。udevルールを介してBashスクリプトを実行/開始/実行する方法は?
また発見した事実udevルールの作成例:
udev はアクティブ端末でこれらのプログラムを実行せず、シェルコンテキストでは実行しません。プログラムが実行可能としてマークされていることを確認し、シェルスクリプトの場合は、適切なshebang(例:#!/ bin / sh)で始まることを確認し、端末に標準出力が表示されないようにしてください。
だから「走り方」が可能かどうか気になりました。バッシュスクリプトudevルールによると? 」
これはbashスクリプトを実行する簡単な例です。
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
zenity --info
私のペンドライブ(上記のSanDisk)が接続されている間に実験的なコマンドを実行したいと思います。
だから私は/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
ほとんどの場合、コマンドは実行中ですが、出力を表示する場所はわかりません。私は、root以外のユーザーを使用してXにログインしていて、ルールがrootとして実行される可能性が高いと仮定します。次のコマンドを試してください。
su - your_X_user_here -c 'export DISPLAY=:0;zenity --info'
実行のためバッシュスクリプト次のコマンドに従ってください。
su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'
答え2
私は最近発見しましたエレガントな方法DISPLAYについて心配することなく、udevルールでGUIまたはXアクションを表示します。使用されるシェルスクリプトの場合、原則は同じですexport
。
IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"
$env{ENV}
:現在ttyユーザーがXを起動した場合、それ以外の場合は削除します。根。
答え3
この記事を読んでいる他の人に言うと、Kali Linux 2016でスクリプトを実行できる唯一の方法は次のとおりです。
#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'