Dockerコンテナの展開を自動化しようとしています。展開を続行するには、3つのプロンプトを手動で入力する必要があります。ただし、順次埋めることはできません。これらのフィールドが表示される順序は非常に奇妙です。まず、パスワードと確認を要求します(2つのフィールドが隣接しています)。その後、OpenVPNスクリプトはそのタスクを実行し、FQDNが証明書を生成するように要求します。
expect
だから:フィールドXに値Xを入力し、入力フィールドYが表示されたら値Yを入力するように指示できるかどうか疑問に思います。つまり、expect
入力プロンプトの自動認識を伝え、それに合わせて入力できますか?
ベストアンサー1
もちろんそれが期待される理由です。ここではコマンドが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