Como fazer um script raiz executar Pynotify

1

Eu preciso executar um script como root chamado root.py. Eu preciso criar notificações dentro do script. Eu fiz um script separado especificamente para as notificações chamado notify.py.

Aqui está o 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 não como root:

python notify.py Title Message

Mas eu preciso chamar este script dentro de root.py, que é executado como root. Ele falhará se eu executar como root. Então, eu tentei por falta de palavras melhores, sair como root, lançando-o como outro usuário (eu também substitui o sudo com gksudo no seguinte):

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

não funciona.

Alguma idéia?

btw: Eu tive um problema parecido com a execução do gtk do root que executava os scripts do upstart. Além disso, o gvfs não irá alterar os atributos como root quando for outro usuário como o sudo.

    
por bambuntu 17.03.2012 / 21:03

4 respostas

0

sux - wrapper em torno do su que transferirá suas credenciais X link

$ sudo apt-get install sux
    
por jippie 17.03.2012 / 23:12
0

Copiar e colar diretamente:

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

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

Eu copiei e limpei o código um pouco e removi o log e os manipuladores de exceção, então cabe a você manipular OSError corretamente (ele será lançado quando o processo não tiver permissão para alternar seu UID efetivo ou GID):

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)

de aqui .

Se você DEVE recuperar privilégios de root, sempre há um policykit .

    
por RobotHumans 17.03.2012 / 22:18
0

Este é um tiro selvagem, por favor downvote-lo, se estiver errado. Por favor, da próxima vez, se possível, adicione as mensagens de erro relevantes.

Talvez o usuário root não tenha uma exibição para fazer operações da GUI. Você já tentou:

DISPLAY=:0 python notify.py Title Message

como root?.

    
por Javier Rivera 21.03.2012 / 09:14
0

como root, inicie:

export 'dbus-launch' 

e execute seu programa de notificação

    
por user109683 26.02.2013 / 09:51