予測を使用した入力数値の定義

予測を使用した入力数値の定義

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

おすすめ記事