Você pode definir a chave esperada em known_hosts
antes de executar o ssh, mas eu acho que você precisaria da chave inteira, não apenas da impressão digital.
Mas o ssh imprime a impressão digital da chave ao conectar-se, se não for salvo em known_hosts
, para que possamos usar isso e expect
nossa maneira de sair disso.
O script aqui levaria o nome do host (ou user@host
) e a impressão digital esperada como argumentos, forçando um known_hosts
vazio e comparando a impressão digital com a dada.
#!/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
Assim, dada a impressão digital correta, a conexão deve ser bem-sucedida:
$ ./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: