指紋がわかっている場合は、SSHホストキーをプログラムで受け入れるにはどうすればよいですか?

指紋がわかっている場合は、SSHホストキーをプログラムで受け入れるにはどうすればよいですか?

オプションを使用したくありませんが、-o StrictHostKeyChecking=noサーバーの公開鍵をファイルに保存し、IPアドレスまたはポートが変更されても、すべての接続でそれを使用したいと思います。

このオプションを使用すると、-o UserKnownHostsFile=myfile異なるIPを介して同じシステムに接続すると、sshは引き続き認証を要求します。

ssh公開鍵を別の場所に保存し、現在の接続でその公開鍵を使用する方法を教えてください。使用例:

# there is no 'foo-public.key' file at this moment
ssh -o TheMagicalOption=foo-public.key [email protected] -p 1234

The authenticity of host 'xxxxxxxx' can't be established.
ECDSA key fingerprint is SHA256:LR5wDKrEmHD0QhRcAmxTxBnzWIRmNUfJyeawhKw+W38.
Are you sure you want to continue connecting (yes/no)? [YES]

# 'foo-public.key' is created at this point 
on-target $ exit 

# another port forward is made, so the same server is on port 5678
ssh -o TheMagicalOption=foo-public.key [email protected] -p 5678
# not asking the same verification question
on-target $     

答え1

あなたはそれを使用することができます

ssh -o StrictHostKeyChecking=ask \
    -o HashKnownHosts=no \
    -o CheckHostIP=no \
    -o UserKnownHostsFile=example_fp \
    -p 1234 [email protected]

鍵を入手してください。

  • HashKnownHosts=noホスト名がプレーンテキストで保存されていることを確認してください。
  • CheckHostIP=no名前でホストを識別するためにのみ使用されます。

結果はexample_fp次から始まる行になります。

[example.com]:1234 ecdsa-sha2-nistp521 AAAA...

最初の接続で標準ポート22を使用すると、次の内容が表示されます。

example.com ecdsa-sha2-nistp521 AAAA...

そのため、最初に接続するときにポート22を使用するか、後でファイルを編集してポート番号を削除してください。次回接続すると、この行はすべてのポート番号と一致します。

答え2

これを行うための魔法のオプションはありません。公開鍵を事前に(知っている場合)手動で保存するか、指紋が「正しい」場合は「はい」と書いているいくつかの予想されるスクリプトを使用できます。

答え3

1つの回避策は、追加の手順を使用してSSHフィンガープリントをインポートし、ファイルに保存する前にssh-keyscanホストフィールドをワイルドカードに置き換えることです。*たとえば、

$ ssh-keyscan -p 1234 example.com | $ ssh-keyscan -p 1234 example.com perl -pe's/.*?

その後、そのサーバーに接続する必要があるときはいつでも参照できますexample_fp(ポート/ DNS / IPに関係なく)。

$ssh -o UserKnownHostsFile=example_fp -p 4321[Eメール保護]

答え4

名前が示すように、サーバーに公開鍵ファイル(コピー)がある場合は、それを使用して一時的なKnown_hostsファイルを作成できます。例:

sshfoo() {
  # assumes first arg is always user@host, otherwise adjust
  echo ${1#*@} $(cat foo-pubkey) >temp_myhosts
  ssh -oUserKnownHostsFile=temp_myhosts "$@"
  # or if you don't have anything you need in .ssh/known_hosts,
  # just overwrite that and omit the -o 
  rm temp_myhosts # or just leave it and replace it next time
}
# can use ssh for the function name if you always want this change,
# or if in the cases you don't want it you remember to override 
# with command ssh or $(which ssh) or /bin/ssh or whatever 

実際に既存のKnown_hosts行(公開鍵ファイルの内容が続くホストフィールド)がある場合は、同様に変更できます。

awk -vh="${1#*@}" "{$1=h;print}" <hosts_line >temp_myhosts 

または、次の行を含むファイルがある場合は、一般的なKnown_hostsかもしれません。

awk -vh="${1#*@}" "$1~/oldname/{$1=h} 1" <.ssh/known_hosts >temp_myhosts 

ユル・ブライナーら。

関連情報