So führen Sie Pynotify mit einem Root-Skript aus

So führen Sie Pynotify mit einem Root-Skript aus

Ich muss als Root ein Skript namens root.py ausführen. Ich muss innerhalb des Skripts Benachrichtigungen erstellen. Ich habe speziell für die Benachrichtigungen ein separates Skript namens notify.py erstellt.

Hier ist notify.py:

import pynotify
import sys

def notify(title, message):
    n = pynotify.Notification (title,
        message,
        "notification-message-im")
    n.show()

if __name__ == '__main__':
    notify(sys.argv[1], sys.argv[2])

Das Skript notify.py funktioniert gut mit einem anderen Benutzer als Root:

python notify.py Title Message

Aber ich muss dieses Skript in root.py aufrufen, das als Root ausgeführt wird. Es schlägt fehl, wenn ich es als Root ausführe. Also habe ich, in Ermangelung besserer Worte, versucht, mich als Root abzumelden, indem ich es als anderer Benutzer gestartet habe (im Folgenden habe ich auch sudo durch gksudo ersetzt):

xhost local:user
gksudo -u user notify.py Title Message

Wird nicht funktionieren.

Irgendwelche Ideen?

Übrigens: Ich hatte ein ähnliches Problem, als ich GTK von Root aus laufen ließ und Upstart-Skripte ausführte. Außerdem ändert GVFS als Root keine Attribute, wenn ich ein anderer Benutzer bin, z. B. Sudo.

Antwort1

sux - Wrapper um su, der Ihre X-Anmeldeinformationen überträgt http://fgouget.free.fr/sux/

$ sudo apt-get install sux

Antwort2

Direktes Kopieren und Einfügen:

Ohne Root-Rechte können Sie keinen Server auf Port 80 öffnen. Dies ist eine Einschränkung auf Betriebssystemebene. Die einzige Lösung besteht also darin, die Root-Rechte zu löschen, nachdem Sie den Port geöffnet haben.

Hier ist eine mögliche Lösung zum Löschen der Root-Berechtigungen in Python:Aufheben von Berechtigungen in Python. Dies ist grundsätzlich eine gute Lösung, allerdings muss zusätzlich noch os.setgroups([])eine Funktion ergänzt werden, die dafür sorgt, dass die Gruppenmitgliedschaft des Root-Benutzers nicht erhalten bleibt.

Ich habe den Code kopiert und ein wenig bereinigt und die Protokollierung und die Ausnahmebehandlungsroutinen entfernt, sodass Sie selbst die OSErrorordnungsgemäße Handhabung übernehmen können (diese Fehlermeldung wird ausgegeben, wenn der Prozess seine effektive UID oder GID nicht wechseln darf):

import os, pwd, grp

def drop_privileges(uid_name='nobody', gid_name='nogroup'):
    if os.getuid() != 0:
        # We're not root so, like, whatever dude
        return

    # Get the uid/gid from the name
    running_uid = pwd.getpwnam(uid_name).pw_uid
    running_gid = grp.getgrnam(gid_name).gr_gid

    # Remove group privileges
    os.setgroups([])

    # Try setting the new uid/gid
    os.setgid(running_gid)
    os.setuid(running_uid)

    # Ensure a very conservative umask
    old_umask = os.umask(077)

ausHier.

Wenn Sie unbedingt Root-Rechte zurückerlangen müssen, gibt es immerRichtlinienkit.

Antwort3

Das ist ein Wagnis. Wenn es falsch ist, stimmen Sie bitte dagegen. Fügen Sie beim nächsten Mal, wenn möglich, die relevanten Fehlermeldungen hinzu.

Vielleicht fehlt dem Root-Benutzer einfach ein Display, um GUI-Operationen durchzuführen. Haben Sie Folgendes versucht:

DISPLAY=:0 python notify.py Title Message

als Root?

Antwort4

Starten Sie als Root:

exportiere `dbus-launch` 

und führen Sie Ihr Benachrichtigungsprogramm aus

verwandte Informationen