在Bash中将“期望”与任何顺序的响应一起使用

时间:2018-08-02 11:03:29

标签: linux bash input terminal expect

我使用此期望文件(keygen.exp)生成SSH密钥,我使用ssh-keygen作为示例来测试“期望”:

#!/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

有可能吗?

2 个答案:

答案 0 :(得分:3)

您可以有一个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(或任何其他操作),因此它将如果登录时提示您包含{{1 }}。 请参阅https://www.tcl.tk/man/expect5.31/expect.1.html

的完整文档

答案 1 :(得分:0)

以任何顺序进行预期,并具有无限的超时时间:

#!/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