![Bash-скриптинг — как направить вывод на несколько входов в OpenVPN?](https://rvso.com/image/170270/Bash-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3%20%E2%80%94%20%D0%BA%D0%B0%D0%BA%20%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%20%D0%BD%D0%B0%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%B2%D1%85%D0%BE%D0%B4%D0%BE%D0%B2%20%D0%B2%20OpenVPN%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"
Вот короткий сценарий ожидания, который отвечает на эти запросы:
#! /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 превосходит это по соображениям безопасности. Я оставлю это на случай, если это будет полезно для тех, кто пытается понять, как автоматизировать интерактивные команды.