![Bash スクリプト - OpenVPN で出力を複数の入力に送るにはどうすればよいでしょうか?](https://rvso.com/image/170270/Bash%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%20-%20OpenVPN%20%E3%81%A7%E5%87%BA%E5%8A%9B%E3%82%92%E8%A4%87%E6%95%B0%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%AB%E9%80%81%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
そこで、OpenVPN サーバーへの接続プロセスを容易にするスクリプトを作成しようとしています。
だから私が書くとき:
openvpn --config vpnbook-pl226-udp53.ovpn
ユーザー名とパスワードの入力を求められます:
Wed Apr 1 21:23:28 2020 OpenVPN 2.4.7 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4]
[EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Feb 20 2019
Wed Apr 1 21:23:28 2020 library versions: OpenSSL 1.1.1d 10 Sep 2019, LZO 2.10
Enter Auth Username:
Enter Auth Password:
ここで、スクリプトでユーザー名とパスワードを OpenVPN に自動的に送信します。
私は次のような試みをしました:
試行1:
{ echo "vpnbook"; echo "3vze4vd"; } | openvpn --config vpnbook-pl226-udp53.ovpn
試行2:
echo -e "vpnbook\n3vze4vd" | openvpn --config vpnbook-pl226-udp53.ovpn
試行3:
(echo $username; echo $password;) | openvpn --config vpnbook-pl226-udp53.ovpn
しかし、どれも機能せず、次の出力が表示されます。
Wed Apr 1 21:38:14 2020 OpenVPN 2.4.7 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Feb 20 2019
Wed Apr 1 21:38:14 2020 library versions: OpenSSL 1.1.1d 10 Sep 2019, LZO 2.10
すると何も起こりません。
誰かこれについてヒントをくれませんか?
答え1
ユーザー名とパスワードを安全なファイル(所有者だけが読めるファイル)に追加できる場合があります。auth-user-pass
詳細については、OpenVPN ドキュメントでパスワードを調べてください(man openvpn
)。
cat > /path/to/secret <<'X'
myusername
verysecret
X
chmod u=rw,go= /path/to/secret
auth-user-pass
OpenVPN設定ファイル内のディレクティブを見つけて、次のように拡張します。
auth-user-pass /path/to/secret
答え2
これは、期待する。
このデモンストレーションのために、openvpn コマンドの動作を模倣する短いスクリプトを作成しました。
#! /usr/bin/env bash
echo "Wed Apr 1 21:23:28 2020 OpenVPN 2.4.7 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4]"
echo "[EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Feb 20 2019"
echo "Wed Apr 1 21:23:28 2020 library versions: OpenSSL 1.1.1d 10 Sep 2019, LZO 2.10"
read -r -p 'Enter Auth Username: ' USERNAME
read -rs -p 'Enter Auth Password: ' PASSWORD
echo
echo "username was $USERNAME"
echo "password was $PASSWORD"
これらのプロンプトに応答する短い expect スクリプトを次に示します。
#! /usr/bin/env expect
spawn ./fakevpn --config vpnbook-pl226-udp53.ovpn
expect "Enter Auth Username: " { send Hello\r } # \r is the "return" character.
expect "Enter Auth Password: " { send World\r } # It simulates hitting the Enter key.
expect eof # This ensures expect won't exit until there's no more output.
出力は次のようになります。
[gnubeard@mothership: ~/vpn]$ ./vpn_expect
spawn ./fakevpn --config vpnbook-pl226-udp53.ovpn
Wed Apr 1 21:23:28 2020 OpenVPN 2.4.7 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4]
[EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Feb 20 2019
Wed Apr 1 21:23:28 2020 library versions: OpenSSL 1.1.1d 10 Sep 2019, LZO 2.10
Enter Auth Username: Hello
Enter Auth Password:
username was Hello
password was World
編集: セキュリティ上の理由から、roiama のソリューションの方がこのソリューションよりも優れています。対話型コマンドを自動化する方法を考えている人にとって役立つかもしれないので、これを残しておきます。