编写 Expect 脚本的正确方法是什么?

What is the proper way to script Expect?

我对 Expect 还很陌生,正在寻找关于这方面的一些建议:

我正在尝试通过 ssh 连接到服务器并执行一些命令。

如果是我第一次登录的服务器,会提示是否信任。我select“是”;这就是为什么我有第一个 expect。第二个 expect 是密码。

  1. 当我执行以下操作时,它接受第一个提示或第二个提示,所以这对我不起作用。

     expect {
        "yes/no" {
           send "yes\n"
        }
        "assword: " {
           send "$mypass\n"
        }
     }
    
  2. 当我执行以下操作时,它起作用了,但是在输入密码之前要等待很长时间。我怀疑它等待“yes/no”提示一段时间,没有收到它然后继续

     expect "yes/no" {
           send "yes\n"
        }
    
     expect "assword: " {
           send "$mypass\n"
        }
    

正确的设置方法是什么?

当您将其拆分为两个单独的命令时,您会强制脚本首先查找“yes/no”提示符。它会等待 $timeout 秒(默认 10 秒)。只有这样它才会查找密码提示。

您的第一个想法是正确的方法,但您缺少一个关键命令:

expect {
   "yes/no" {
      send "yes\r"
      exp_continue    ;# <== this
   }
   "assword: " {
      send "$mypass\r"
   }
}

exp_continue 命令本质上强制执行流程保留在该 Expect 命令中,因此您仍然可以匹配密码提示。

一个小点:习惯上,使用\r(回车return)作为“点击Enter”的字符。

如需进一步学习,请查看 标签以获取更多信息以及指向其他问题和答案的链接。