sux - wrapper em torno do su que transferirá suas credenciais X link
$ sudo apt-get install sux
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.
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 .
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?.
como root, inicie:
export 'dbus-launch'
e execute seu programa de notificação
Tags root scripts notification