Tôi có thể sử dụng pkexec trong tập lệnh python hoặc tệp .desktop không?


8

Từ những câu hỏi sau

chúng tôi thấy rằng gksu sẽ không còn được hỗ trợ trong thời gian dài và nó sẽ không được cài đặt theo mặc định từ> = 13.04. Thay vào đó, chúng ta nên sử dụng pkexec, nó hoạt động tốt cho các ứng dụng phi đồ họa nhưng không áp dụng cho GUI:

pkexec gedit

khi thay thế gksu trong tệp .desktop

EXEC=pkexec /usr/bin/gedit

hoặc khi tôi chạy tập lệnh python để chạy ứng dụng đồ họa có quyền root, tôi gặp lỗi sau:

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

Làm cách nào để tôi phải viết lại tập lệnh hoặc tệp .desktop của mình để hỗ trợ hộp thoại xác thực và chạy ứng dụng với quyền root nếu tôi không nên phụ thuộc vào gksu?


Một trong những cập nhật sudomà tôi thấy đã nói điều gì đó về việc tích hợp hỗ trợ cho gksu vào sudo. Một điều khác để xem xét là sudo -Atheo trang man khởi chạy một đăng nhập đồ họa (có thể).
j0h

Câu trả lời:


6

Đầu tiên tạo một .policytập tin hành động trong /usr/share/polkit-1/actions/. Thông thường đặt tên tệp hành động theo cách "phân cấp nhà cung cấp", chẳng hạn như com.ubuntu.pkexec.gparted.policyhoặcorg.debian.apt.policy

Sau đó dán nội dung sau:

<?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>

Thay thế [Short/Full Program Name/Path]bằng các giá trị thích hợp, ví dụ gedit, gedit Text Editor/usr/bin/gedit. <action id>giá trị không cần phải khớp với tên tệp đã chọn (và một tệp có thể chứa nhiều hành động), nhưng tên tệp thông thường là tiền tố cho tất cả các hành động của nó.

Sau khi lưu tệp, chương trình cụ thể sẽ chạy với X và GUI, v.v.

Một cách khắc phục khác có vẻ là: Thêm dòng sau vào /etc/pam.d/polkit-1:

phiên tùy chọn pam_xauth.so


1

Một cách khắc phục khác cho tập lệnh người dùng: Xác định các biến môi trường phù hợp bên trong tập lệnh của bạn.

Bạn có thể sử dụng một đoạn như sau để làm điều này:

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

(dựa trên getXuserchức năng ACPI )

Nếu bạn thấy .desktoptệp của mình vẫn không hoạt động, bạn có thể thử gói pkexec commandlinetrong một shđoạn mã, ví dụ:

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

Vấn đề cuối cùng là một lỗi đã biết, rõ ràng:

http://bugs.debian.org/cgi-bin/orpreport.cgi?orms=690339

https://ormszilla.xfce.org/show_orms.cgi?id=9373

http://bugs.debian.org/cgi-bin/orpreport.cgi?orms=650038

https://ormszilla.gnome.org/show_orms.cgi?id=686059

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.