
最近、サーバーの指紋をユーザーの指紋に追加するという特殊なケースを解決しなければなりませんでしたknown_hosts
(認証はキーペアで実行されます)。最も簡単な解決策は、
yes yes | ssh *login@host*
驚いたことに (少なくとも私にとっては)、これは機能しません。ssh
指紋を追加するかどうかを尋ねられ、手動入力が必要になります。
私の疑問は、なぜそうなるのかということです。この行動の根底にあるメカニズムは何なのか?
答え1
このプロンプトではssh
、標準入力&標準出力ストリーム – プロンプトがリモート コマンドの入力/出力と混同されるのを避けるためです。( を実行しているときssh host cat something.tar | tar x
に、突然tar x
入力にゴミがあるというエラーが表示されることを想像してください。)
代わりに、常に「制御端末」を指すssh
特別なデバイスを開き、そこにプロンプトを書き込み、そこから回答を読み取ります。/dev/tty
特にあなたの問題に関しては、OpenSSH にはssh-keyscan
、一度に多数のサーバーの公開鍵を取得するためのツールが付属しています。
ssh-keyscan host1 host2 host3 >> ~/.ssh/known_hosts
known_hosts
(ここで を意図していたのか、実際に が必要だったのかはわかりませんauthorized_keys
。)
一般的なケースでは、このexpect
ユーティリティを使用して、通常は tty 経由で I/O を実行するプログラムを自動化できます。