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
Run Code Online (Sandbox Code Playgroud)
使用 OpenSSHssh
命令可以实现吗?
您可以known_hosts
在运行 ssh 之前设置预期的密钥,但我认为您需要整个密钥,而不仅仅是指纹。
但连接时,如果它不保存在打印的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
Run Code Online (Sandbox Code Playgroud)
因此,如果指纹正确,连接应该会成功:
$ ./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:
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
498 次 |
最近记录: |