rootとして実行されるPythonプログラムは、通常のユーザーを介してURLを開きます。

rootとして実行されるPythonプログラムは、通常のユーザーを介してURLを開きます。

ボタンをクリックすると、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スクリプトのみを実行することを提案できますか?

おすすめ記事