Tentando executar um processo com pkexec de forma assíncrona e obter 'Recusando-se a prestar serviço a pais mortos'

0

Estou tentando executar um processo como root em meu aplicativo que é executado com privilégios normais usando pkexec .

Quando invoco pkexec de forma síncrona, tudo corre bem, mas quando o executo de forma assíncrona com o seguinte código:

    private void execute_process_async () {

        if (permission.allowed ) {
            ...

            Pid child_pid;
            var cli = "%s/my_exec".printf (Build.PKGDATADIR);
            try {

                Process.spawn_async (null,
                    {   "pkexec", cli,
                        settings.scrollbar_width.to_string (),
                        settings.scrollbar_button_radius.to_string (),
                        settings.active_tab_underline_color
                    },
                    Environ.get (),
                    SpawnFlags.SEARCH_PATH,
                    null,
                    out child_pid);
            } catch (SpawnError e) {
                report_error ("error while executing '%s'. Message: '%s'.".printf (cli, e.message)) ;
            }
        }
    }

Recebo uma mensagem de erro bastante desagradável:

Refusing to render service to dead parents.

Você sabe o que está acontecendo?

    
por Name is carl 12.04.2015 / 18:05

2 respostas

3

Não é permitido executar pkexec no plano de fundo por fork e exec e, em seguida, finalizar o pai. O processo se torna órfão e pertence a init (ppid == 1). Consulte o link .

Você está dando o controle de um aplicativo para outro usuário (geralmente root). A maneira padrão é executar o aplicativo com pkexec como root em um script de shell. Desta forma, o pai é um shell e não init .

g. GParted ( /usr/bin/gparted-pkexec ) e GameConqueror ( /usr/bin/gameconqueror ) fazem isso como mostrado abaixo:

  1. Crie um script de shell como /usr/local/bin/foo.sh :

    #!/bin/sh
    pkexec "/usr/sbin/foo" "$@"
    
  2. Conceder permissão executável ao script acima:

    chmod +x /usr/local/bin/foo.sh
    
  3. Se você estiver usando o arquivo .desktop , altere o valor Exec como:

    Exec=/usr/local/bin/foo.sh
    
  4. Certifique-se de que seu arquivo de políticas em /usr/share/polkit-1/actions/ tenha a seguinte entrada para permitir a GUI:

    <annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
    

É isso!

    
por Sebastian Parschauer 14.01.2016 / 17:01
0

Confira este link que funcionou para mim.

  • Explica como instalar o policykit-1, que fornece o pkexec.
  • explica o uso para o escalonamento de privilégios do prompt gui su
  • Configuração de aliases de Bash para usar aliases para executar programas sem precisar digitar

    pkexec application-name
    
  • Em vez disso, ele se torna alias (nome do aplicativo):

    application-name
    
por TinyRickHole 24.03.2018 / 07:48