루트로 실행되는 Python 프로그램은 일반 사용자를 통해 URL을 엽니다.

루트로 실행되는 Python 프로그램은 일반 사용자를 통해 URL을 엽니다.

버튼을 클릭하면 웹 페이지를 여는 기능인 경우 루트로 실행되는 Python 프로그램이 있습니다. 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만 중요합니다.

X11 세션을 루트로 실행하는 것은 일반적으로 나쁜 생각입니다. 일반 사용자로 X11 세션을 실행하고 루트로 Python 스크립트만 실행하는 것을 제안해도 될까요(심의를 거쳐 실제로 필요한 경우에만)?

관련 정보