以root身份运行的python程序通过普通用户打开url

以root身份运行的python程序通过普通用户打开url

我有一个 python 程序,如果它的功能是单击按钮即可打开网页,则该程序以 root 身份运行。它一直以root身份在firefox中打开网页,所以我尝试使用setuid但无济于事。以下是我尝试以普通用户身份打开链接的方法:

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()

答案1

我不知道它的QtGui.QDesktopServices.openUrl作用是什么,但我强烈怀疑它通过 X11 会话与某些 KDE 守护进程通信,而不是直接将浏览器作为其子进程启动,从而在适当的应用程序中打开 URL。您可以通过查看生成的浏览器的父进程 ID 来验证这一点。因此,您的脚本切换到什么 UID 并不重要,只有守护进程的 UID 才重要。

以 root 身份运行 X11 会话通常是一个坏主意。我是否可以建议以普通用户身份运行 X11 会话,并仅以 root 身份运行 Python 脚本(仅当它经过审查并且仅当您确实必须这样做时)?

相关内容