
Ich fand mehrere Fragen aufhttp://unix.stackexchange.com& Anhttp://stackoverflow.comim Zusammenhang mit dem Startskript nach Udev-Regeln. Aber ich kann keine genaue Lösung oder bestimmte Antwort für die Ausführung findenSchlagSkript.
Also stelle ich die (kanonische) Frage:Wie kann ich ein Bash-Skript mittels Udev-Regeln ausführen/starten?
Eine andere Sache, die ich fand aufSchreiben von udev-RegelnIst:
udev führt diese Programme nicht auf einem aktiven Terminal aus und führt sie auch nicht im Kontext einer Shell aus. Stellen Sie sicher, dass Ihr Programm als ausführbar gekennzeichnet ist. Wenn es sich um ein Shell-Skript handelt, stellen Sie sicher, dass es mit einem entsprechenden Shebang beginnt (z. B. #!/bin/sh), und erwarten Sie nicht, dass auf Ihrem Terminal eine Standardausgabe angezeigt wird.
Daher möchte ich, wenn möglich, wissen, "Wie läuftBash-Skriptnach udev-Regeln?"
Hier ist ein einfaches Beispiel für die Ausführung eines Bash-Skripts.
Ich habe 99-myrule.rules
darunter geschrieben /etc/udev/rules.d
, was enthält:
ACTION=="add", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", RUN+="/home/pandya/example.sh"
Ich habe die Anbieter- und Produkt-ID in lsusb
der Ausgabe gefunden:
$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade
Und ich möchte einen experimentellen Befehl ausführen, zenity --info
wenn mein USB-Stick (von SanDisk, oben aufgeführt) angeschlossen ist.
also habe ich Folgendes geschrieben /home/pandya/example.sh
(was in den Udev-Regeln aufgerufen wird RUN+=
):
#!/bin/bash
zenity --info &
exit
Aber dieses Skript wird nicht ausgeführt (obwohl es die Ausführungsberechtigung hat). Ich habe auch Folgendes versucht:
export DISPLAY=:0
im Skript vorzenity --info
bash -c 'DISPLAY=:0 zenity --info
Und natürlich:
sudo restart udev
sudo udevadm control --reload-rules
Aber ich bekomme keine Ausgabe zenity --info
.
SomitWie kann ich ein Bash-Skript mithilfe von Udev-Regeln ausführen? Geben Sie mir einen Vorschlag, wenn ich etwas übersehen habe.
Antwort1
Höchstwahrscheinlich wird der Befehl ausgeführt, weiß aber nicht, wo die Ausgabe angezeigt werden soll. Ich gehe davon aus, dass Sie bei X mit einem anderen Benutzer als root angemeldet sind und diese Regel höchstwahrscheinlich als root ausgeführt wird. Versuchen Sie den folgenden Befehl:
su - your_X_user_here -c 'export DISPLAY=:0;zenity --info'
Zum Ausführen vonBash-Skriptfolgen Sie dem Befehl:
su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'
Antwort2
Ich habe vor kurzem gefundeneine elegante Artum GUI oder X-Task aus Udev-Regeln anzuzeigen, ohne sich um DISPLAY kümmern zu müssen. Das Prinzip wäre für Shell-Skripte, die verwenden, dasselbe export
.
IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"
$env{ENV}
: wenn der aktuelle TTY-Benutzer X startet, andernfalls entfernen fürWurzel.
Antwort3
Für alle anderen, die dies hier lesen: Ich konnte mein Skript in Kali Linux 2016 nur folgendermaßen zum Laufen bringen:
#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'