Как я могу обновить уникальную строку в сценарии оболочки выводом отдельной функции?

Из-за моей лени я написал чрезвычайно "беспорядочную" серию скриптов для автоматического запуска моего 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, набрав одну команду (как я уже упоминал ранее, я ленив).

Любая помощь приветствуется, спасибо!

0
14.06.2017, 07:18
2 ответа

В скрипте expect/ tclвы можете использовать:

send "$env(PASSWORD)\r"

И вызовите свой скрипт expectс помощью with:

PASSWORD=$(elinks -dump...) /path/to/your/expect/script

Обратите внимание, что для краткости можно использовать cut -b18-24.

1
28.01.2020, 02:45

Решение Стефана очень элегантное, но если вы не хотите каждый раз загружать и анализировать пароль, вы можете сохранить свой двухэтапный процесс с помощью чего-то вроде этого:

Измените команду восстановления пароля на эту:

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Добавить последнюю часть функции ожидания отправки.

0
28.01.2020, 02:45

Теги

Похожие вопросы