私が(bashで)したいことは次のとおりです。
for i in <host1> <host2> ... <hostN>; do ssh leroy@$i "sudo -i; grep Jan\ 15 /var/log/auth.log" > $i;done
そのホストのauth.logから今日のエントリを取得し、私のローカルファイルシステムに集約します。 auth.logはrootアクセスのみを許可するため、sudoが必要です。アカウントが無効になっているため、root ユーザーを使用できません。システムは2FA(キーとパスワード)を実装しているため、キーベースの認証を使用することはオプションではありません。
上記の操作を実行すると(初期認証後)、次の結果が表示されます。
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
-Sオプションと-Mオプションを含むさまざまな引数を試しましたが、何も機能しません。オンライン検索では、このステータスに関する内容は見つかりませんでした。
答え1
さらなる研究では、いくつかの重要な注意事項があるsudo -Sオプションが明らかになりました。私が使用するものは次のとおりです。
for host in ...; do
read -p "Password for $host sudo:" pswd;
ssh leroy@$host "echo $pswd | sudo -S grep ^Jan\ 15 /var/log/{auth.log,auth.log.1,syslog,syslog.1}" > $host;
done
指示:
プロンプトは混乱する可能性があるため、非常に明確な「読み取り」プロンプトが必要な理由です。リモートシステムのパスワードプロンプトに対する応答が必要です。パスワードを求めるsudoプロンプトがローカルシステムに表示されますが、応答はエコーとして表示されます。 sudoに渡されたコマンドがしばらく実行されると(syslogを追加しましたが、場合によってはgrepが数秒間処理される)、sudoが応答を待つように見えますが、実際にはコマンドが処理されています。
第二に、ローカルシステムにパスワードが浮かぶのにあまり良くないのですが、私のような場合は家にとってあまり問題はありません。
第三に、最終パスワードは環境に残るので、unset pswd
後で追加する必要があります。
提案された改善点または代替案を高く評価します。
答え2
この機能があるかどうかにssh ... 'sudo -S ...'
かかわらず、標準入力でパスワードの入力を求められますが、パスワードプロンプトのターミナルエコーは無効にすることはできません。-t
sudo
ssh
実行コマンドを発行すると、デフォルトではリモートデバイスに端末が設定されません。sudo
苦情が入る場所はここです。オプションを使用してこれを行うことができます-t
... しかし、コメントで述べたように、これは出力リダイレクトを中断し、パスワードプロンプトが出力ファイルに移動します。後でプロンプトを削除できますが、プロンプトを表示せずにパスワードを入力する方法を知る必要があり、パスワードを入力するまで問題が発生したかどうかはわかりません。
したがって、回避策は、sudo -S
セッション中にローカルでエコーを無効にすることです。パスワード以外に他の入力が必要ない場合は大丈夫です。
またはsudo -i; grep ...
動作しません。対話型 sudo'ed シェルを実行してから実行します。grep
後ろにシェルが終了します。だから私は代わりに走ったsudo grep
。
おそらく次のようになります。
for host in ...; do
stty -echo
ssh leroy@"$host" 'sudo -S grep "Jan 15" /var/log/auth.log' > "$host"
stty echo
done