ssh
OpenSSH()を使用して期待されるホストキーフィンガープリントをコマンドライン引数として指定し、サーバーから送信されたキーフィンガープリントがコマンドライン引数として提供されたキーフィンガープリントと一致する場合にのみ接続を許可する方法はありますか?
WindowsおよびPosixlyバージョンのアプリケーションで同様のレベルの機能を提供しようとしています。 Windowsで広く使用されているSSHクライアントplink
(Linuxでも利用可能)には、--hostkey
この目的のためのコマンドラインオプションがあります。
$ plink -hostkey "d0:e4:ad:11:7d:6a:8c:c0:36:2b:ff:ee:16:cf:f7:46" user@host
OpenSSHコマンドを使用できますかssh
?
答え1
sshを実行する前に予想されるキーを設定できますが、known_hosts
指紋だけでなくキー全体が必要だと思います。
ただし、SSHにキーフィンガープリントが保存されていない場合、接続時にキーフィンガープリントが印刷されるため、known_hosts
それを使用してexpect
削除できます。
ここのスクリプトは、ホスト名(またはuser@host
)と予想される指紋を引数として使用してそれを空白のままにし、known_hosts
印刷された指紋を指定された指紋と比較します。
#!/usr/bin/expect -f
set host [lindex $argv 0];
set fp [lindex $argv 1];
spawn ssh -oUserKnownHostsFile=/dev/null $host
expect -indices -re "key fingerprint is (\[^.\]+)"
set fp_got $expect_out(1,string)
expect "Are you sure you want to continue connecting (yes/no)"
if { $fp_got == $fp } {
send "yes\r"
} else {
send "no\r"
}
interact
したがって、指紋が正しい場合は接続が成功する必要があります。
$ ./ssh.expect localhost 60:6e:...:e1
spawn ssh -oUserKnownHostsFile=/dev/null localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is 60:6e:...:e1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
itvirta@localhost's password: