pkexec
を使用して通常の権限で実行するアプリケーションからrootとしてプロセスを実行しようとしています。
pkexec
を同期的に呼び出すと、すべてうまくいきますが、次のコードで非同期に実行すると、
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)) ;
}
}
}
かなり厳しいエラーメッセージが表示されます。
Refusing to render service to dead parents.
何が起こっているか知っていますか?
Forkとexecを使用してバックグラウンドでpkexec
を実行し、親を終了することはできません。プロセスは孤立し、init
(ppid == 1)に属します。 https://lists.ubuntu.com/archives/foundations-bugs/2012-July/100103.html を参照してください。
別のユーザー(通常はroot)にアプリケーションの制御権を与えます。デフォルトの方法は、シェルスクリプトからrootとしてpkexec
を使用してアプリケーションを実行することです。このように、親はinit
ではなくシェルです。
例: GParted(/usr/bin/gparted-pkexec
)とGameConqueror(/usr/bin/gameconqueror
)は、次のようにこのようにします。
シェルスクリプトを/usr/local/bin/foo.sh
として作成します。
#!/bin/sh
pkexec "/usr/sbin/foo" "$@"
上記のスクリプトに実行権限を付与します。
chmod +x /usr/local/bin/foo.sh
.desktop
ファイルを使用している場合は、Exec
の値を次のように変更します。
Exec=/usr/local/bin/foo.sh
GUIを許可するには、/usr/share/polkit-1/actions/
のポリシーファイルに次のエントリがあることを確認してください。
<annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
それでおしまい!
これをチェックしてくださいリンクうまくいきました。
入力せずにエイリアスを使用してプログラムを実行するためのBashエイリアスのセットアップ
pkexec application-name
代わりに、エイリアス(アプリケーション名)になります。
application-name