sudoでsshを使用し、出力をローカルファイルにリダイレクトする方法は?

sudoでsshを使用し、出力をローカルファイルにリダイレクトする方法は?

私が(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 ...'かかわらず、標準入力でパスワードの入力を求められますが、パスワードプロンプトのターミナルエコーは無効にすることはできません。-tsudo

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

関連情報