web-dev-qa-db-ja.com

グラフィック環境での「Sudo」セッションの動作

私はこれらの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回の呼び出しでのみ持続するだけで十分です。

3
isamert

私はいくつかのテストをしました。 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 -- "$@"を検討してください。
1