Из-за моей лени я написал чрезвычайно "беспорядочную" серию скриптов для автоматического запуска моего openvpn. Я использую файл конфигурации vpnbook.com/freevpn.
Чтобы получить пароль, я использую:
lynx --dump --nolist vpnbook.com/freevpn | grep -i password | sort -u | cut -b 18,19,20,21,22,23,24
Пароль возвращается с веб-сайта.
Затем я использую сценарий ожидания для автоматического входа в систему (имя пользователя всегда vpnbook, но пароль меняется в зависимости от недели):
#!/usr/bin/expect -f
spawn openvpn /vpn/vpnbook-ca1-tcp80.ovpn ### my vpn configuration file ###
expect "*?sername:*"
send -- "vpnbook\r"
expect "*?assword:*"
### This next line sends the password that changes by the week, which I...
###...unfortunately need to update manually (for lack of a better method):
send -- "weekly-password\r"
Проблемы, с которыми я сталкиваюсь при попытке автоматически обновить пароль:
1) Я не могу вызвать lynx напрямую из ожидаемой среды.
2) Поскольку пароль меняется, я не знаю, как заменить уникальная фраза-пароль с предыдущей недели с обновленной версией в:
send -- "unique-previous-password\r"
3) Я не уверен, как использовать строковый вывод из функции lynx в качестве входной переменной для редактирования пароля с предыдущей недели (находится в моем ожидании сценарий).
Совершенно очевидно, что я не «самый умный» программист (и не самый эффективный). Однако, в конце концов, моя единственная цель - полностью инициализировать мой vpn, набрав одну команду (как я уже упоминал ранее, я ленив).
Любая помощь приветствуется, спасибо!
В скрипте expect
/ tcl
вы можете использовать:
send "$env(PASSWORD)\r"
И вызовите свой скрипт expect
с помощью with:
PASSWORD=$(elinks -dump...) /path/to/your/expect/script
Обратите внимание, что для краткости можно использовать cut -b18-24
.
Решение Стефана очень элегантное, но если вы не хотите каждый раз загружать и анализировать пароль, вы можете сохранить свой двухэтапный процесс с помощью чего-то вроде этого:
Измените команду восстановления пароля на эту:
sed -e '$ d' -i.bak f && echo -n "send -- \"" >> f && lynx --dump --nolist vpnbook.com/freevpn | grep -i password | sort -u | cut -b 18-24 >> f && echo "\\r\"" >> f
Для краткости я назвал файл ожидаемого скрипта f
. На самом деле это должен быть полный /path/to/your/expect/script
, если только вы уже не находитесь в том же каталоге, что и скрипт.
Затем вызовите ожидаемый скрипт, как обычно.
В разобранном виде расширенная команда работает следующим образом:
sed -e '$ d' -i.bak f
Найдите последнюю строку($
)в f
и удалите ее(d
). Будьте осторожны с переключателями -e
и -i
-, они разные/не поддерживаются на некоторых платформах. -e
явно указывает команду, когда используется переключатель -i
, а -i
означает изменение файла в месте -, сохраняя резервную копию с расширением .bak
.
&&
выполнить следующую команду, если предыдущая выполнена успешно.
echo -n "send -- \"" >> f
Добавить в файл(>> f
)без новой строки(-n
)первую часть функции ожидания отправки.
lynx...
Ваша исходная команда, за исключением того, что результат добавляется в файл(>> f
).
echo "\\r\"" >> f
Добавить последнюю часть функции ожидания отправки.