Kann UDEV für einen angemeldeten Benutzer in einer Sitzung irgendwie Zenen auslösen?

2044
Redsandro

Ich möchte ein zenityPopup-Dialogfeld, in dem ich gefragt wird, ob ich ein Backup ausführen möchte, wenn ich ein bestimmtes externes Laufwerk angeschlossen habe.

Ich habe leider Probleme mit der UDEV-Regelsyntax. Ich habe diese Regel in /etc/udev/rules.d/test.rules:

ACTION=="add", ATTRS=="Western Digital", ATTRS=="1058", ATTRS=="1140", RUN+="/usr/local/bin/test.sh" 

Es ist ziemlich einfach, aber:

  1. Es wird ein Dutzend Mal statt einmal ausgelöst.
  2. Es kann nicht "sprechen", zenitywenn es test.shgeht, sudo -Hu <username> zenity --warning --text="Just some random text for now."weil udev im System verstaut ist und den Fenstermanager nicht finden kann: Gtk-WARNING **: Anzeige kann nicht geöffnet werden:
  3. Es ist nicht sehr editierfreundlich. Ich wünschte, es gäbe eine Art Regel, bei der ich einfach das LABEL für bestimmte Partitionen eingeben kann, auf denen ich bestimmte Skripts auslösen möchte.

Ich würde mir eine generelle Verbesserung der UDEV-Regel wünschen, denn abgesehen von den vielen Fragen und Antworten dazu, hier und anderswo, scheinen sie alle ein wenig anders zu sein und die meisten lösen mehrere Male aus.

Aber am wichtigsten ist, wie kann ich in irgendeiner Weise die Verbindung zu einem Skript in meinem Haus herstellen, das Zugriff auf Dinge wie meine Sitzung und meinen Bildschirm hat, damit es zenityfunktioniert?

0

2 Antworten auf die Frage

0
Olaf Dietsche

Sie haben bereits die Antwort gefunden. Das Skript (zenity) benötigt einen X Window Server zum Anzeigen einer Nachricht. Das Skript wird ausgeführt udevund hat keine Anzeige. Sie können dieses Problem lösen, indem Sie die DISPLAYVariable in Ihrem Skript fest verdrahten, d. H

DISPLAY=:0; export DISPLAY 

Der Nachteil dabei ist, dass es nur funktioniert, wenn Sie der einzige Benutzer sind und / oder die Anzeige im Voraus kennen. Wenn mehrere Benutzer auf dem System sind, könnte das Display etwas anderes sein, zum Beispiel :1, :2und so weiter. Oder ein anderer Benutzer erhält die Zenity-Nachricht auf seinem Bildschirm.

Ein besserer Ansatz wäre, die Erkennung des Ereignisses und die Interaktion mit dem Benutzer oder die Anzeige der Nachricht aufzuteilen.

Dazu können Sie ein Skript oder ein Programm erstellen, das in Ihrer GUI-Sitzung ausgeführt wird und auf einen Trigger eines Daemons oder des udev-Trigger-Skripts wartet.

Eine dritte Möglichkeit könnte darin bestehen, die zu verbinden udisks-daemonund um Informationen zu bitten, wenn das externe Gerät angeschlossen ist. Sie können versuchen, udisks --monitoroder udisks --monitor-detailfür diese und analysieren den Ausgang, wenn ein Ereignis eintritt.

Es scheint einen udisksctlBefehl zu geben, der mit einer etwas anderen Syntax dasselbe tut. Vielleicht ist es nur eine neuere Version des udisksBefehls.

Sie können sich auch einige Gui-Tools wie GNOME-Disks ansehen, die ebenfalls auf das udev / udisks-System angewiesen sind.

Update :

Die Mehrfachaufrufe ergeben sich normalerweise aus dem Bericht der verschiedenen Subsysteme. Sie können dies sehen, wenn Sie die Umgebung in einer Protokolldatei im /usr/local/bin/test.shSkript protokollieren

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

Beim Einstecken eines USB-Sticks erhalte ich die folgenden Berichte

$ 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 

Sie können auch hinzufügen, DEVTYPEzwischen den beiden zu unterscheiden usboder diskBerichte. Um die Berichte auf wenige oder sogar nur einen Anruf zu reduzieren, müssen Sie spezifischer sein und der udev-Regeldatei zusätzliche Bedingungen hinzufügen. Wählen SUBSYSTEM=scsi_diskSie z.

Vielen Dank für die Antwort und das Aufzeigen von Alternativen. Du hattest Recht, `DISPLAY =: 0` hat den Trick getan. Diese Antwort betrifft die Unterabfrage 2, aber als Unterabfrage 1 vorhergesagt, bekomme ich nun etwa 30 Mal für ein angeschlossenes Laufwerk "zenity" für 1 Mal. Irgendeine Idee, wie ich das abschwächen kann? Am liebsten möchte ich, dass das Skript nur mit dem Partitionsnamen als Argument aufgerufen wird. (Das Skript wird beispielsweise 3-mal mit 3 Partitionen aufgerufen.) Ich habe auch "udisks" ausprobiert, weil es so einfach scheint, aber es sitzt nur da und behauptet, es wäre ein Monitoring, meldet aber nichts, was ich einstecke. Vielleicht ist es für Ubuntu nicht korrekt implementiert. Redsandro vor 11 Jahren 0
Ah `udiskctl` überwacht Ereignisse. Ich werde weiter darauf eingehen, wenn ich nicht herausfinden kann, wie dies in den `udev'-Regeln wie ursprünglich geplant geschieht. Redsandro vor 11 Jahren 0
@Redsandro Siehe aktualisierte Antwort. Olaf Dietsche vor 11 Jahren 0
Vielen Dank. Es ist immer noch ein Rätsel, aber jetzt bin ich besser informiert. Ich habe deine Antwort akzeptiert. Redsandro vor 11 Jahren 0
0
sMyles

Für alle anderen, die dies lesen, war die einzige Möglichkeit, mein Skript in Kali Linux 2016 zum Laufen zu bringen, folgendermaßen:

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