スクリプトの一部のみをsudoとして実行し、パスワードを1回だけ入力します


14

外部依存関係をインストールするスクリプト(実際にはスクリプトとmakefileの組み合わせ)を書いています:apt-getコマンド、gitクローン、ビルド、インストール、グループへのユーザーの追加、...

これらのスクリプトの操作には、スーパーユーザー権限が必要なものとそうでないものがあります。

これまで、sudoを使用してmakeプロセス全体を実行しましたが、いくつかの欠点があります。

  • gitクローンrootを所有者として取得するリポジトリ、つまり、sudoまたはchown
  • ユーザーをグループに追加するスクリプトは、whoami戻るためにどのユーザーを追加するかを知りませんroot

スーパーユーザーとしてそれを必要とするコマンドのみを実行する最良の方法は何ですか?理想的には、このプロセスではsudoパスワードを入力する必要がありますが、インストールプロセスの最初の1回だけです。それは最後にそれを忘れますが、それまでずっとそれを保ちます(それは数時間かかることがあります)。

私がオンラインで見つけた解決策は次のとおりです。

  • sudo -vスクリプトの冒頭で、しかし、私が正しく理解すれば、これはタイムアウトします。スクリプトが数時間実行される可能性があります
  • でスクリプトを実行しますがsudo、スーパーユーザーを必要としないコマンドはで実行しますsudo -u $(logname) <command>。これは私が今やっていることですが、それは逆のはずだと感じています。

理想的には、スクリプトで次のことを行います。

  1. スーパーユーザーの資格情報を要求する
  2. ログインしたユーザーとして通常のコマンドを実行する
  3. 手順1で入力した資格情報でsudoコマンドを実行します
  4. sudo -k スーパーユーザーセッションを閉じる

2
それでもすべてをsudoとして実行でき、スクリプトはSUDO_USER環境変数をチェックできます。存在する場合、sudoを呼び出すユーザーのユーザー名が含まれます。したがって、(ルートとして)$ SUDO_USER:$ SUDO_GID $ your_filesをchownできます。同様に、これらの変数をチェックして、adduserコマンドが追加するユーザーを知ることができます。
roadmr

...またはすべてをルートsu $SUDO_USER -c commandとして実行し、通常のユーザーとして実行するコマンドに使用します。
-Rmano

回答:


7

sudoアクセスがあるため、自分用にsudoersファイルを作成し、スクリプトが完了したら削除します。

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

2

私が一般的に推奨しない1つの方法は、自分でパスワードを読み取り、必要に応じてパスワードを渡すためにsudo-Sオプションを使用することです。

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

からman sudo

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.

1
それは安全ですか?echo "$password"
αғsнιη

@KasiyA echo "$password"はそうではありませんが、heredocsとherestringsはもう少し安全です。通常のツールで表示されるコマンドラインでは表示されません。
ムル

1
私は、厳密に言えば、考えるecho "$password"パイプの左側が上である bashスクリプトで安全。echoシェル組み込みです。/bin/echo単にとして呼び出されたときに実行されませんecho ...。他のいくつかのシェルにはechoビルトイン(dash)がありますが、Bourneスタイルのシェルには必須ではありません。だから私echo "$password" |はbashでは許容できると思うが、誰かが問題に気付かずにスクリプトを別のシェルに移植する場合は避けるのが最善かもしれません。同じ種類の問題を回避するために、そのスクリプトの[[代わりに非ポータブルを使用[ています。@KasiyA
Eliahケーガン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.