Certamente, é para isso que esperamos. O comando exp_continue
é a chave aqui:
expect {
"password: " {send "$password\r"; exp_continue}
"confirmation" {send "$confirm\r"; exp_continue}
"FQDN" {send "$fqdn\r"; exp_continue}
"some other pattern"
}
É claro que você terá que alterar os padrões citados para que correspondam ao seu caso real.
Com essa estrutura, os padrões podem corresponder em qualquer ordem. Os padrões nem sequer precisam aparecer.
Quando "algum outro padrão" é visto, já que não há nenhum bloco de ação associado a ele, ele aciona o final do comando expect abrangente e o restante do script pode continuar.
Para esperar poder controlar um processo, você deve iniciar esse processo de dentro do esperado. Tente isto:
#!/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