使用expect定义输入数字

使用expect定义输入数字

我正在尝试自动化 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

相关内容