web-dev-qa-db-ja.com

dbusとpolicykitを使用したルートタスク

ある時点で、アプリケーションは/ etcでファイルを作成したり、root権限でコマンドを実行したりするなどの管理タスクを実行する必要があります。

Q&Dができることを知っています。

os.popen("pkexec foo bar")

しかし、これが予見されたクリーンな方法ではないことも知っています。ユーザーがセッションのように処理するのではなく、常にパスワードを再入力する必要があるため、ユーザーにとってはうっとうしいものです。

python認証の例 を見つけたので、私は非常に楽観的でした。

すぐに動作する簡単な例です。

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

承認後、os.popen()-commandsを使用してスクリプトに進むことができると考えるのはかなり単純です。今、私はよく知っています:(

上記の例でタプル結果を見ることができますが、詳細なドキュメントでは、この時点で動作するコードを見つけることができませんでした。

この結果とどう関係しますか?必要なタスクを実行するにはどうすればよいですか?利用可能なメソッドを提供する例のpythonリファレンスはありますか?

私はdir()を使用して認証の方法をリストしようとしましたが、続行方法の手がかりが見つかりませんでした。

フォールバックの使用を避けたいのですが、最後の手段になります。正しい方法で私を助けてください:)

よろしく

アンドレ

編集:

私はこれを機能させなかったため、gksuでプログラムを開始することによる以前のソリューションは/ opt /で機能しなかったため、パスワードを要求する1000回の要求をあきらめて実装し、少なくともプログラムを初歩的に動作させる必要がありましたアプリの対決でTシャツ。

最初にすばやく共有したため、問題に気付きませんでした。そこではすべてが正常に機能しました。最初にパスワードを1回尋ねます。私は今完全にダウンしています。 AppShowdownに対する私の貢献は https://launchpad.net/armorforge でした。 ;-(

10
liberavia

最初に把握する必要がある基本的な概念があります。PolicyKitは権限のエスカレーションではなく、承認のみを処理します。 PolicyKitは「ユーザーにこのタスクを実行する権限がありますか?」という質問に答えますが、root権限は付与されません。

一般的に使用されるモデルは、root権限で実行されるDBusシステムサービスを作成することです。非ルートプロセスからの要求を受け取り、PolicyKitを使用してそのプロセスがその要求を行うことを許可されているかどうかを判断し、要求されたタスクを実行します。

buntuforums.orgのPythonを使用したPolicyKitとDBusのチュートリアル を数年前に書きました。原則は同じですが、更新が必要な場合があります。私は今寝る必要があるので、見て、更新が必要かどうかを教えてください。

6
Flimm