Comando pkexec em um arquivo .desktop


13

Criei um arquivo .desktop para o Flashtool da Androxyde (utilitário para dispositivos Sony Xperia que tenho que abrir com um arquivo executável em sua pasta) que requer privilégios de root para usar os utilitários de inicialização rápida. Eu costumava fazer isso funcionar gksu, mas estou no Ubuntu 15.04 e o gksu agora é antigo.

Eu tentei modificar a execlinha de

Exec=gksu /home/natasha/FlashTool/FlashTool
para
Exec=pkexec /home/natasha/FlashTool/FlashTool
Então, eu li sobre o pkexec não permite executar aplicativos X11 e, portanto, substituo desta maneira:

insira a descrição da imagem aqui

Link para a imagem completa no Imgur.com

O problema agora é: ele me pede a senha, mas a GUI do Flashtool não inicia. MAS, se eu executar esse comando no terminal, o programa inicia sem problemas. O que eu posso fazer?

insira a descrição da imagem aqui

Link para a imagem completa no Imgur.com


O pkexec precisa de um arquivo de políticas para funcionar, você precisa criar um, algumas informações aqui - freedesktop.org/software/polkit/docs/0.105/pkexec.1.html ou usar os existentes para ver como é feito, - / usr / share / polkit-1 / actions. Observe que às vezes as políticas são melhores quando parte de uma instalação de aplicativo (ou seja, funciona sem problemas), se você receber um erro 'Não é possível abrir a tela', existem soluções alternativas como ubuntuforums.org/…
doug

Respostas:


9

Crie um novo arquivo no /usr/share/polkit-1/actions/

sudo nano /usr/share/polkit-1/actions/FlashTool.policy

e adicione as linhas abaixo:

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

Em seguida, crie um novo arquivo /home/natasha/FlashTool/

nano /home/natasha/FlashTool/flashtool-pkexec

e adicione as linhas abaixo:

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

Use a linha abaixo para Execno seu desktoparquivo:

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

Testado no meu sistema Ubuntu 15.04 GNOME com os seguintes arquivos:


$ 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" "$@"

Funciona! A única coisa que modifiquei está no Execcomando: escrevi Exec=pkexec /home/natasha/FlashTool/FlashToolcomo antes, porque o flashtool-pkexec não funciona no arquivo .desktop. Graças ao arquivo de políticas, ele funciona como um encanto. Obrigado!
N

@nplezka Para executar um script de shell a partir de um arquivo .desktop, mesmo com #!, você precisa prefixar o Execcomando com /bin/sh.
TheSola10

0

sudo -Hé suficiente para iniciar um aplicativo gráfico que impede alterações nos arquivos de configuração do usuário ~/, pois define o diretório inicial do ambiente em execução como diretório inicial da raiz:

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

Em um desktoparquivo?
AB

@ AB Sim, por que não?
kos

@AB É o mesmo que executá-lo em qualquer shinstância (provavelmente com algumas variáveis ​​de ambiente definidas ad hoc, mas não há problema).
kos

Eu não acho que ele vai pedir sua senha e iniciar o aplicativo sudose você tiver uma Terminal=falselinha no .desktopiniciador (como o OP tem aqui). No entanto, provavelmente ele funcionaria Terminal=true.
pomsky 26/01/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.