
Я нашел несколько вопросов на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!"'