我正在使用这个期望文件(keygen.exp)来生成SSH密钥,我正在使用ssh-keygen作为测试'expect'的示例:
#!/usr/bin/expect
spawn ssh-keygen
expect "Enter file"
send "./id_rsa\r"
expect "Enter passphrase"
send "\r"
expect "Enter same passphrase"
send "\r"
interact
然而,如果每次运行的输入提示顺序不一样,并且在不同的运行中可能会有不同的问题,那么它的工作原理会很好吗?
我想要这样的东西:
#!/usr/bin/expect
spawn ssh-keygen
expect if-is "Enter file"
send "./id_rsa\r"
expect if-is "Enter passphrase"
send "\r"
expect if-is "Enter same passphrase"
send "\r"
interact
可能吗?
您可以使用单个expect语句循环,以不同方式处理不同的输出,例如:
expect {
"Enter file" {
send "./id_rsa\r"
exp_continue
}
"Enter passphrase" {
send "\r"
exp_continue
}
"Enter same passphrase" {
send "\r"
exp_continue
}
$
}
但请注意,你需要一些方法来摆脱循环。这里的最后一个模式 - $
没有exp_continue
(或任何其他动作)所以如果登录时获得的提示包括$
,它将突破循环。请参阅https://www.tcl.tk/man/expect5.31/expect.1.html上的完整文档
期待任何顺序,无限超时:
#!/usr/bin/expect
spawn /path/to/some-programme
expect {
"some string" {
set timeout -1
send "some input\r"
exp_continue
}
"some other string" {
set timeout -1
send "some other input\r"
exp_continue
}
...
}
#no 'interact'
#end of file