파이썬 스크립트 또는 .desktop 파일에서 pkexec를 사용할 수 있습니까?


8

다음 질문에서

gksu는 더 이상 장기적으로 지원되지 않으며 기본적으로> = 13.04에서 설치되지 않습니다. 대신 그래픽이 아닌 응용 프로그램에서는 잘 작동하지만 GUI에서의 확장에는 적합하지 않은 pkexec를 사용해야합니다.

pkexec gedit

.desktop 파일에서 gksu를 교체 할 때

EXEC=pkexec /usr/bin/gedit

또는 파이썬 스크립트를 실행하여 루트 권한으로 그래픽 응용 프로그램을 실행하면 다음 오류가 발생합니다.

>>>subprocess.Popen(['pkexec','gedit'])
** (gedit:3203): WARNING **: Could not open X display

인증 대화 상자를 지원하고 gksu에 의존하지 않아야 할 경우 응용 프로그램을 루트로 실행하려면 스크립트 또는 .desktop 파일을 어떻게 다시 작성해야합니까?


sudo내가 업데이트 한 것 중 하나는 gksu에 대한 지원을 sudo에 통합하는 것과 관련이 있다고 말했습니다. 보아야 할 또 다른 사항 sudo -A은 매뉴얼 페이지에 따라 (아마도) 그래픽 로그인을 시작한다는 것입니다.
j0h

답변:


6

먼저에 .policy작업 파일을 만듭니다 /usr/share/polkit-1/actions/. 이 같은 "공급 업체의 계층 적"방식으로 액션 파일의 이름을 기존의 com.ubuntu.pkexec.gparted.policy또는org.debian.apt.policy

그런 다음 다음 내용을 붙여 넣습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">

<policyconfig>

  <action id="org.freedesktop.policykit.pkexec.run-[Short Program Name]">
    <description>Run [Full Program Name]</description>
    <message>Authentication is required to run [Full Program Name]</message>
    <defaults>
      <allow_any>no</allow_any>
      <allow_inactive>no</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">[Full Program Path]</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
  </action>

</policyconfig>

교체 [Short/Full Program Name/Path]예를 들어, 적절한 값 gedit, gedit Text Editor/usr/bin/gedit. <action id>value는 선택한 파일 이름과 일치하지 않아도되며 단일 파일에 여러 작업이 포함될 수 있지만 일반적으로 filename은 모든 작업의 ​​접두사입니다.

파일을 저장 한 후 특정 프로그램은 X 및 GUI 등으로 실행됩니다.

또 다른 수정은 다음과 같습니다. /etc/pam.d/polkit-1에 다음 줄을 추가하십시오.

세션 옵션 pam_xauth.so


1

사용자 스크립트를위한 또 다른 수정 : 스크립트 내에서 적절한 환경 변수를 결정하십시오.

다음과 같은 스 니펫을 사용하여이를 수행 할 수 있습니다.

getXuser() {
        user=`pinky -fw | awk '{ if ($2 == ":'$displaynum'" || $(NF) == ":'$displaynum'" ) { print $1; exit; } }'`
        if [ x"$user" = x"" ]; then
                startx=`pgrep -n startx`
                if [ x"$startx" != x"" ]; then
                        user=`ps -o user --no-headers $startx`
                fi
        fi
        if [ x"$user" = x"" ]; then
               user=$(pinky -fw | awk '{ print $1; exit; }')
        fi
        if [ x"$user" != x"" ]; then
                userhome=`getent passwd $user | cut -d: -f6`
                export XAUTHORITY=$userhome/.Xauthority
        else
                export XAUTHORITY=""
        fi
        export XUSER=$user
}


for x in /tmp/.X11-unix/*; do
   displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
   getXuser;
      if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
      fi
done

(ACPI getXuser기능 기준)

.desktop파일이 여전히 작동하지 않는 것을 발견하면 다음 pkexec commandline과 같이 sh스 니펫으로 파일을 래핑하십시오 .

Exec=sh -c "pkexec --user root script_that_needs_root.sh"

마지막 문제는 알려진 버그입니다.

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=690339

https://bugzilla.xfce.org/show_bug.cgi?id=9373

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=650038

https://bugzilla.gnome.org/show_bug.cgi?id=686059

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.