
Necesito ejecutar un script como root llamado root.py. Necesito crear notificaciones dentro del script. Creé un script separado específicamente para las notificaciones llamado notify.py.
Aquí está notificar.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])
El script notify.py funciona bien con un usuario que no es root:
python notify.py Title Message
Pero necesito llamar a este script dentro de root.py, que se ejecuta como root. Falla si lo ejecuto como root. Entonces, a falta de mejores palabras, intenté cerrar sesión como root iniciándolo como otro usuario (también reemplacé sudo con gksudo a continuación):
xhost local:user
gksudo -u user notify.py Title Message
No funcionará.
¿Algunas ideas?
Por cierto: tuve un problema similar al ejecutar gtk desde root y ejecutar scripts advenedizos. Además, gvfs no cambiará los atributos como root cuando otro usuario sea sudo.
Respuesta1
sux - contenedor alrededor de su que transferirá sus credenciales X http://fgouget.free.fr/sux/
$ sudo apt-get install sux
Respuesta2
Copiar y pegar directo:
No podrá abrir un servidor en el puerto 80 sin privilegios de root, esto es una restricción a nivel del sistema operativo. Entonces, la única solución es eliminar los privilegios de root después de haber abierto el puerto.
Aquí hay una posible solución para eliminar los privilegios de root en Python:Eliminar privilegios en Python. Esta es una buena solución en general, pero también tendrá que agregarla os.setgroups([])
a la función para asegurarse de que no se conserve la membresía del grupo del usuario root.
Copié y limpié el código un poco, y eliminé el registro y los controladores de excepciones para que usted pueda manejarlo OSError
correctamente (se lanzará cuando al proceso no se le permita cambiar su UID o GID efectivo):
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)
deaquí.
Si DEBE recuperar los privilegios de root, siempre haykit de políticas.
Respuesta3
Este es un tiro descabellado, vote en contra si está mal. La próxima vez, si es posible, agregue los mensajes de error relevantes.
Quizás al usuario root simplemente le falta una pantalla para realizar operaciones GUI. Has probado:
DISPLAY=:0 python notify.py Title Message
como root?.
Respuesta4
como root, ejecute:
exportar `dbus-launch`
y ejecuta tu programa de notificación