私はこれらの2つのスクリプトを作成し、それらは私の$PATH
にあります。
gsudo:
#! /bin/bash
Sudo -n true &> /dev/null
if [ $? -eq 0 ]
then
Sudo "$@"
else
upass=$(zenity --password --title "Enter your password" 2> /dev/null)
[[ ! -z "$upass" ]] && echo $upass | Sudo -S -p "" "$@"
fi
このスクリプトは、基本的にgksu
と同じことを行います。 Sudo
にパスワードが必要かどうかを確認し、その結果に応じてパスワードを要求します。
run-something:
gsudo command1
gsudo command2
ターミナルウィンドウから2番目のスクリプトを実行すると、期待どおりの動作が得られます。パスワードを要求するのは1回だけです。しかし、タスクランナー(i3wm dmenuとrofiランチャーを試した)のようなグラフィカル環境から呼び出すと、パスワードを2回要求されます。では、なぜこれが起こっているのですか、どうすれば修正できますか? Sudo -n true
は同じスクリプトで呼び出されるため、どちらの場合も同じものを返す必要があると思います。そのため、Sudo
セッションは持続するはずです。異なるスクリプト呼び出し間でSudo
セッションを保存しようとはしていません。1回の呼び出しでのみ持続するだけで十分です。
私はいくつかのテストをしました。 Sudo
が昇格する能力をどのようにキャッシュするかは(まだ)完全には明らかではありません。おそらく、疑似端末が割り当てられているかどうかに関係があります。
もし私があなたなら、この質問で読むことができるものを実装します: スクリプト内でSudo
コマンドを実行するにはどうすればよいですか? 特に 答えの1つ :
スクリプト内に
Sudo
を含めることはめったに良い考えではありません。代わりに、スクリプトからSudo
を削除し、Sudo
を使用してスクリプト自体を実行します。
あなたの場合を除いて、それは私たちが話しているあなたのgsudo
です。さらに、必要に応じて$Sudo_USER
を使用します( この他の回答 から)。
例run-something
:
#!/path/to/my/gsudo /bin/bash
# The Shebang ensures the below code is for sure run with gsudo bash;
# gsudo runs Sudo, which sets $Sudo_USER (see `man Sudo').
command1 # This is run with gsudo because the entire script is.
# Get back to the invoking (possibly regular) user for just one command
Sudo -u "$Sudo_USER" command_whatever
# Again as root
command2
command3
# Get back to the invoking user for many commands
Sudo -u "$Sudo_USER" bash << EOF
foo
bar
baz
EOF
私のgsudo
は非常に単純です:
#!/bin/bash
Sudo_ASKPASS='/path/to/my/gsudo_helper' Sudo "$@"
そしてgsudo_helper
:
#!/bin/bash
zenity --password --title "Enter your password" 2> /dev/null
ノート:
gsudo
コードでSudo -A
を意図的に使用していません。このように、gsudo
は利用可能な場合は端末を使用し、それ以外の場合はzenity
を使用します。Sudo "$@"
を使用すると、gsudo
はコマンドラインオプション(前述の-A
など)をSudo
に渡すことができます。これはかなり良い考えですが、それを望まない場合はSudo -- "$@"
を検討してください。