Posso usar o pkexec em um script python ou em um arquivo .desktop?

8

Das seguintes perguntas

vemos que o gksu não será mais suportado a longo prazo e não será instalado por padrão em > = 13.04. Em vez disso, devemos usar o pkexec, que faz seu trabalho bem para aplicativos não-gráficos, mas não para aplicações na GUI:

pkexec gedit

ao substituir o gksu em um arquivo .desktop

EXEC=pkexec /usr/bin/gedit

ou quando executo um script python para executar um aplicativo gráfico com permissões de root, recebo o seguinte erro:

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

Como eu teria que reescrever meus scripts ou meus arquivos .desktop para suportar um diálogo de autenticação e executar um aplicativo como root se eu não deveria depender do gksu?

    
por Takkat 29.04.2013 / 21:29

2 respostas

6

Primeiro, crie um arquivo de ação .policy em /usr/share/polkit-1/actions/ . É convencional nomear arquivos de ação de uma maneira "hierárquica do fornecedor", como com.ubuntu.pkexec.gparted.policy ou org.debian.apt.policy

Em seguida, cole o seguinte conteúdo:

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

Substitua [Short/Full Program Name/Path] pelos valores apropriados, por exemplo gedit , gedit Text Editor e /usr/bin/gedit . O valor <action id> não precisa corresponder ao nome do arquivo escolhido (e um único arquivo pode conter várias ações), mas convencionalmente o nome do arquivo é o prefixo de todas as suas ações.

Depois de salvar o arquivo, o programa específico será executado com X, GUI e outros.

Outra correção parece ser: Adicione a seguinte linha em /etc/pam.d/polkit-1:

% bl0ck_qu0te%     
por user43787 03.05.2013 / 07:19
1

Ainda outra correção para scripts de usuário: Determine as variáveis de ambiente apropriadas dentro do seu script.

Você pode usar um snippet como o seguinte para fazer isso:

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

(baseado na função getXuser da ACPI)

Se você achar que o arquivo .desktop ainda não está funcionando, tente agrupar seu pkexec commandline em um fragmento sh , por exemplo:

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

O último problema é um bug conhecido, aparentemente:

link

link

link

link

    
por Glutanimate 13.09.2013 / 05:35