Я хотел бы, чтобы всплывающее окно zenity спрашивало меня, хочу ли я выполнить резервное копирование, когда я подключил конкретный внешний диск.

К сожалению, у меня возникли проблемы с синтаксисом правила UDEV. У меня есть это правило в /etc/udev/rules.d/test.rules:

ACTION=="add", ATTRS{manufacturer}=="Western Digital", ATTRS{idVendor}=="1058", ATTRS{idProduct}=="1140", RUN+="/usr/local/bin/test.sh"

Это довольно простой, но:

  1. Он срабатывает десятки раз вместо одного.
  2. Он не может «говорить», используя zenity когда test.sh переходит в sudo -Hu <username> zenity --warning --text="Just some random text for now." потому что udev спрятан в системе и не может найти оконный менеджер: Gtk-WARNING **: не может открыть дисплей:
  3. Это не очень удобно для редактирования, я бы хотел, чтобы существовало какое-то правило, в котором я мог бы просто ввести LABEL для определенных разделов, на которых я хотел бы запускать определенные сценарии.

Я хотел бы видеть общее улучшение для правила UDEV, потому что, помимо множества вопросов и ответов о нем, здесь и в другом месте они кажутся немного отличающимися друг от друга, и большинство из них запускаются несколько раз.

Но самое главное, как, в любом случае, я могу установить соединение со скриптом в моем доме, который имеет доступ к таким вещам, как мой сеанс и мой экран, чтобы zenity мог работать?

2 ответа2

0

Вы уже нашли ответ. Сценарию (zenity) нужен X Window Server для отображения сообщения. Скрипт запускается из udev и к нему не прикреплено отображение. Вы можете решить эту проблему, подключив переменную DISPLAY в вашем скрипте, т.е.

DISPLAY=:0; export DISPLAY

Недостатком этого является то, что он работает только в том случае, если вы единственный пользователь и / или знаете дисплей заранее. Если в вашей системе несколько пользователей, на дисплее может быть что-то еще, например :1 :2 и т.д. Или другой пользователь получает сообщение zenity на своем экране.

Лучшим подходом было бы разделить обнаружение события и взаимодействие с пользователем или отображение сообщения.

Для этого вы можете создать сценарий или программу, которая запускается в сеансе GUI и прослушивает триггер от демона или сценария триггера udev.

Третья возможность - подключиться к udisks-daemon и запросить информацию, когда подключено внешнее устройство. Для этого вы можете попробовать udisks --monitor или udisks --monitor-detail и проанализировать вывод при каждом событии.

Кажется, есть команда udisksctl , которая делает то же самое с немного другим синтаксисом. Может быть, это просто более новая версия команды udisks .

Вы также можете взглянуть на некоторые инструменты Gui, такие как GNOME Disks, которые также используют систему udev/udisks.

Обновление:

Многократные вызовы обычно возникают из отчета различных подсистем. Это видно, когда вы регистрируете среду в каком-либо файле журнала в скрипте /usr/local/bin/test.sh

umask 077
mkdir -p /tmp/udevtest.d
env >>/tmp/udevtest.d/udevtest.log

Когда я подключаю флешку, я получаю следующие отчеты

$ grep -e ACTION -e SUBSYSTEM /tmp/udevtest.d/udevtest.log
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_host
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_disk
ACTION=add
SUBSYSTEM=scsi_generic
ACTION=add
SUBSYSTEM=scsi_device
ACTION=add
SUBSYSTEM=bsg
ACTION=add
SUBSYSTEM=block
ACTION=add
SUBSYSTEM=block

Вы также можете добавить DEVTYPE чтобы различать два usb или disk отчета. Таким образом, чтобы сократить количество отчетов до нескольких или даже одного вызова, вы должны быть более конкретны и добавить дополнительные условия в файл правил udev, например, выберите SUBSYSTEM=scsi_disk или любой другой, подходящий для вашего устройства.

0

Для всех, кто читал это, единственный способ заставить мой скрипт в Kali Linux 2016 работать так:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .