编写 Expect 脚本的正确方法是什么?
What is the proper way to script Expect?
我对 Expect 还很陌生,正在寻找关于这方面的一些建议:
我正在尝试通过 ssh 连接到服务器并执行一些命令。
如果是我第一次登录的服务器,会提示是否信任。我select“是”;这就是为什么我有第一个 expect
。第二个 expect
是密码。
当我执行以下操作时,它接受第一个提示或第二个提示,所以这对我不起作用。
expect {
"yes/no" {
send "yes\n"
}
"assword: " {
send "$mypass\n"
}
}
当我执行以下操作时,它起作用了,但是在输入密码之前要等待很长时间。我怀疑它等待“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”的字符。
如需进一步学习,请查看 expect 标签以获取更多信息以及指向其他问题和答案的链接。
我对 Expect 还很陌生,正在寻找关于这方面的一些建议:
我正在尝试通过 ssh 连接到服务器并执行一些命令。
如果是我第一次登录的服务器,会提示是否信任。我select“是”;这就是为什么我有第一个 expect
。第二个 expect
是密码。
当我执行以下操作时,它接受第一个提示或第二个提示,所以这对我不起作用。
expect { "yes/no" { send "yes\n" } "assword: " { send "$mypass\n" } }
当我执行以下操作时,它起作用了,但是在输入密码之前要等待很长时间。我怀疑它等待“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”的字符。
如需进一步学习,请查看 expect 标签以获取更多信息以及指向其他问题和答案的链接。