有没有一种方法可以使用 OpenSSH( ssh
) 将预期的主机密钥指纹指定为命令行参数,以便仅当服务器发送的密钥指纹与作为命令行参数给出的密钥指纹匹配时才允许连接?
我试图在 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: