如何在自动化期间无法在Expect Shell脚本中建立主机的真实性时忽略或传递"是"

ShA*_*yAn 16 shell automation host rsa expect

我想自动提供"是"或忽略它并以安全的方式继续,当执行我的Expect Shell脚本时出现以下语句?

#!/usr/bin/expect
spawn ssh $user@$host
Run Code Online (Sandbox Code Playgroud)

无法建立主机'abcdef(10.566.1.98)'的真实性.RSA密钥指纹是jk:94:ba:93:0b:eb​​:ff:df:ea:gh:hj:23:3c:hj:9c:be.您确定要继续连接(是/否)吗?

Gre*_*Cat 31

通过使用ssh client选项StrictHostKeyChecking设置为no(默认设置为ask,导致该问题),可以避免此问题并自动接受所有传入的键:

ssh -o StrictHostKeyChecking=no "$user@$host"
Run Code Online (Sandbox Code Playgroud)

但请注意,它几乎没有任何安全性,因为您基本上接受与可能充当给定主机的每个人的联系.避免问题的唯一安全方法是将主机公钥预先分发给客户端,即以预先生成的已知主机文件的形式,可以以某种方式使用:

ssh \
    -o UserKnownHostsFile=PATH_TO_YOUR_KNOWN_HOSTS_FILE \
    -o StrictHostKeyChecking=yes "$user@$host"
Run Code Online (Sandbox Code Playgroud)

这样,如果检查失败,您将避免问题,并且ssh将导致非零退出状态.


Ben*_*per 8

这行得通,而且对 docker 构建特别方便

ssh-keyscan hostname.example.com >> $HOME/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)


Din*_*esh 6

用于exp_continue此场景。

#!/usr/bin/expect 
set prompt "#|>|\\\$"
spawn ssh dinesh@myhost
expect {
        #If 'expect' sees '(yes/no )', then it will send 'yes'
        #and continue the 'expect' loop
        "(yes/no)" { send "yes\r";exp_continue}
        #If 'password' seen first, then proceed as such.
        "password"
}
send "root\r"
expect -re $prompt
Run Code Online (Sandbox Code Playgroud)

参考:期待