我有一个 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
语法。fish
sh
另外,你会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"