У вас должен быть вызов вектора ::размера (), чтобы функция скомпилировалась. Он не компилируется, потому что это шаблон класса. Я думаю, что вызов должен быть также в том же контексте, но я не уверен в этом.
Вы можете установить ожидаемый ключ в known_hosts
перед запуском ssh, но я думаю, вам понадобится весь ключ, а не только отпечаток пальца.
Но ssh печатает отпечаток ключа при подключении, если он не сохранен в known_hosts
, поэтому мы можем использовать его и ожидать
выхода из него.
Здесь сценарий принимает имя хоста (или 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: