執行根據 udev 規則顯示 X 視窗的腳本

執行根據 udev 規則顯示 X 視窗的腳本

我發現了幾個問題http://unix.stackexchange.com& 在http://stackoverflow.com與 udev 規則的啟動腳本相關。但我找不到執行的確切解決方案或特定答案重擊腳本。

所以,我問這個(規範的)問題:如何透過 udev 規則運行/啟動/執行 Bash 腳本?

我發現的另一件事編寫 udev 規則是:

udev 不在任何活動終端上執行這些程序,並且不在 shell 上下文中執行它們。請務必確保您的程式被標記為可執行,如果它是 shell 腳本,請確保它以適當的 shebang 開頭(例如 #!/bin/sh),並且不要期望任何標準輸出出現在您的終端上。

因此,我想知道是否可能“如何運行bash腳本按照 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'

對於運行任何bash腳本依照命令:

su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'

答案2

我最近發現一種優雅的方式從 udev 規則顯示 GUI 或 X 任務,而不必擔心 DISPLAY。對於使用 的 Shell 腳本,其原理是相同的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!"'

相關內容