Запустить скрипт, который отображает окно X из правила udev

Запустить скрипт, который отображает окно X из правила udev

Я нашел несколько вопросов наhttp://unix.stackexchange.com& наhttp://stackoverflow.comсвязанные с запуском скрипта по правилам udev. Но я не могу найти точное решение или определенный ответ для выполненияБашсценарий.

Итак, я задаю (канонический) вопрос:Как запустить/выполнить скрипт Bash с помощью правил udev?

Еще одна вещь, которую я нашел наНаписание правил udevявляется:

udev не запускает эти программы на любом активном терминале и не выполняет их в контексте оболочки. Убедитесь, что ваша программа помечена как исполняемая, если это скрипт оболочки, убедитесь, что он начинается с соответствующего 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выходных данных:

$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade

И я хочу выполнить экспериментальную команду, zenity --infoкогда подключен мой флеш-накопитель (SanDisk, указанный выше).

Итак, я написал /home/pandya/example.sh(который вызывается из RUN+=правил udev) 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.

СледовательноКак запустить скрипт Bash с помощью правил udev? Если я что-то упустил, дайте мне знать.

решение1

Скорее всего, команда выполняется, но не знает, где отображать вывод. Я предполагаю, что вы вошли в X с пользователем, отличным от root, и это правило, скорее всего, выполняется от имени 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

Я недавно нашелэлегантный способдля отображения GUI или X задачи из правил udev, не беспокоясь об ОТОБРАЖЕНИИ. Принцип будет таким же для скриптов 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!"'

Связанный контент