我正在尝试自动化 Docker 容器的部署。需要手动填写三个提示才能继续部署。但是,它们不能依次填写。这些字段出现的顺序非常奇怪。首先,它要求输入密码和确认(两个字段相邻)。然后,OpenVPN 脚本执行其操作,然后需要 FQDN 来生成我认为的证书。
所以:我想知道我是否可以告诉expect
为字段 X 填写值 X,一旦输入字段 Y 出现,填写值 Y。换句话说,我可以告诉expect
自动识别输入提示并相应地填写它们吗?
答案1
当然,这就是expect的目的。这里的命令exp_continue
是关键:
expect {
"password: " {send "$password\r"; exp_continue}
"confirmation" {send "$confirm\r"; exp_continue}
"FQDN" {send "$fqdn\r"; exp_continue}
"some other pattern"
}
当然,您必须更改引用的模式,以便它们符合您的实际情况。
通过这种结构,模式可以按任何顺序进行匹配。这些图案甚至根本不必出现。
当看到“某种其他模式”时,由于没有与之关联的操作块,因此它会触发包含的期望命令的结束,并且脚本的其余部分可以继续。
为了让expect能够控制一个进程,您必须从expect内部启动该进程。尝试这个:
#!/bin/bash
port=$1
export hostname=$2
export OVPN_DATA="ovpn-data-$port"
docker volume create --name $OVPN_DATA
/usr/bin/expect <<'END_EXPECT'
set timeout -1
spawn docker run -v $env(OVPN_DATA):/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://$env(hostname)
expect {
"Enter PEM pass phrase:" {
# this should match whether it's the initial or confirmation prompt
send "secret\r"
exp_continue
}
"Common Name" {
send "$env(hostname)\r"
exp_continue
}
eof
}
END_EXPECT
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
docker run -dit --restart unless-stopped --name=$port -v $OVPN_DATA:/etc/openvpn -d -p $port:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn