.desktop 文件中的 pkexec 命令

.desktop 文件中的 pkexec 命令

我为 Androxyde 的 Flashtool(适用于 Sony Xperia 设备的实用程序,我必须使用其文件夹中的可执行文件打开)创建了一个 .desktop 文件,该文件需要 root 权限才能使用 fastboot 实用程序。我曾经让它与 一起工作gksu,但我使用的是 Ubuntu 15.04,而 gksu 现在已经过时了。

exec我尝试修改

Exec=gksu /home/natasha/FlashTool/FlashTool
Exec=pkexec /home/natasha/FlashTool/FlashTool
然后,我读到有关 pkexec 不允许运行 X11 应用程序的信息,因此我以这种方式覆盖:

在此处输入图片描述

链接到 Imgur.com 上的完整图片

现在的问题是:它要求我输入密码,但 Flashtool 的 GUI 没有启动。但如果我在终端中执行该命令,程序就会顺利启动。我该怎么办?

在此处输入图片描述

链接到 Imgur.com 上的完整图片

答案1

在中创建新文件/usr/share/polkit-1/actions/

sudo nano /usr/share/polkit-1/actions/FlashTool.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-FlashTool">
    <description>Run FlashTool</description>
    <message>Authentication is required to run FlashTool</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">/home/natasha/FlashTool/FlashTool</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
  </action>

</policyconfig>

然后创建一个新文件/home/natasha/FlashTool/

nano /home/natasha/FlashTool/flashtool-pkexec

并添加以下几行:

#!/bin/sh
pkexec "/home/natasha/FlashTool/FlashTool" "$@"

Exec在您的desktop文件中使用以下行:

Exec=/home/natasha/FlashTool/flashtool-pkexec

已测试在我的系统 Ubuntu 15.04 GNOME 上有以下文件:


$ cat /usr/share/applications/gedit.root.desktop 
[Desktop Entry]
Name=Gedit as root
GenericName=Text Editor
X-GNOME-FullName=
Comment=
Exec=gedit-pkexec
Icon=gedit
Terminal=false
Type=Application
Categories=GNOME;System;Filesystem;Settings;
StartupNotify=true
X-Ubuntu-Gettext-Domain=gedit

$ cat /usr/share/polkit-1/actions/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.run-FlashTool">
    <description>Run FlashTool</description>
    <message>Authentication is required to run FlashTool</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">/usr/bin/gedit</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
  </action>

</policyconfig>

$ cat /usr/bin/gedit-pkexec 
#!/bin/sh
pkexec "gedit" "$@"

答案2

您也可以更改

Exec=APP_COMMAND

Exec=sh -c "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY APP_COMMAND"

这样,您将被询问密码,程序将照常启动。

(看如何从 Unity Launcher 以 root 身份启动应用程序?了解更多信息和推理。TL;DR:sh -c在 shell 中启动它,后续代码在其中工作,正如 op 所确认的那样。pkexec然后以 root 身份启动“APP_COMMAND”,但需要环境变量才能真正启动 GUI 应用程序。)

答案3

sudo -H足以启动图形应用程序以防止更改用户的配置文件~/,因为它将运行环境的主目录设置为 root 的主目录:

Exec=sudo -H /home/natasha/FlashTool/FlashTool

答案4

桌面文件的内容(/usr/share/applications/Flashtool.desktop~/.local/share/applications/Flashtool.desktop)。

[Desktop Entry]
Name=Flashtool
GenericName=Flashtool
Comment=Tool for Xperia Devices
Type=Application
Categories=Qt;FileTransfer;Chat
Terminal=false
Icon=/usr/share/icons/Numix-Circle-Light/48x48/apps/nitrotasks.svg
Exec=/home/natasha/FlashTool/FlashTool
Actions=new-root-window

[Desktop Action new-root-window]
Name=New Root Window
Exec=sh -c "pkexec --disable-internal-agent env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY /home/natasha/FlashTool/FlashTool"
Terminal=true

右键单击桌面图标并选择New Root Window

相关内容