如何在 Expect 中生成 BASH 命令?

如何在 Expect 中生成 BASH 命令?

我有一个 Expect 脚本,并且想要生成一个 BASH 命令以供其提供输入。当我使用以下语法时:

spawn /bin/bash docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki`

或者:

spawn docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

我收到以下错误:

bad flag "-it": must be -glob, -regexp, -exact, -notransfer, -nocase, -i, -
indices, -iread, -timestamp, -timeout, -nobrace, or --
    while executing
"expect {
   spawn (/bin/bash) docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn 
ovpn_initpki
   "Enter PEM pass phrase:"   {send "DefPEMVPNPassPhra..."
    (file "addcontainer.exp" line 7)

我如何知道expect 会产生BASH 命令?

答案1

expect在 TCL(是 TCL 解释器)中访问环境变量的语法是$env(VARNAME)

spawn docker run -v $env(OVPN_DATA):/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

如果你想运行一个 shell 来解释一些 shell 代码,你可以运行sh -c the-code(或者尽管这里的 shell 代码bash -c没有任何特定的内容)。bash这就是system()大多数语言的功能。

spawn sh -c {
  docker run -v "$OVPN_DATA:/etc/openvpn" --rm -it kylemanna/openvpn ovpn_initpki
}

{...}是TCL的强势报价。我还在 shell 变量扩展周围添加了缺少的引号,否则它会比语法更多zsh//rc语法。fishsh

另外,你会spawn在任何expect ...声明之前。命令spawn是启动您想要交互的命令,语句expect ...是等待该命令的特定输出。

在上面的代码中,您spawn根本没有运行, 参数spawn内部的expect参数被视为在早期生成的命令的输出中查找的模式(如果有),或者从标准输入(如果没有)中查找。

答案2

输出表明,spawn当遇到命令名称时,不会停止解释标志。

一个常见的约定是用作--命令选项(它应该解析和解释)和它需要调用的参数(它应该忽略并传递)之间的分隔符。

输出spawn列出了--可能的选项之一,这表明它遵循该约定。尝试指定一下吗?

spawn /bin/bash -- -c "docker run ..."

答案3

尝试:

spawn /bin/bash
send "docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn  ovpn_initpki"

相关内容