Скрипт для автоматического обновления паролей бесплатного VPN vpnbook.com
Как-то выкладывал конфигурационные файлы для PPTP-VPN от бесплатного VPN-сервиса http://vpnbook.com.
Правда у сервиса есть небольшой недостаток, как и у многих других бесплатных VPN, периодически меняется пароль. Благо, что пароль появляется у них на странице в текстовом виде, без всяких каптч, картинок и яваскрипта, и вполне просто автоматизировать его обновление, чтобы вручную не менять его в конфигурационных файлах после изменения на сайте.
VPNBOOKPAGE="http://www.vpnbook.com/#pp tpvpn"
WORKDIR="/tmp/"
HTMLFILE="vpnhtml.txt"
PASSANCOR="Password:"
VPNBOOKPASS=""
FILEPASS=""
PEERSDIR="/etc/ppp/peers/"
PEERSFILES[0]="vpnbook-e214"
PEERSFILES[1]="vpnbook-e217"
PEERSFILES[2]="vpnbook-de233"
PEERSFILES[3]="vpnbook-us1"
PEERSFILES[4]="vpnbook-us2"
PEERSFILES[5]="vpnbook-ca1"
VPNBOOKPAGE
- адрес, по которому доступен текущий пароль.WORKDIR
- рабочий каталог, куда будем сохранять полученную с сайта HTML-страницу с паролемHTMLFILE
- имя сохраняемого файлаPASSANCOR
- Ключевое слово, по которому будем определять, где именно на странице пароль:VPNBOOKPASS
- тут будем хранить пароль, полученный с сайтаFILEPASS
- тут будет пароль, сохраненный в данный момент в конфигурационном файлеPEERSDIR
- директория, в которой хранятся конфигурационные файлы для соединения с VPN-серверами vpnbookPEERSFILES[0]...PEERSFILES[5]
- массив с именами конфигурационных файловI. Сначала, с помощью
wget
, получим HTML-страницу, содержащую пароль.echo "GET VPNBOOK PASSWORD v 0.2" #приветствие
rm $WORKDIR$HTMLFILE #удаляем текущий файл
echo "Get vpnbook page..."
wget -P $WORKDIR --default-page=$HTMLFILE --header="Content-type: text/plain" $VPNBOOKPAGE #сохраняем HTML-страницу
ВНИМАНИЕ! Существующий файл с сохраненной HTML-страницей надо обязательно удалить, иначе
wget
при сохранении страницы добавит к имени дополнительно .1
(.2 .3
и т.д.).Параметры утилиты
wget
:-P $WORKDIR
- установка рабочего каталога, указанного в переменной $WORKDIR
--default-page=$HTMLFILE
- установка имени файла, под которым в рабочем каталоге будет сохранена полученная с сайта HTML-страница. Имя указывается в переменной $HTMLFILE
--header="Content-type: text/plain"
- передаем серверу заголовок, в котором указываем, в каком виде хотим получить страницу (text/plain
). Лучше не упускать этот момент, одно время сервер почему-то отдавал без этого заголовка сжатую HTML-страницу, и анализировать ее потом было некузяво.II. Проверяем, сохранилась ли страница:
if [ ! -f $WORKDIR$HTMLFILE ]; then
echo "ERROR: Page not saved"
exit 1
fi
III. Вытаскиваем пароль из сохраненного HTML-файла:
VPNBOOKPASS=`cat $WORKDIR$HTMLFILE|grep "$PASSANCOR"|head -n1|sed -e :a -e 's/<[^>]*>//g;/</N;//ba'|sed 's/.$//'|awk ' {print $2} '`
1. Выводим содержимое файла на stdout командой
cat $WORKDIR$HTMLFILE
2. Передаем вывод команде
grep
, она фильтрует строчку с содержимым, указанным в переменной $PASSANCOR
, т.е. строчку, содержащую слово "Password:"
и сам пароль. На самом деле команда grep
отфильтрует две строки, еще и с виндовыми концами строк:3. Обрабатываем строчку дальше с помощью команды
head -n1
Она получит из вывода команды grep
только первую строчку (-n1
)4. Команда
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
с вот этим диким регулярным выражением, удалит HTML-теги. Регулярка не моя, я нашел на просторах интернетов.5. Следующая команда
sed 's/.$//'
избавит строку от лишнего виндового символа конца строки.6. Наконец, утилитой
awk
, которая обрабатывает строки, воспринимая содержимое, как набор полей разделенных разделителем (по умолчанию пробел), вытаскиваем из строки непосредственно сам пароль. awk ' {print $2} '
wra2ezEz
Записываем результат в переменную
VPNBOOKPASS
, обернув всю команду в обратные кавычки (``
)Далее устанавливается размер массива, хранящего имена файлов настройки (специально так сделал, чтобы если добавится еще один файл конфигурации, количество обрабатываемых файлов обновлялось автоматически):
CTR="${#PEERSFILES[*]}"
Далее инициализируется счетчик цикла
I="0"
В цикле из массива извлекаются имена файлов, к ним добавляется путь к директории их содержащей, и эти данные передаются функции
passwork
, которая получает пароль, сохраненный в файле конфигурации, и в случае необходимости его меняет на пароль, полученный с сайта.until [ "$CTR" -eq "$I" ]; do
passwork $PEERSDIR${PEERSFILES[I]}
let "I+=1"
done
Этим в скрипте занимается отдельная функция
passwork()
, которой в качестве параметра передается полный путь к файлу конфигурации соединения. Вот ее код:passwork()
{
echo -n "Checking $1..."
if [ -e $1 ]; then #file exist
COUNT=`cat $1|grep "password" -c`
if [ $COUNT -eq 1 ]; then # strochek s parolem 1
#vitaskivaem password i udalyaem kavichki
FILEPASS=`cat $1|grep "password"|awk ' {print $2} '|sed 's/\"//g'`
echo -n "password "$FILEPASS
if [ "$FILEPASS" = "$VPNBOOKPASS" ]; then #proverka parolya
echo " not replaced."
else
#backup file
cp $1 $1".bak"
echo "...file backuped..."
sed -i 's/'$FILEPASS'/'$VPNBOOKPASS'/g' $1 #replace password
echo "...replaced!"
fi
else #>1 ili 0
echo " Peer file format error"
fi
else
echo " $1 not found"
fi
}
В зарезервированной переменной
$1
находится параметр, переданный функции из основной программы, в данном случае путь к файлу конфигурации соединения.Сначала проверяется, существует ли файл:
...
if [ -e $1 ]; then #file exist
...
Если он существует, продолжаем работу, если нет - выводим сообщение об ошибке и выходим из функции:
...
else
echo " $1 not found"
fi
...
Сам конфигурационный файл выглядит так:
debug
#nodetach
unit 1
remotename ca1.vpnbook.com
ipparam vpnbook-ca1
pty "pptp ca1.vpnbook.com --nolaunchpppd"
name vpnbook
user vpnbook
password "wra2ezEz"
require-mppe-128
refuse-eap
noauth
file /etc/ppp/options.pptp
Далее получаем количество строк, содержащих конфигурационный параметр
password
. Подсчет нужных строк можно выполнить командой grep
с ключом -c
COUNT=`cat $1|grep "password" -c`
Строк с параметром
password
в конфигурационном файле должно быть строго 1, пароль заключается в кавычки.Проверяем количество искомых строк:
...
if [ $COUNT -eq 1 ]; then # strochek s parolem 1
...
Если строка найдена, и она одна, то продолжаем работу, иначе выдаем сообщение об ошибке и выходим из функции:
...
else #>1 ili 0
echo " Peer file format error"
fi
...
Извлекаем содержащийся в конфигурационном файле пароль в переменную
FILEPASS
:FILEPASS=`cat $1|grep "password"|awk ' {print $2} '|sed 's/\"//g'`
1. Читаем файл с помощью команды
cat
: cat $1
2. Отфильтровываем строку с паролем:
grep "password"
3. Извлекаем пароль (в кавычках) с помощью
awk
: awk ' {print $2} '
4. С помощью
sed
удаляем кавычки: sed 's/\"//g'`
Далее сравниваем содержимое переменной
FILEPASS
, т.е. пароль из обрабатываемого файла конфигурации, с паролем, полученным с сайта vpnbook. Он в переменной VPNBOOKPASS
....
if [ "$FILEPASS" = "$VPNBOOKPASS" ]; then #proverka parolya
...
Если пароли идентичны, то выдаем сообщение, что пароль не изменен. Иначе, делаем копию файла конфигурации (
cp $1 $1".bak"
) и заменяем пароль с помощью sed
непосредственно в обрабатываемом файле (ключ -i
и указание пути к файлу в качестве последнего параметра команды):sed -i 's/'$FILEPASS'/'$VPNBOOKPASS'/g' $1 #replace password
Попутно выводим сообщения о ходе процесса.
1. На PasteBin
2. Скачать с Mega.NZ
1. Команда
head
2. Однострочные скрипты
sed
3. Удаление кавычек с помощью
sed
4. Краткое описание
awk
[Скачать копии источников в формате PDF]
Заметка в формате PDF
Это репост заметки из моего блога на сайте http://tolik-punkoff.com
Оригинал заметки находится здесь: http://tolik-punkoff.com/2016/12/23/skri