我有一个 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 脚本(仅当它经过审查并且仅当您确实必须这样做时)?