ฉันสามารถใช้ pkexec ในสคริปต์ python หรือไฟล์ .desktop ได้หรือไม่


8

จากคำถามต่อไปนี้

เราเห็นว่า gksu จะไม่ได้รับการสนับสนุนอีกต่อไปในระยะยาวและจะไม่ได้รับการติดตั้งเป็นค่าเริ่มต้นจาก> = 13.04 แต่เราควรใช้ pkexec ซึ่งทำงานได้ดีสำหรับแอปพลิเคชันที่ไม่ใช่แบบกราฟิก แต่ไม่ใช่สำหรับ apllications บน GUI:

pkexec gedit

เมื่อแทนที่ gksu ในไฟล์ .desktop

EXEC=pkexec /usr/bin/gedit

หรือเมื่อฉันเรียกใช้สคริปต์ python เพื่อเรียกใช้โปรแกรมกราฟิกที่มีสิทธิ์รูทฉันได้รับข้อผิดพลาดดังต่อไปนี้:

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

ฉันจะต้องเขียนสคริปต์หรือไฟล์ .desktop ของฉันอีกครั้งเพื่อรองรับกล่องโต้ตอบการรับรองความถูกต้องและเรียกใช้แอปพลิเคชันในฐานะรูทหากฉันไม่ควรขึ้นกับ gksu อย่างไร


หนึ่งในการอัปเดตของsudoฉันเห็นว่ามีบางอย่างเกี่ยวกับการรวมการสนับสนุน gksu เข้ากับ sudo สิ่งที่ต้องพิจารณาอีกประการหนึ่งคือsudo -Aตามที่หน้า man เปิดตัวเข้าสู่ระบบกราฟิก (อาจ)
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>

หลังจากบันทึกไฟล์โปรแกรมเฉพาะจะทำงานด้วย 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

(ขึ้นอยู่กับgetXuserฟังก์ชั่นACPI )

หากคุณพบว่า.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.