sudoループを含むスクリプトにパスワードを繰り返し提供するにはどうすればよいですか?

sudoループを含むスクリプトにパスワードを繰り返し提供するにはどうすればよいですか?

以下を含むスクリプトがあります。

while true
  sudo mycmd
  sleep 10000
  [ ... ] ; break
end

bashでスクリプトを実行するときsudo mycmd

「はいまたはいいえ」という質問に対する答えとして、標準入力として繰り返しyes | somecommand提供できることを覚えています。スクリプトにパスワードを繰り返し提供する方法を知りたいです。yessomecommand

ありがとうございます。

答え1

パスワードをsudoコマンドにパイプで接続できますが、これはまったく安全ではないため、可能であれば避けてください。

echo 'hunter2' | sudo -S mycmd

より良いアプローチは、スクリプト全体を実行しsudo、パスワードを一度だけ要求することです。

パスワードの使用を完全に避けることも可能ですsudoが、これもセキュリティ上の理由からお勧めできません。これは、コマンドを/etc/sudoers使用してファイルを更新し、visudoグループ内のすべてのユーザーに対してこのような行を含めることによって実行できますwheel

%wheel ALL=(ALL) NOPASSWD: ALL

単一のユーザーに対してのみ無効にするには、%wheelそのユーザーのユーザー名に切り替えます。

答え2

尋ねる:

スクリプトにパスワードを繰り返し提供するにはどうすればよいですか?

そしてエバートの答え簡単なアプローチが実証されています。

ewattが述べたように、「Sudo mycmd」ルールと一緒に「NOPASSWD」フラグを使用すると、パスワードを完全に尋ねることを回避できます。

または、スクリプトにパスワードをハードコードしたくない場合は、次の設定でこの特定のコマンドのパスワードを次の再起動までキャッシュできることをsudoに通知します。タイムスタンプタイムアウト負の値です。ここでは、コマンドの別名を定義し(/tmp/mycmd.shをランダムに置き換えて)、Defaultsそれを定義に使用します。

Cmnd_Alias MYCMD = /tmp/mycmd.sh
Defaults!MYCMD timestamp_timeout=-1
tim ALL = MYCMD

またはあなたできるユーザーレベルのタイムアウトデフォルトを設定します。

Defaults:tim timestamp_timeout=-1

...これは意味しますあなたのタイムスタンプは次のとおりです。どのsudoコマンドは、次回再起動するまでキャッシュされます。

または、すべてのコマンドとユーザーをタイムアウトすることができますが、特定の状況ではまだ可能です。所有者:

Defaults@thishost timestamp_timeout=-1

このようにtimestamp_timeoutを設定すると、sudoは最初にパスワードを入力した後にパスワードをキャッシュできます。

スクリプトの各ループ中にパスワードを入力しないようにこれらのオプションの1つを実装しますが、別のアクティビティに対してパスワードをDefaults入力するセーフティネットを好む場合、runはsudo -ksudoにタイムスタンプを「終了」(またはリセット)するように求めますに指示します。次回の入力に。 sudoに認証するたびに、この「キャッシュ」...「リセット」プロセスが再開されます。

「次回の再起動まで」が長すぎる場合は、10000秒(分単位)より大きい値、つまり166より大きい「十分」に設定してください! - 各サイクルでパスワードを確認して入力できます。

関連情報