Bashスクリプトファイルをsudo実行すると、Bashスクリプト内のすべてのコマンドもsudoとして実行されますか?


30

Bashで自動化されたインストール後スクリプト(post-install.shたとえばと呼ばれる)を作成したい。このスクリプトは、リポジトリを自動的に追加および更新し、パッケージをインストールおよび更新し、構成ファイルを編集します。

ここで、たとえばを使用してこのスクリプトを実行するsudo post-install.shと、sudoパスワードの入力が1回だけ求められますか、それともsudoスクリプト内でsudo許可が必要なコマンドを呼び出すたびにパスワードを入力する必要がありますか?言い換えれば、bashスクリプト内のコマンドは、いわば実行権限を「継承」していますか?

そして、実際にそうする場合、sudoアクセス許可がタイムアウトする可能性はまだありますか(たとえば、特定のコマンドがsudoタイムアウトを超えるのに十分な時間がかかる場合)?または、最初のsudoパスワード入力は、スクリプト全体が完了するまで続きますか?


4
このタスク専用に設計されたいくつかのツールをチェックしてください。3つの一般的なものは、Puppet、chef、およびancibleです。
スパーダー14

あなたの構成管理の@spuder、および大規模なため、エンタープライズレベルのアーキテクチャとセキュリティ、あなたは(ない心臓の弱いため、また一回限りのコマンドのために。)cfengineの3を使用することができます
ワイルドカード

回答:


38

Q#1: sudoパスワードの入力を一度だけ要求されますか、それともスクリプト内でsudo許可が必要なコマンドを呼び出すたびにsudoパスワードを入力する必要がありますか?

はい、スクリプトの実行中に1回。

注意:資格情報を提供する場合sudo、認証は通常、パスワードを入力したシェル内で5分間有効です。さらに、このシェルから実行されるすべての子プロセス、またはシェル(ケース)で実行されるスクリプトも、昇格されたレベルで実行されます。

Q#2: sudoパーミッションがタイムアウトする可能性はまだありますか(たとえば、特定のコマンドがsudoタイムアウトを超えるのに十分な時間がかかる場合)?または、最初のsudoパスワードの入力は、スクリプト全体が完了するまで続きますか

いいえ、スクリプト内でタイムアウトしません。資格情報が提供されたシェル内で対話形式で入力した場合のみ。sudoこのシェル内で実行されるたびに、タイムアウトがリセットされます。しかし、あなたの場合、スクリプトがその中からコマンドを実行および実行している限り、それらの資格情報は残ります。

sudo manページからの抜粋

この制限はポリシー固有です。sudoersセキュリティポリシーのデフォルトのパスワードプロンプトタイムアウトは5分です。


1
Q1の答えは、「いいえ、再度プロンプトは表示されません。」です。
ダニーザウアー14

@dannysauer-彼の質問をもう一度読んでください。パスワードの入力を1回だけ要求されることに「はい」と言っています!
slm

質問は「それはaまたはbです」と言い、「はい」と言っただけでは「はい、a」または「はい、b」であるかどうかを明確にしませんでした。将来の読者のために物事を明確にしようとしています。:D
ダニーザウアー14

@dannysauer-アップデートを参照してください。
slm

1
この新しい質問は、stackoverflow.com / questions / 3522341 / …になります。sudo -u $(logname) <command>動作するはずです。
ゴーティエ

17

bashまた、そのすべての子プロセスはスーパーユーザー権限で実行されます。したがって、bashスクリプトのコマンドにパスワードを再入力する必要はありません。

sudoタイムアウトは唯一の(後の)別の呼び出しに適用されますsudo。すでに実行中のbashプロセス、またはその子孫には影響しません。


3

これらの答えはすべて正しいでしょう。ただし、これは、sudoアクセス許可を必要とするbashスクリプトを作成する一般的な方法ではありません(私が知る限り)。一般に、スクリプトの上部では、sudoアクセス許可を使用して実行されていないことを想定し、代わりにsudo -v自分自身を呼び出して(ユーザーにパスワードを要求する)sudo「セッション」を「セットアップ」します。echoプロンプトの前に説明テキストを追加するかsudo-pスイッチでの独自のプロンプトをオーバーライドして、sudoいくつかのコマンドにアクセスする必要があることをユーザーに知らせることができます。

次に、スクリプトsudoで、さらにパスワードを要求せずに、それを必要とするコマンド(およびそれを必要とするコマンドのみ)を呼び出しても問題ありません。スクリプトで一緒に実行されるコマンドの特定のグループ(の独自の使用に関係なくsudo)がsudoタイムアウトを超えると思われる場合はsudo -v、一種の「キープアライブsudo」セッションを発行するために途中で呼び出すことができます'。

場合はsudo「セッションは」スクリプト中に期限切れになることが起こるん、ユーザーは単に自分のパスワードのスクリプトでsudoコマンドを発行し、次回に要求されます。


1
スクリプトのステップの1つがまったく新しいLinuxカーネルを構築しているとしましょう。これには約2時間かかります。セッションを維持するのは難しいかもしれませんが、どのように対処しましたか?
ゴーティエ

できません。ただし、次に電話をかけるsudo -vときは、ユーザーにもう一度パスワードを尋ねます。私の意見では最悪の問題ではありません。役に立つかもしれません。ユーザーにメカニズムを認識させると便利かもしれません。
アレクサンドル

これの逆は、ユーザーが他の回答ごとにsudoを使用してスクリプトを呼び出すことを要求し、sudo -u $SUDO_USERルート以外のすべてのコマンドを昇格せずに実行することを要求することです。悲しいことに、それはより多くのコードを追加しますが、長時間実行されるプロセスで根本的なことを実行する唯一の信頼できる方法です。
dragon788

私は明確にする必要があると思います、これを行う別の方法は、スクリプトの最初にsudoを呼び出して一時ファイルを/etc/sudoers.d使用visudo -c -f /tmp/tempsudoersして、ファイルが正しい場所にコピーされる前に有効であることを確認し、完了したらそのファイルを削除することです(終了/エラーのトラップを使用して、エスカレーションが悪用されないようにします)。最も安全で安全な実装では、NOPASSWD各コマンド/引数を配列に保存してファイルを作成することにより、ユーザーはパスワードなしで特定の引数を使用してスクリプト内の特定のコマンドを実行できます。
dragon788

ここで@Gauthierに戻るのは少し遅れますがsudo、特定のタスクがタイムアウトより長くかかるとセッションを維持できないと言ったとき、私は間違っているように見えます。私はレポマティアスBynensのドットファイルに先日この技術に出くわした:while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.