在Bash中使用'expect'以及任何顺序的响应

问题描述 投票:1回答:2

我正在使用这个期望文件(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

可能吗?

linux bash input terminal expect
2个回答
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(或任何其他动作)所以如果登录时获得的提示包括$,它将突破循环。请参阅https://www.tcl.tk/man/expect5.31/expect.1.html上的完整文档


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
© www.soinside.com 2019 - 2024. All rights reserved.