![Bash 腳本 - 如何將輸出導向到 OpenVPN 中的多個輸入?](https://rvso.com/image/170270/Bash%20%E8%85%B3%E6%9C%AC%20-%20%E5%A6%82%E4%BD%95%E5%B0%87%E8%BC%B8%E5%87%BA%E5%B0%8E%E5%90%91%E5%88%B0%20OpenVPN%20%E4%B8%AD%E7%9A%84%E5%A4%9A%E5%80%8B%E8%BC%B8%E5%85%A5%EF%BC%9F.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
現在在您的 OpenVPN 設定檔中找到該auth-user-pass
指令並像這樣擴展它
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"
這是一個響應這些提示的簡短的期望腳本:
#! /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 的解決方案優於此解決方案。我將保留這一點,以防它對試圖弄清楚如何自動化互動命令的人有幫助。