代码之家  ›  专栏  ›  技术社区  ›  ShAn PrIyAn

在自动化过程中无法在Expect Shell脚本中建立主机的真实性时,如何忽略或传递“是”

  •  23
  • ShAn PrIyAn  · 技术社区  · 10 年前

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

    #!/usr/bin/expect
    spawn ssh $user@$host
    

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

    3 回复  |  直到 10 年前
        1
  •  40
  •   GreyCat    10 年前

    使用ssh客户端选项可以避免这个问题并自动接受所有传入的密钥 StrictHostKeyChecking 设置为 no (默认设置为 ask ,这导致了该问题):

    ssh -o StrictHostKeyChecking=no "$user@$host"
    

    然而,请注意,这几乎是不安全的,因为你基本上接受与每个可能充当给定主机的人建立联系。避免问题的唯一安全方法是将主机公钥预先分发给客户端,即以预先生成的已知主机文件的形式,该文件可以以如下方式使用:

    ssh \
        -o UserKnownHostsFile=PATH_TO_YOUR_KNOWN_HOSTS_FILE \
        -o StrictHostKeyChecking=yes "$user@$host"
    

    这样,如果检查失败,ssh将导致非零退出状态,您就可以避免这个问题。

        2
  •  12
  •   Ben Harper    6 年前

    这是可行的,而且对于docker构建特别方便

    ssh-keyscan hostname.example.com >> $HOME/.ssh/known_hosts
    
        3
  •  5
  •   Dinesh    10 年前

    利用 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
    

    参考: Expect