Definir número de entrada com expectativa

1

Estou tentando automatizar a implantação de um contêiner do Docker. Três prompts precisam ser preenchidos manualmente para continuar com a implantação. No entanto, eles não devem ser preenchidos um após o outro. A ordem em que esses campos aparecem é muito estranha. Primeiro, pede uma senha e uma confirmação (dois campos seguindo um ao outro). Então, o script OpenVPN faz a sua coisa e, em seguida, precisa de um FQDN para gerar um certificado, acredito.

Então: Eu estou querendo saber se eu posso dizer a expect para preencher o valor X para o campo X e quando o campo de entrada Y aparecer, preencha o valor Y. Em outras palavras, posso dizer expect para reconhecer automaticamente input prompts e preenchê-los em conformidade?

    
por William Edwards 07.02.2018 / 12:06

1 resposta

2

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
    
por 07.02.2018 / 14:36