
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 OSError
ordnungsgemäß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