ボタンをクリックすると、Webページを開く機能の場合はrootとして実行されるPythonプログラムがあります。 FirefoxでrootとしてWebページを開いて、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のみが重要です。
X11セッションをrootとして実行するのは一般的に悪い考えです。通常のユーザーとしてX11セッションを実行し、rootとしてPythonスクリプトのみを実行することを提案できますか?