Bash-Skripting – Wie leite ich die Ausgabe in OpenVPN an mehrere Eingaben um?

Bash-Skripting – Wie leite ich die Ausgabe in OpenVPN an mehrere Eingaben um?

Ich versuche also, ein Skript zu schreiben, um den Verbindungsaufbau zum OpenVPN-Server zu vereinfachen.

Wenn ich also schreibe:

openvpn --config vpnbook-pl226-udp53.ovpn

Ich werde aufgefordert, Benutzernamen und Passwort einzugeben:

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: 

Hier möchte ich, dass mein Skript Benutzernamen und Passwort automatisch an OpenVPN sendet.

Folgende Versuche habe ich unternommen:

Versuch 1:

{ echo "vpnbook"; echo "3vze4vd"; } | openvpn --config vpnbook-pl226-udp53.ovpn

Versuch 2:

echo -e "vpnbook\n3vze4vd" | openvpn --config vpnbook-pl226-udp53.ovpn

Versuch 3:

(echo $username; echo $password;) | openvpn --config vpnbook-pl226-udp53.ovpn

Aber keines davon funktioniert, ich erhalte die folgende Ausgabe:

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

Dann passiert nichts.

Kann mir bitte jemand einen Hinweis dazu geben?

Antwort1

Möglicherweise können Sie den Benutzernamen und das Passwort zu einer sicheren Datei hinzufügen (eine Datei, die nur der Besitzer lesen kann). Weitere auth-user-passInformationen finden Sie in Ihrer OpenVPN-Dokumentation ( man openvpn):

cat > /path/to/secret <<'X'
myusername
verysecret
X
chmod u=rw,go= /path/to/secret

Suchen Sie nun die auth-user-passDirektive in Ihrer OpenVPN-Konfigurationsdatei und erweitern Sie sie wie folgt

auth-user-pass /path/to/secret

Antwort2

Das sieht nach einem Job fürerwarten.

Für die Zwecke dieser Demonstration habe ich ein kurzes Skript geschrieben, um das Verhalten Ihres OpenVPN-Befehls zu imitieren:

#! /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"

Hier ist ein kurzes Expect-Skript, das auf diese Eingabeaufforderungen reagiert:

#! /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.

So sieht die Ausgabe aus:

[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

Edit: Die Lösung von roiama ist aus Sicherheitsgründen dieser hier überlegen. Ich lasse das stehen, falls es für jemanden hilfreich ist, der versucht, herauszufinden, wie interaktive Befehle automatisiert werden können.

verwandte Informationen