Cómo hacer que un script raíz se ejecute Pynotify

Cómo hacer que un script raíz se ejecute Pynotify

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 OSErrorcorrectamente (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

información relacionada