web-dev-qa-db-ja.com

pkexecを使用してGUIアプリケーションをrootとして実行するにはどうすればよいですか?

Gnome3 Flashback デスクトップ環境に付属する Trisquel GNU/Linux-Libreを使用しています。

Sudogksudoを使用してGUIアプリケーションをrootとして実行できることはわかっていますが、pkexecを使用してGUIアプリケーションをrootとして実行するにはどうすればよいですか?

pkexec geditによってgedit(または他のアプリケーション:nautilus)を実行しようとすると、認証用のパスワードの入力を求められます:-

screenshot

パスワードを入力した後、エラーで終了します:-

$ pkexec gedit
error: XDG_RUNTIME_DIR not set in the environment.

(gedit:6135): Gtk-WARNING **: cannot open display:

そのため、表示環境に問題があるようです。

私もDISPLAY=:0 pkexec geditを試しましたが、うまくいきません。


以下の情報はman pkexecから入手できます。

PROGRAMが実行する環境は、LD_LIBRARY_PATHまたは同様のメカニズムを介したコードの挿入を回避するために、最小限の既知の安全な環境に設定されます。さらに、PKEXEC_UID環境変数は、pkexecを呼び出すプロセスのユーザーIDに設定されます。その結果、$ DISPLAYおよび$ XAUTHORITY環境変数が設定されていないため、pkexecでは別のユーザーとしてX11アプリケーションを実行できません。アクションのorg.freedesktop.policykit.exec.allow_guiアノテーションが空でない値に設定されている場合、これらの2つの変数は保持されます。ただし、これはお勧めできません。従来のプログラムでのみ使用してください。

今、私はこれを達成するために何をすべきか分かりません。

したがって、pkexecを使用して、GUIアプリケーションをrootとして実行する方法を見つけてください。またはこれは可能ですか?


ところで、正常に動作するgparted-pkexeccommandに触発されました。 gpartedはどのようにpkexecを使用しますか?

16
Pandya

これは、policykitにカスタムアクションを追加することで実行できます。 pkexecを使用してgeditをrootとして実行する場合は、新しいファイル/usr/share/polkit-1/actions/org.freedesktop.policykit.gedit.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.gedit">
    <description>Run gedit program</description>
    <message>Authentication is required to run the gedit</message>
    <icon_name>accessories-text-editor</icon_name>
    <defaults>
        <allow_any>auth_admin</allow_any>
        <allow_inactive>auth_admin</allow_inactive>
        <allow_active>auth_admin</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/gedit</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
    </action>
</policyconfig>

最後に、pkexec geditは期待どおりに機能するはずです。


マンページまたは リファレンスマニュアル にアクセスしてください。

$ man pkexec | grep -i ^Example -A 60
EXAMPLE
       To specify what kind of authorization is needed to execute the program /usr/bin/pk-example-frobnicate as
       another user, simply write an action definition file like this

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

             <vendor>Examples for the PolicyKit Project</vendor>
             <vendor_url>http://hal.freedesktop.org/docs/PolicyKit/</vendor_url>

             <action id="org.freedesktop.policykit.example.pkexec.run-frobnicate">
               <description>Run the PolicyKit example program Frobnicate</description>
               <description xml:lang="da">Kør PolicyKit eksemplet Frobnicate</description>
               <message>Authentication is required to run the PolicyKit example program Frobnicate (user=$(user), program=$(program), command_line=$(command_line))</message>
               <message xml:lang="da">Autorisering er påkrævet for at afvikle PolicyKit eksemplet Frobnicate (user=$(user), program=$(program), command_line=$(command_line))</message>
               <icon_name>audio-x-generic</icon_name>
               <defaults>
                 <allow_any>no</allow_any>
                 <allow_inactive>no</allow_inactive>
                 <allow_active>auth_self_keep</allow_active>
               </defaults>
               <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/pk-example-frobnicate</annotate>
             </action>

           </policyconfig>

       and drop it in the /usr/share/polkit-1/actions directory under a suitable name (e.g. matching the namespace of
       the action). Note that in addition to specifying the program, the authentication message, description, icon
       and defaults can be specified. Note that occurences of the strings $(user), $(program) and $(command_line) in
       the message will be replaced with respectively the user (of the form "Real Name (username)" or just "username"
       if there is no real name for the username), the binary to execute (a fully-qualified path, e.g.
       "/usr/bin/pk-example-frobnicate") and the command-line, e.g. "pk-example-frobnicate foo bar". For example, for
       the action defined above, the following authentication dialog will be shown:

           [IMAGE][2]

               +----------------------------------------------------------+
               |                     Authenticate                     [X] |
               +----------------------------------------------------------+
               |                                                          |
               |  [Icon]  Authentication is required to run the PolicyKit |
               |          example program Frobnicate                      |
               |                                                          |
               |          An application is attempting to perform an      |
               |          action that requires privileges. Authentication |
               |          is required to perform this action.             |
               |                                                          |
               |          Password: [__________________________________]  |
               |                                                          |
               | [V] Details:                                             |
               |  Command: /usr/bin/pk-example-frobnicate                 |
               |  Run As:  Super User (root)                              |
               |  Action:  org.fd.pk.example.pkexec.run-frobnicate        |
               |  Vendor:  Examples for the PolicyKit Project             |
               |                                                          |
               |                                  [Cancel] [Authenticate] |
               +----------------------------------------------------------+
11
taliezin