以下を含むスクリプトがあります。
while true
sudo mycmd
sleep 10000
[ ... ] ; break
end
bashでスクリプトを実行するときsudo mycmd
。
「はいまたはいいえ」という質問に対する答えとして、標準入力として繰り返しyes | somecommand
提供できることを覚えています。スクリプトにパスワードを繰り返し提供する方法を知りたいです。yes
somecommand
ありがとうございます。
答え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 -k
sudoにタイムスタンプを「終了」(またはリセット)するように求めますに指示します。次回の入力に。 sudoに認証するたびに、この「キャッシュ」...「リセット」プロセスが再開されます。
「次回の再起動まで」が長すぎる場合は、10000秒(分単位)より大きい値、つまり166より大きい「十分」に設定してください! - 各サイクルでパスワードを確認して入力できます。