
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 OSError
adequadamente (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