特定のshell実行時のみVPN接続を行いたいパターンが出てきましたので作成しました。
※何らかの理由でopenvpnに接続しっぱなしになることも想定しておいてください。
FILE_OVPN=/tmp/test.ovpn
FILE_LOG=$(mktemp)
# VPN接続後に実行したいコマンド
CMD_JOB="sh /tmp/test.sh"
# openvpnのオプションは適当に設定してください
CMD_VPN="sudo openvpn --config ${FILE_OVPN}"
# 初期化完了時のキーワード
KEYWORDS=" Initialization Sequence Completed"
# openvpnをバックグランドで処理し、PIDを「WORK_PID」に受け取ります
WORK_PID=$((nohup ${CMD_VPN} > ${FILE_LOG} 2>&1) & echo "$!")
# 初期化が完了するまで待機します。
# grepに「-m1」を付けていますので、「KEYWORDS」に引っかかると処理を抜けます
- tail -n0 -f ${FILE_LOG} | grep -q -m1 "${KEYWORDS}"
+ # 下記の待機方法では『SIGPIPE』を受け取らずに?動作しないことがあるようです
+ # github actions の ubuntu ではマッチしても終了が出来ませんでした。
+ #tail -n0 -f ${FILE_LOG} | grep -q -m1 "${KEYWORDS}"
+ # 待機方法を変更しました
+ # こちらのパターンの場合、github actions でも動作します
+ timeout 20s grep -q -m1 --line-buffered "${KEYWORDS}" <(tail -n0 -f ${FILE_LOG})
# スクリプト実行
eval ${CMD_JOB}
# 1. openvpnのプロセスを終了
# 2. ゴミのログファイルを削除
kill ${WORK_PID} \
&& rm -f ${FILE_LOG}
AWS VPN Clientは「openvpn」の実行ファイル?を実行しているだけのようです。
※AWS VPN Clientをインストールするとインストール先のディレクトリに「openvpn」の実行ファイルが入っています。
※接続に使用するovpnファイルはopenvpnと同じです。
最終的には
上記の処理をvpn.sh
に記載をしたとします。
CMD_JOB
の部分のみ下記のように修正します。
vpn.sh
# CMD_JOB="sh /tmp/test.sh"
CMD_JOB=$1
# 上記のように実行したいコマンドを引数で受け取るようにします
下記のように実行が出来るようになります。
※ 引数の部分を変更するだけでいろいろなコマンドを実行できるようになります。
# /tmp/test.sh を実行
sh vpn.sh "sh /tmp/test.sh"
# /tmp/test2.sh を実行
sh vpn.sh "sh /tmp/test2.sh"