Как-то выкладывал конфигурационные файлы для PPTP-VPN от бесплатного VPN-сервиса http://vpnbook.com.
Правда у сервиса есть небольшой недостаток, как и у многих других бесплатных VPN, периодически меняется пароль. Благо, что пароль появляется у них на странице в текстовом виде, без всяких каптч, картинок и яваскрипта, и вполне просто автоматизировать его обновление, чтобы вручную не менять его в конфигурационных файлах после изменения на сайте.
Определение основных переменных
VPNBOOKPAGE="http://www.vpnbook.com/#pptpvpn"
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-серверами vpnbook
PEERSFILES[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
Замена пароля в файле конфигурации соединения VPN
Этим в скрипте занимается отдельная функция 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