Como fazer um script raiz executar o Pynotify

Como fazer um script raiz executar o Pynotify

Preciso executar um script como root chamado root.py. Preciso criar notificações dentro do script. Criei um script separado especificamente para notificações chamado notify.py.

Aqui está 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])

O script notify.py funciona bem com um usuário que não é root:

python notify.py Title Message

Mas preciso chamar esse script dentro de root.py, que é executado como root. Ele falhará se eu executá-lo como root. Então, tentei, por falta de palavras melhores, sair como root iniciando-o como outro usuário (também substituí sudo por gksudo a seguir):

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

Não vai funcionar.

Alguma ideia?

aliás: eu tive um problema semelhante ao executar o gtk a partir do root e executar scripts iniciais. Além disso, o gvfs não alterará os atributos como root quando outro usuário for sudo.

Responder1

sux - wrapper em torno de su que irá transferir suas credenciais X http://fgouget.free.fr/sux/

$ sudo apt-get install sux

Responder2

Copiar e colar direto:

Você não poderá abrir um servidor na porta 80 sem privilégios de root, esta é uma restrição no nível do sistema operacional. Portanto, a única solução é eliminar os privilégios de root depois de abrir a porta.

Aqui está uma solução possível para eliminar privilégios de root em Python:Eliminando privilégios em Python. Esta é uma boa solução em geral, mas você também terá que adicionar algo os.setgroups([])à função para garantir que a associação ao grupo do usuário root não seja mantida.

Copiei e limpei um pouco o código e removi o log e os manipuladores de exceção para que você possa lidar OSErroradequadamente (ele será lançado quando o processo não tiver permissão para alterar seu UID ou GID efetivo):

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)

deaqui.

Se você DEVE recuperar os privilégios de root, sempre hákit de políticas.

Responder3

Este é um tiro selvagem, por favor, vote negativamente se estiver errado. Da próxima vez, se possível, adicione as mensagens de erro relevantes.

Talvez o usuário root simplesmente não tenha uma tela para realizar operações GUI. Você tentou:

DISPLAY=:0 python notify.py Title Message

como raiz?.

Responder4

como root, inicie:

exportar `dbus-launch` 

e execute seu programa de notificação

informação relacionada