代码之家  ›  专栏  ›  技术社区  ›  Dan D.

在bash中使用“expect”,并按任意顺序响应

  •  1
  • Dan D.  · 技术社区  · 6 年前

    我使用这个expect文件(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
    

    有可能吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Colin Macleod    6 年前

    您可以使用单个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

        2
  •  0
  •   Dan D.    6 年前

    以任意顺序预期,无限超时:

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