python programa rodando como root para abrir urls via usuario normal

1

Eu tenho um programa python que é executado como root, se suas funções, ao clicar de um botão, forem abrir uma página da web. Ele continuou abrindo a página no firefox como root, então eu tento usar o setuid sem sucesso. Aqui está o que eu tentei para abrir o link como um usuário normal:

from PyQt4 import QtGui, QtCore
import pwd
import os
import webbrowser


def username():
    euid = os.geteuid()
    print euid
    if 'PKEXEC_UID' in os.environ:
        user = pwd.getpwuid(int(os.environ["PKEXEC_UID"])).pw_name
        print user
        return user
    elif euid == 0 and 'PKEXEC_UID' not in os.environ:
        user = os.environ["SUDO_USER"]
        print user
        return user

def openLinks():
    uidChange = pwd.getpwnam(username()).pw_uid
    pidx = os.fork()
    if pidx == 0:
        try:
            os.setuid(uidChange)
            QtGui.QDesktopServices.openUrl(QtCore.QUrl("http://stackoverflow.com"))
            #webbrowser.open("http://stackoverflow.com")

        finally:
            os._exit(0)
    os.waitpid(pidx, 0)

openLinks()
    
por answerSeeker 27.03.2017 / 23:36

1 resposta

0

Eu não sei o que QtGui.QDesktopServices.openUrl faz, mas eu suspeito strongmente que ele abre uma URL em um aplicativo apropriado comunicando-se com algum daemon do KDE através da sessão X11, não lançando um navegador diretamente como filho de si mesmo. Você pode verificar isso observando o ID do processo pai do navegador resultante. Devido a isso, não importa qual UID seu script tenha mudado - apenas o uid do daemon é importante.

Executar sessões X11 como root geralmente é uma má ideia. Posso sugerir a execução de uma sessão do X11 como um usuário comum e ter apenas o seu script Python executado como root (somente se for verificado e somente se você realmente precisar)?

    
por 02.04.2017 / 23:32