Tarefas raiz usando dbus e policykit

9

Em algum momento, meu aplicativo precisa executar tarefas administrativas, como criar um arquivo em / etc ou executar comandos com privilégios de root.

Eu sei que só poderia fazer um Q & amp; D:

os.popen("pkexec foo bar")

Mas também sei que esta não é a forma limpa prevista para o fazer. Algum tipo de aborrecimento para o usuário, porque ele sempre precisa inserir novamente sua senha, em vez de ter uma manipulação semelhante a uma sessão.

Eu estava muito otimista quando encontrei o exemplo da Python para autenticar .

É um exemplo simples que funciona imediatamente:

import dbus

bus = dbus.SystemBus()
proxy = bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority')
authority = dbus.Interface(proxy,  dbus_interface='org.freedesktop.PolicyKit1.Authority')

system_bus_name = bus.get_unique_name()

subject = ('system-bus-name', {'name' : system_bus_name})
action_id = 'org.freedesktop.policykit.exec'
details = {}
flags = 1            # AllowUserInteraction flag
cancellation_id = '' # No cancellation id

result = authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)

print result

Eu fui bastante ingênuo pensando que, após a autorização, eu poderia simplesmente continuar no script com alguns comandos os.popen (). Agora eu sei melhor: (

Eu posso ver o resultado da tupla no exemplo acima, mas na documentação adicional eu não consegui encontrar um código de trabalho para continuar neste ponto.

O que eu tenho a ver com esse resultado? Como posso continuar executando as tarefas de que preciso? Existe uma referência python com exemplos que oferecem os métodos disponíveis?

Tentei listar os métodos de autorização usando dir (), mas não consegui encontrar nenhuma pista sobre como prosseguir.

Eu realmente quero evitar usar meu fallback, mas seria meu último recurso. Por favor me ajude a fazer do jeito certo:)

Obrigado e cumprimentos

André

Editar:

Devido eu não trouxe isso para o trabalho e minha solução anterior, iniciando o meu programa com gksu não funciona fora / opt /, eu finalmente tive que desistir e implementar um mil pede senha para tornar o trabalho rudimentar do programa para obter pelo menos uma camiseta no showdown do aplicativo.

Eu não percebi o problema porque eu fiz um compartilhamento rápido. Lá tudo funcionou bem. Perguntando uma vez pela senha no começo. Estou totalmente desanimada agora. Minha contribuição para AppShowdown foi link . ; - (

    
por liberavia 04.07.2012 / 23:37

1 resposta

4

Existe um conceito fundamental que você precisa entender primeiro: O PolicyKit só lida com autorização, não com o escalonamento de privilégios. O PolicyKit responderá a pergunta: "o usuário está autorizado a fazer esta tarefa?", Mas não lhe dará privilégios de root.

O modelo comumente usado é criar um serviço de sistema DBus, que é executado com privilégios de root. Ele receberá solicitações de processos não-raiz, use o PolicyKit para determinar se esse processo está autorizado a fazer essa solicitação e, em seguida, execute a tarefa solicitada.

Eu escrevi um tutorial sobre sobre o PolicyKit e o DBus com o Python em ubuntuforums.org alguns anos atrás. Os princípios são os mesmos, embora possam precisar de alguma atualização. Eu preciso ir para a cama agora, então dê uma olhada e deixe-me saber se precisa de atualização.

    
por Flimm 12.11.2012 / 00:24