web-dev-qa-db-ja.com

自動化中にExpect Shellスクリプトでホストの信頼性を確立できない場合に「はい」を無視または渡す方法

Expect Shellスクリプトの実行中に次のステートメントが表示された場合、自動的に「Yes」を提供するか、無視して安全な方法で続行したいですか?.

#!/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です。接続を続行してもよろしいですか(はい/いいえ)?

18
ShAn PrIyAn

このシナリオでは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

参照: 期待

3
Dinesh

SshクライアントオプションStrictHostKeyCheckingnoに設定することで、この質問を回避し、すべての着信キーを自動的に受け入れることができます(デフォルトの設定はaskであり、そのため、この質問が発生します)。

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

ただし、基本的には特定のホストとして機能する可能性のあるすべてのユーザーとの接続を受け入れるので、ほとんど安全ではないことに注意してください。質問を回避する唯一の安全な方法は、ホストの公開鍵をクライアントに事前に配布することです。つまり、事前に生成された既知のホストファイルの形式で、次のような方法で使用できます。

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

これにより、チェックが失敗した場合の質問を回避でき、sshはゼロ以外の終了ステータスになります。

33
GreyCat

これは機能し、Dockerビルドに特に便利です

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