ルートNautilusウィンドウを起動するために使用する次の小さなスクリプトがあります(そうです、危険ですが、場合によっては必要です)。
#!/bin/bash
gksudo --description "Launch a root Nautilus" -- sh -c "xdg-open / &"
これは機能しますが、システムモニターは、ルートNautilusがシャットダウンされるまで、ルートが所有するnautilusプロセスインスタンスだけでなく、ルートが所有するgksudo、Sudo、およびxdg-openインスタンスも持っていることを示しています。
理想的には、ルートnautilusインスタンスのみを実行したいと思います。これは、コマンドラインの末尾のアンパサンドが実行すると想定されていたものです。
Nautilusを適切に切り離すにはどうすればよいですか?それはまったくできますか?
disown
bashビルトインを使用すると、xdg-open
はgksudo
からデタッチしますが、nautilus
については何もできません:
コマンド:
gksudo --description "Launch a root Nautilus" -- bash -c "xdg-open / & disown"
の効果:
$ pstree -ps $(pgrep -u root nautilus)
init(1)───lightdm(1095)───lightdm(1537)───init(1545)───xdg-open(29323)───nautilus(29376)─┬─{nautilus}(29378)
├─{nautilus}(29380)
├─{nautilus}(29381)
└─{nautilus}(29382)
残念ながら、これによりgksudo
がぶら下がって、何もしません。
$ pstree -ps $(pgrep gksudo)
init(1)───lightdm(1095)───lightdm(1537)───init(1545)───test.sh(29601)───gksudo(29604)─┬─{gksudo}(29605)
├─{gksudo}(29606)
├─{gksudo}(29608)
└─{gksudo}(29610)
ハックを気にしないのであれば、このスクリプトはgksudo
プロセスを取り除くことができます。
#! /bin/bash
gksudo --description "Launch a root Nautilus" -- bash -c "xdg-open / & disown; exit" &
sleep 10; kill %1
入力速度が足りない場合は、sleep
の長さを調整してください。
これは不完全ですが十分に近いです:
#!/ bin/bash set -e gksudo --description "Launch a root Nautilus"-\ sh -c "echo 'Password allowed '" gksudo-sh -c" xdg-open /& "& PID_GKSUDO =` pgrep -n gksudo` sleep 10 PID_XDGOPEN = `pgrep -u root -n xdg-open` Sudo kill $ PID_XDGOPEN $ PID_GKSUDO exit 0
いくつかの説明:
セット-e
これにより、ユーザーがパスワードプロンプトをキャンセルした場合、または何かが失敗した場合に、スクリプトが終了します。
gksudo --description "Launch a root Nautilus"-\ sh -c "echo 'Password allowed'"
この行は、ユーザーがパスワードを入力するか、プロンプトからキャンセルするまで戻りません。 echo
コマンドは無害で、スクリプトがコマンドラインから実行されたときに、Niceフィードバックを提供します。
gksudo-sh -c "xdg-open /&"&
gksudo ... &
は、最終的なパスワードプロンプトに関係なく、すぐに戻ります(スクリプトプロセスから切り離されるため)。前の行でパスワードの入力を求めたのはこのためです。それ以外の場合は、後でスリープする必要がある時間を特定できないためです。
また、xdg-open / &
もgksudo
から切り離されるため、gksudo
(子なし)とxdg-open
(目的のルートnautilus
プロセスの親)の2つの孤立が発生します。
PID_GKSUDO = `pgrep -n gksudo` sleep 10
ここでは、xdg-open
プロセスID(すぐに利用可能)を回復し、nautilus-gdu
が初期化されてウィンドウが表示されるのを待ちます。待機しなかった場合、プロセスがまだ存在しないため、次のPIDフェッチコマンドは失敗します(pgrep
はエラー1を返し、スクリプトはkill
行に進みません)。
PID_XDGOPEN = `pgrep -u root -n xdg-open` Sudo kill $ PID_XDGOPEN $ PID_GKSUDO exit 0
最後に、xdg-open
PIDとkill
を取得してから、スクリプトを終了します。