ubuntuusers.de

Einfache udev-Regel / Script funktioniert nicht

Status: Gelöst | Ubuntu-Version: Ubuntu GNOME 15.10 (Wily Werewolf)
Antworten |

linuxuser0815

Anmeldungsdatum:
3. Oktober 2014

Beiträge: Zähle...

Hallo,

ich wollte mal eine udev-Regel erstellen, welche beim Einstecken eines bestimmten USB-Sticks greift und ein einfaches Script aufruft. Als Testszenario habe ich einmal folgendes Script gewählt, welches bei mir unter /home/user/testscript.sh abgelegt ist:

1
2
#!/bin/bash
zenity --info --text "Das Script läuft!"

Starte ich dieses bekomme ich die entsprechende Meldung. Das Script an sich läuft also.

Als udev-Regel hab ich unter /etc/udev/rules.d/ die Datei 99-meineregel.rules mit folgendem Inhalt angelegt:

1
KERNEL=="sd?1" SUBSYSTEMS=="usb", ATTRS{serial}=="AA08374950521", ACTION=="add", RUN+="/home/user/testscript.sh"

Danach führe ich

1
sudo udevadm trigger 

aus.

Beim Einstecken des USB-Sticks passiert nichts. Beobachte ich das ganze mit tail -f /var/log/syslog bekomme ich die Meldung:

1
Dec  3 11:28:08 meinpc systemd-udevd[25183]: Process '/home/user/testscript.sh' failed with exit code 1.

Was mache ich falsch? Wäre super wenn mir jemand helfen könnte.

LG

LU

linuxuser0815

(Themenstarter)

Anmeldungsdatum:
3. Oktober 2014

Beiträge: Zähle...

Ich habe herausgefunden, bzw. den Tipp bekommen, dass es daran liegt, dass zenity ein grafisches Programm ist. Hiernach habe ich testweise mit "mkdir" einen Ordner anlegen lassen, statt eine Zenity-Meldung auszugeben, das hat funktioniert.

Das Problem hierbei ist, dass es nur ein Test war, und ich das Script eigentlich für das Mounten eines Truecrypt-Containers brauche, und die TC-Passwortabfrage ist ja ein grafisches Programm ⇒ Geht also analog zu Zenity erst mal nicht. ☹

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21818

Wohnort: Lorchhausen im schönen Rheingau

linuxuser0815 schrieb:

Ich habe herausgefunden, bzw. den Tipp bekommen, dass es daran liegt, dass zenity ein grafisches Programm ist.

Das ist nur die halbe Wahrheit. Das Problem ist, dass dein Skript als Root aufgerufen wird. Root ist nicht angemeldet und hat deshalb keine Umgebungsvariable "DISPLAY", die zenity (oder irgendeinem grafischen Programm) sagt, WO denn das Fenster mit der Meldung geöffnet werden soll.

Das sollte man seine tests immer mit

env -i ...

}machen, um ein LEERES Environment zu haben. Funktionert der Aufruf dann, funktioniert er auch mit udev, cron, etc

Hiernach habe ich testweise mit "mkdir" einen Ordner anlegen lassen, statt eine Zenity-Meldung auszugeben, das hat funktioniert.

Guter Test.

Das Problem hierbei ist, dass es nur ein Test war, und ich das Script eigentlich für das Mounten eines Truecrypt-Containers brauche, und die TC-Passwortabfrage ist ja ein grafisches Programm ⇒ Geht also analog zu Zenity erst mal nicht.

siehe oben. beim mounten kommt zusätzlich ncoh dazu, dass je nach Dateisystem die Rechte auf den Files bei dem user liegen, der mountet, es würde dir also vermutlich wenig nutzen.

linuxuser0815

(Themenstarter)

Anmeldungsdatum:
3. Oktober 2014

Beiträge: 138

Hi Redknight,

wie würdest du dann dein Script machen für meinen Anwendungsfall?

linuxuser0815

(Themenstarter)

Anmeldungsdatum:
3. Oktober 2014

Beiträge: 138

Bzw. kann ich in dem Script angeben, dass es als normaler User ausgeführt wird? (Weil es wird ja von udev aufgerufen) Weil mein Standard-User hat volle Truecrypt-Rechte (visudo bearbeitet), der würde also ohnehin ausreichen.

linuxuser0815

(Themenstarter)

Anmeldungsdatum:
3. Oktober 2014

Beiträge: 138

Ich habe auch schon das hier versucht:

http://forum.ubuntuusers.de/topic/udev-regel-programm-starten-auf-grafischer-obe/#post-5332017

Aber auch der Weg über dieses "Zwischensscript" bringt bei mir nichts. Sobald ein Script via udev aufgerufen wird, geht es nicht.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11237

Wohnort: München

linuxuser0815 schrieb:

wie würdest du dann dein Script machen für meinen Anwendungsfall?

Man könnte sich z.B. ein kleines Python-Skript schreiben, das mit Hilfe von python-pyudev (das Paket muss nachinstalliert werden) auf das Anstecken reagiert und das Skript mit dem Device-Pfad als erstem Argument aufruft (falls man den Teil nicht auch in Python schreiben will) - passend zur älteren Version von python-pyudev in den Ubuntu-Quellen sieht das dann z.B. so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python
import gobject
import pyudev
from pyudev.glib import GUDevMonitorObserver
import subprocess

serials = (
"AA08374950521",
)
my_script = "/home/user/testscript.sh"

context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='block')

def log_event(observer, action, device):
    if action == 'add' and device.__getitem__('DEVTYPE') == 'partition':
        try:
            serial = device['ID_SERIAL_SHORT']
            devname = device['DEVNAME']
        except KeyError:
            return
        if serial in serials:
            subprocess.call([my_script, devname])
        else:
            print("unknown partition with serial number {}".format(serial))

observer = GUDevMonitorObserver(monitor)
observer.connect('device-event', log_event)
monitor.start()

loop = gobject.MainLoop()
loop.run()

Und das dann über den Autostart starten lassen.

TNTMaster

Anmeldungsdatum:
30. Juli 2009

Beiträge: 876

Ändere das Skript mal wie folgt, den Wert für DISPLAY kannst du ja im Terminal mit

1
echo $DISPLAY

abfragen und entsprechend einsetzen, bei mir ist sie mit ":0.0" belegt. So funktioniert das bei mir. Das direkt in die udev-Regeln eintragen hab ich jetzt auch nicht hinbekommen.

1
2
3
4
#!/bin/bash

export DISPLAY=:0.0
su user -c 'zenity --info --text "Das Script läuft!"'

Gruß TNT

linuxuser0815

(Themenstarter)

Anmeldungsdatum:
3. Oktober 2014

Beiträge: 138

Hi TNTMaster,

Juhu, es hat geklappt. Danke beider Tipps von dir. Vor allem das Abfragen des Displays kannte ich nicht. Ich war der Meinung, der Standard laute immer ":0", bei mir war es aber z.B. die ":1". (Kann sich das eigentlich auf demselben installierten System auch nochmal ändern?) Über den Umweg des Scripts konnte ich jetzt (beispielhaft) mal "xterm" öffnen lassen. Klappt also.

Vielen vielen Dank.

LG

Antworten |