Как игнорировать или передавать "Да", когда подлинность хоста не может быть установлена ​​в Expect Shell script во время автоматизации

Я хочу автоматически указать "Да" или "Игнорировать" и действовать безопасным способом, когда приведенный ниже оператор появляется во время выполнения моей оболочки Expect script?.

#!/usr/bin/expect
spawn ssh [email protected]$host

Невозможно установить подлинность хоста 'abcdef (10.566.1.98)'. Отпечаток ключа RSA: j: 94: ba: 93: 0b: eb: ff: df: ea: gh: hj: 23: 3c: hj: 9c: be. Вы действительно хотите продолжить подключение (да/нет)?

Ответы

Ответ 1

Используйте exp_continue для этого сценария.

#!/usr/bin/expect 
set prompt "#|>|\\\$"
spawn ssh [email protected]
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

Ответ 2

Можно избежать этого вопроса и принять все входящие ключи automaticatilly, используя опцию клиента ssh StrictHostKeyChecking, установленную в no (настройка по умолчанию ask, что приводит к такому вопросу):

ssh -o StrictHostKeyChecking=no "[email protected]$host"

Однако обратите внимание, что это вряд ли будет безопасным, поскольку вы в основном соглашаетесь со всеми, кто может выступать в роли данного хоста. Единственный безопасный способ избежать вопроса состоит в том, чтобы предварительно распространять общедоступные ключи хоста клиентам, то есть в форме предварительно созданного файла известных хостов, который может быть использован таким образом:

ssh \
    -o UserKnownHostsFile=PATH_TO_YOUR_KNOWN_HOSTS_FILE \
    -o StrictHostKeyChecking=yes "[email protected]$host"

Таким образом вы избежите вопроса, если проверка завершится неудачно, и ssh приведет к ненулевому состоянию выхода.

Ответ 3

Это работает, и это особенно удобно для сборок докеров

ssh-keyscan hostname.example.com >> $HOME/.ssh/known_hosts