tag:blogger.com,1999:blog-58598903375605585362024-03-04T20:18:11.542-08:00*nix и программирование.nitxhttp://www.blogger.com/profile/15082011419035009816noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-5859890337560558536.post-9111269272484577702011-02-26T03:24:00.000-08:002011-02-26T09:58:54.743-08:00Сокеты. Пример создания простого сетевого приложения (клиента и сервера) с использованием TCP.<div dir="ltr" style="text-align: left;" trbidi="on">Почти все приложения которые взаимодействуют с сетью используют библиотеку, поддерживаемую операционной системой, - <b>сокеты</b> (<b>sockets</b>). Ее реализации бывают разными, но в целом принцип работы везде одинаков.<br />
<div>Далее в качестве примера рассмотрим сервер получения времени и клиент к нему. Скорее всего, вам уже известно, что такое клиент и сервер, но вкратце объясню. Грубо говоря, клиент - сетевое приложение которое обращается к серверу с каким то запросом. А сервер - сетевое приложение, которое обрабатывает запросы от клиентов. Зачастую, сервер - приложение которое запущено как демон, то есть после загрузки в память операционной системы, не завершается, а ждет какого-то события и потом его обрабатывает. Так же следует знать, что обычно один клиент обращается всего лишь к одному серверу, но сервер, может одновременно обрабатывать запросы нескольких клиентов, хотя в этой схеме бывают и исключения (<i>например, adc-клиент</i>).</div><div><br />
</div><div>Сервер времени и даты использует протокол <b>TCP</b>. Вот код такого простого сервера:</div><pre><div><div>#include <sys/socket.h> // собственно, сокеты</div><div>#include <string.h> // отсюда мы берем memset()</div><div>#include <resolv.h> // тут объявлены структуры sockaddr</div><div>#include <stdio.h> // snprintf()</div><div> </div><div>#define BUFSIZE 128 // максимальный размер буфера под выводимую строку</div><div>#define LISTENQ 256 // максимальный размер очереди клиентов</div><div> </div><div>#define bzero(x,y) memset((x),0,(y)) // макрос позволяющий пользоваться bzero вместо memset</div><div> </div><div>int main()</div><div>{ </div><div> int listenfd, connfd; // дескрипторы сокетов</div><div> struct sockaddr_in servaddr; // структура, которой задается адрес сокета</div><div> char buff[BUFSIZE]; // массив чаров. Туда будет помещаться строка, которую сервер отдаст клиенту</div><div> time_t ticks; // сюда будет помещено время в секундах</div><div> </div><div> listenfd = socket(AF_INET, SOCK_STREAM, 0); // просим операционную систему создать для нас сокет протокола IPv4 (AF_INET) / TCP (SOCK_STREAM). Эта функция вернет дескриптор сокета.</div><div> bzero(&servaddr, sizeof(servaddr)); // зануляем память структуры, это необходимо. Использовать bzero вместо memset сложилось исторически, еще с появления сокетов на BSD. Хотя разницы нет.</div><div> servaddr.sin_family = AF_INET; // структура для IPv4</div><div> servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // задаем адрес</div><div> servaddr.sin_port = htons(1313); // задаем порт. Стандартно для сервера времени - 13, но его от обычного пользователя мы не сможем использовать.</div><div> </div><div> bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); // "привязываем" сокет к адресу и порту</div><div> </div><div> listen(listenfd, LISTENQ); // говорим операционной системе ожидать подключений к нашему сокету</div><div> </div><div> for(;;) { </div><div> connfd = accept(listenfd, (struct sockaddr*) NULL, NULL); // когда клиент подключается к серверу, то операционная система создаст сокет. Собственно этой функцией и задаем подключение клиентов, она возвращает дескриптор на новый сокет клиента</div><div> ticks = time(NULL); // получаем текущее время в секундах</div><div> snprintf(buff, sizeof(buff), "%.24s\er\en\n", ctime(&ticks)); // переводим секунды в удобный для восприятия формат</div><div> send(connfd, buff, strlen(buff), 0); // отправляем данные (на самом деле ничего не отправляется тут)</div><div> close(connfd); // закрываем соединение</div><div> } </div><div> return 0;</div><div>}</div></div></pre><div>Предупреждаю, что возвращаемые значения функций там не обрабатываются, а они возвращают 0 или номер ошибки. Поэтому, если у вас эта программа не будет работать, то скорее всего в работе какой-то функции возникает ошибка. Хорошим тоном, будет создать для всех функций обвертки и проверять в них возвращаемые значения, если функция вернет не ноль, то выводить ошибку и завершать программу.</div><div>Еще хочу сказать про функцию <b>send</b>, казалось бы, по названию можно подумать что она что-то там куда-то отправляет, но это не так. На самом деле она всего лишь помещает данные в буфер <b>TCP</b> (этот буфер уникальный для каждого порта) операционной системы, а уже она будет что-то там пытаться отправить. То есть, ничто не может гарантировать успешную отправку данных.</div><div><br />
</div><div>Ну что, компилируем (обратите внимание, никакие динамические библиотеки подключать не надо), запускаем, программа "висит". Хорошо. Пробуем подключиться с помощью <b>telnet</b>:</div><pre><div>$ telnet 127.0.0.1 1313</div><div><div>Trying 127.0.0.1...</div><div>Connected to 127.0.0.1.</div><div>Escape character is '^]'.</div><div>Sat Feb 26 15:46:12 2011</div><div>Connection closed by foreign host.</div></div></pre><div>Все работает!</div><div><br />
</div><div><br />
</div><div>Далее напишем клиент:</div><pre><div><div>#include <sys/socket.h></div><div>#include <string.h></div><div>#include <resolv.h></div><div>#include <stdio.h></div><div> </div><div>#define BUFSIZE 128</div><div> </div><div>#define bzero(x,y) memset((x),0,(y))</div><div> </div><div>int main()</div><div>{ </div><div> int connfd;</div><div> struct sockaddr_in servaddr;</div><div> char buff[BUFSIZE];</div><div> char servIP[] = "127.0.0.1"; // задаем IP адрес сервера</div><div> </div><div> connfd = socket(AF_INET, SOCK_STREAM, 0);</div><div> bzero(&servaddr, sizeof(servaddr));</div><div> servaddr.sin_family = AF_INET;</div><div> inet_pton(AF_INET, servIP, &servaddr.sin_addr); // заполняем поле адреса (32 бита) с помощью функции inet_pton</div><div> servaddr.sin_port = htons(1313);</div><div> </div><div> connect(connfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); // подключаемся к серверу</div><div> recv(connfd, buff, BUFSIZE, 0); // получаем данные от сервера (вернее получаем данные из буфера TCP)</div><div> </div><div> printf("%s", buff);</div><div> </div><div> close(connfd);</div><div> return 0;</div><div>}</div></div></pre><div>Здесь, так же, обработки ошибок нет. Я не стал их делать, чтобы не загромождать код, ведь, это всего лишь примеры.</div><div><br />
</div><div>Кстати, IP адрес и порт которые помещаются в <b>struct sockaddr_in</b> должны иметь сетевой порядок следования байтов. Для этого пользуются специальными функциями преобразования:</div><div><b>htons</b> (<i>host TO net short</i>) - для преобразования порта.</div><div><b>htonl</b> (<i>host TO net long</i>) - для преобразования адресов.</div><div>Функция <b>inet_pton</b> преобразует массив символов (<i>строку</i>) в адрес (<i>32 бита для IPv4</i>) с сетевым порядком.</div><div>В функциях <b>connect</b>, <b>bind</b> и <b>accept</b> делается преобразование типа к <b>struct sockaddr</b> для их совместимости с различными протоколами <b>IP</b>. Подробно об этом не буду говорить, скажу лишь, то, что это преобразование нужно делать.</div><div>Возможно, вы заметили что в коде клиента нет функции <b>bind</b>. Но ведь клиенту тоже нужен порт, с которого он будет отправлять данные? Дело в том, что <b>bind</b> можно и не делать, если так, то операционная система назначит порт для клиента автоматически.<br />
Кстати, полное описание, прототипы, возвращаемые и значения всех функций можно найти в <b>man</b>.</div><div><br />
</div><div><br />
</div><div><br />
</div><div>Это были всего лишь основы. Если вам интересно сетевое программирование, то очень советую почитать книгу <i>UNIX Network Programming (рус. UNIX. Разработка сетевых приложений), </i>автор W. R. Stevens. В ней все очень подробно расписывается, как про сокеты так и про устройство основных протоколов интернета.</div></div>nitxhttp://www.blogger.com/profile/15082011419035009816noreply@blogger.com5tag:blogger.com,1999:blog-5859890337560558536.post-62029481087727030692011-02-16T04:51:00.000-08:002011-02-17T10:52:02.034-08:00[bash] Выбор случайного файла из директории.<div dir="ltr" style="text-align: left;" trbidi="on">Как-то раз, мне понадобился скрипт который бы сам выбирал рандомные файлы из директории. Собственно, я написал его и сейчас выложу здесь.<br />
<div><br />
На для начала разберемся как будем это делать. Итак, на входе подается список директорий, в которых лежат нужные нам файлы. Собираем файлы и пихаем в массив. Перемешиваем все файлы в массиве (тогда при последовательном обходе они станут случайными). И все. Очень просто. На самом деле мой скрипт немного сложнее, но весь алгоритм такой.<br />
<br />
Вот код:<br />
<div><pre>#!/bin/bash
onSIGINT() { # создаем функцию которая будет завершать вечный цикл
echo "SIGINT received, bye bye!"
exit 0
}
trap 'onSIGINT' INT # трап, вызывающий эту функцию на SIGINT
regexType="posix-egrep" # переменная указывающая на то, какие регулярные выражения будет использовать утилита find
regex=".*\.(mp3|flac)$" # сам шаблон регулярного выражения
depth="u" # глубина поиска. u [unlimited] - не ограничена, может быть числом
if [[ $# -eq 0 ]]; then # проверка. Если не получили аргументов, то выводим хелп и выходим
echo "Usage: $0 [-d DEPTH] DIR1 [DIR2 [DIR3 [...]]]"
exit 0
fi
index=0
for i in `seq 1 $#`; do # цикл обработки аргументов командной строки
arg=${!i}
if [[ $bNextDepth -eq 1 ]]; then
bNextDepth=0
if [[ $arg =~ ^[0-9]+$ ]]; then # по сути проверка - число ли depth или нет
depth=$arg
continue
else
echo "Missing value for -d." # ошибка. Юзер написал -d но не написал значение для него
exit 1
fi
fi
if [ "$arg" = "-d" ]; then
bNextDepth=1
if [[ $# -eq $i ]]; then
echo "Missing value for -d."
exit 1
fi
continue
fi
if [ ! -d "$arg" ]; then # проверяем, действительно ли нам подали директорию?
echo "Directory $arg does not exists."
else
dirList[$index]=$arg # сохраняем ее в массив
let "index++"
fi
done # конец обработки аргументов командной строки
if [[ ${#dirList[@]} -eq 0 ]]; then # если юзер глупый и не ввел не одну правильную директорию выходим, сообщая ошибку
echo "No one correct directory has been found."
exit 2
fi
index=0
if [ "$depth" != "u" ]; then # если у нас в depth число
depthArg="-maxdepth $depth"
fi
while read line
do
filesArray[$index]="$line"
let "index++"
done < <(find "${dirList[@]}" $depthArg -regextype "$regexType" -iregex "$regex" -type f) # когда я впервые увидел эту строку в одном примере, желание писать скрипты на баше у меня почти отпало. Спасибо людям на канале #gentoo-ru которые мне объяснили ее смысл. А про find я расскажу ниже.
filesNum=${#filesArray[@]}
echo "Found $filesNum files."
let "filesNum--" # уменьшаем на 1. Потому что for в баше (в отличии от Си) выберет последний элемент тоже.
while [ true ]; do
for i in `seq 0 "$filesNum"`; do # цикл который перемешает массив
let "rndPos = RANDOM % $filesNum"
temp="${filesArray[$i]}" # в этих 3 строках меняем местами элементы
filesArray[$i]="${filesArray[$rndPos]}"
filesArray[$rndPos]="$temp"
done
for i in `seq 0 "$filesNum"`; do # собственно, цикл запускающий нашу программу с нужным аргументом
/usr/bin/mplayer "${filesArray[$i]}"
done
done
exit 0 # все</pre></div><div style="text-align: left;"><br />
</div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>find "${dirList[@]}" $depthArg -regextype "$regexType" -iregex "$regex" -type f</b></span><br />
<ul style="text-align: left;"><li>Здесь <b><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;">${dirList[@]}</span></b> - массив корректных директорий который мы составили ранее. </li>
<li><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;">$depthArg</span></b> (<i>без кавычек</i>) - два слова, первое - аргумент (<b><i>-maxdepth</i></b>), второе - его значение. </li>
<li><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>$regexType</b></span> - тип регулярного выражения. </li>
<li><b><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;">$regex</span></b> - шаблон регулярного выражения по которому мы выбираем файлы из директории. </li>
<li><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>-type f</b></span> - указывает <b>find</b>'у то, что нас интересуют только реальные файлы. </li>
</ul>Как вы уже могли заметить, этот скрипт подбирает рандомные файлы mp3 или flac и запускает <b>mplayer</b> от них. Реализовано все так, что, пока все файлы не пройдут, они повторятся не будут (<i>по сути, мы просто воспроизводим все по порядку из массива <b>filesArray</b>, но перед началом вложенного цикла перемешиваем массив случайным образом</i>). <br />
<b>-maxdepth N</b> это параметр указывающий <b>find</b>'у, сколько раз надо проходить во вложенные директории (<i>1 - ни разу не переходить</i>).<br />
Кстати, вместо блока кода <span class="Apple-style-span" style="font-family: monospace; white-space: pre;"> </span></div><div><pre><span class="Apple-style-span" style="font-family: monospace; white-space: pre;">for i in `seq 0 "$filesNum"`; do
let "rndPos = RANDOM % $filesNum"
temp="${filesArray[$i]}"
filesArray[$i]="${filesArray[$rndPos]}"
filesArray[$rndPos]="$temp"
done</span></pre>можно использовать утилиту <b>shuf</b>. То есть весь этот блок кода заменить на строку:<br />
<b><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;">shuf -e ${filesArray[@]}</span></b><br />
Проблема в том, что <b>shuf</b> не входит в <b>POSIX</b>.<br />
Еще можно попробовать делать это через <b>sort -R</b>.<br />
<br />
Вот и все.</div></div></div>nitxhttp://www.blogger.com/profile/15082011419035009816noreply@blogger.com16tag:blogger.com,1999:blog-5859890337560558536.post-27950818664173879702011-02-12T11:57:00.000-08:002011-03-12T09:20:35.519-08:00Yeahconsole.<div dir="ltr" style="text-align: left;" trbidi="on">Вы можете работать в unix-like операционной системе без консоли? Например, я не люблю работать с файловой системой, некоторыми сетевыми протоколами, и так далее через оболчки с GUI. Возможности консоли почти безграничны, есть даже консольный графический редактор ImageMagick, о котором, возможно, я когда-нибудь расскажу. Все это я говорю к тому, что зачастую не очень удобно переключаться между каким-либо активным окном (например, браузером) и часто используемой консолью.<br />
Поэтому представляю вашему вниманию <b>yeahconsole</b>. Что это? Собственно, довольно удобная выезжающая консоль. Что-то подобное вы скорее всего видели в играх, например, в Quake.<br />
Выглядит это так:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0yAj9j6SbsykeC57kUs9I7QNmScCdDMCpPIexggOC1_fxgsfMWfhDuhBusNQVJiHXRYpexILc-U6jB4FrkyQsZ_O0JMC3Tk75mqbnQyrYR9BZDbv69q37Vt1G6shAhTmQuyhJcVtc-0NM/s1600/blogspot_yeahconsole.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0yAj9j6SbsykeC57kUs9I7QNmScCdDMCpPIexggOC1_fxgsfMWfhDuhBusNQVJiHXRYpexILc-U6jB4FrkyQsZ_O0JMC3Tk75mqbnQyrYR9BZDbv69q37Vt1G6shAhTmQuyhJcVtc-0NM/s200/blogspot_yeahconsole.jpg" width="200" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Достоинства:<br />
<div style="text-align: left;"></div><ul style="text-align: left;"><li>Удобное использование по хоткею</li>
<li>Самая легковесная и, следовательно <u>быстрая</u>, по сравнению с аналогами (если не считать скрипты с <b>wmctr</b>). На мой взгляд, это самое большое преимущество.</li>
<li>Сама по сути не является эмулятором терминала, а использует существующие (<b>xterm, </b>и мой любимый <b>urxvt</b>)</li>
<li>Вылезает поверх всех окон. Сразу становится зафокусированной window менеджером.</li>
<li>Настройка очень проста.</li>
</ul>Теперь про настройку. Она осуществляется в файле <b>~/.Xdefaults. </b><br />
<div style="text-align: left;">Конфиги записываются построчно так: <b>yeahconsole*параметр: значение</b></div><div style="text-align: left;">Как всегда, весь набор можно посмотреть в <b>man yeahconsole.</b></div><div style="text-align: left;">Некоторые параметры:</div><pre><div style="text-align: left;"></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! клавиша включения</span></b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;"></span>yeahconsole*toggleKey: </b><span class="Apple-style-span" style="font-weight: normal;"><b>None+F1</b></span><b> </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! включить полноэкранный режим у активной </span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*keyFull: Alt+F1 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! клавиша увеличения высоты</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*keyBigger: Control+KP_Add </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! уменьшения высоты</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*keySmaller: Control+KP_Subtract </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! задержка появления</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*aniDelay: 30 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! перезагружать терминал</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*restart: 0 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! отступ от левого края</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*xOffset: 0 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! ширина. По дефолту - ширина экрана.</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*screenWidth: 650 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! высота в строках</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*consoleHeight: 15 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! ширина полоски изменения размера</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*handleWidth: 1 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! ее цвет</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*handleColor: rgb:8/8/7 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! ее цвет без фокуса</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*handleColor.unfocus: rgb:4/4/38 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! цвет фона</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*background: black </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! цвет текста</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*foreground: grey70 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! шрифт</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*font: -*-terminus-medium-*-*-*-*-*-100-100-*-*-iso10646-1 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! количество строк которые запоминает</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*savelines: 10000 </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><span class="Apple-style-span" style="font-weight: normal;">! используемый эмулятор терминала</span></b></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>yeahconsole*term: urxvt </b></span></div><div style="text-align: left;"><b>
</b></div></pre><div style="text-align: left;">Вот и все. Удачи в настройке.</div><br />
<div style="text-align: left;"><br />
</div></div>nitxhttp://www.blogger.com/profile/15082011419035009816noreply@blogger.com15tag:blogger.com,1999:blog-5859890337560558536.post-25856960218610415962011-02-12T03:53:00.000-08:002011-02-17T11:04:06.773-08:00Настройка VPN в Linux с использованием PPTP.<div dir="ltr" style="text-align: left;" trbidi="on">Всем известно, что некоторые провайдеры раздают интернет через VPN. Именно VPN, а не просто PPTP мотивируется, наверное, наличием шифрования, при такой же легкой настройке. Но настройка легка только в Windows.<br />
<br />
Собственно, первая проблема с которой я когда-то столкнулся после установки линукса - подключение по VPN.<span class="Apple-style-span" style="font-family: inherit;"> Гугл выдавал множ</span>ество вариантов, но принцип был в основном одним и тем же, причем, успешно настроить этот богомерзкий VPN мне так и не удавалось.<br />
<br />
Решение все-таки было найдено. Как оказалось со стороны конфигов ppp все было правильно, не правильными были роуты (<i>route, маршруты</i>). Дело в том, что ppp требует ставить себе default route (<i>однако, на debian'е у ppp есть конфиг </i><b>replacedefaultroute</b><i>. Как раз 70% того что выдает гугл, содержит эту опцию, следовательно конфиг работает только под Debian-Ubuntu-... </i>). Решение было очевидно - прописывать все необходимые роуты при старте системы.<br />
<br />
<br />
<br />
Теперь расскажу всю настройку VPN в целом. Нам потребуются пакеты:<br />
<ul style="text-align: left;"><li><b>ppp</b></li>
<li><b>pptp</b></li>
</ul><span class="Apple-style-span" style="font-family: inherit;">А так же необходима поддержка <b>ppp</b> в ядре. Если вы не собирали ядро сами, то скорее всего <b>ppp</b> в ядре у вас есть.</span><br />
<span class="Apple-style-span" style="font-family: inherit;">В файл <span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><b>/etc/ppp/options.pptp</b> пишем (<i>под рутом</i>):</span></span><br />
<pre><span class="Apple-style-span" style="font-family: Verdana, Helvetica, Arial, sans-serif;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 14px; line-height: 17px;"><b></b></span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>noauth </b># не авторизовываться пока не будет получен gateway</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>refuse-eap </b># Не использовать проверки</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>refuse-pap </b>## Возможно, что на стороне провайдера стоит</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>refuse-chap </b>## обязательным проверка по некоторым из этих</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>refuse-mschap </b>## алгоритмов</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>nobsdcomp </b># в этой и следующей строке отключаем компрессию</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>nodeflate</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>persist </b><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"># восстановление связи при обрыве</span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>maxfail 10 </b><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"># десять попыток восстановления</span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>defaultroute </b># подменяем дефолтный роут (<i>о проблемах с этим я писал выше</i>)</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>#replacedefaultroute </b># раскоментить если у вас Debian-like дистрибутив (<i>например, Ubuntu</i>)</span>
<span class="Apple-style-span" style="font-family: Verdana, Helvetica, Arial, sans-serif; font-size: x-small;">
</span></pre><span class="Apple-style-span" style="font-family: inherit;">Далее нам потребуется еще один файл, в этом файле описываются все особенности касательно провайдера. Создаем <span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><b>/etc/ppp/peers/название_соединения </b>(</span><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><i>тоже под рутом</i></span><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;">):</span></span><br />
<br />
<pre><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><b>pty "pptp Адрес_VPN_провайдера --nolaunchpppd"</b> # собственно адрес VPN-сервера</span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><b>connect /bin/true </b> </span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><b>name Ваш_Юзернейм </b> </span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><b>password "Ваш_Пароль"</b></span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><b>remotename название_соединения</b> # </span><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;">имя данного файла</span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><b>file /etc/ppp/options.pptp</b> # указываем путь до конфига который создали выше</span></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;">
</span></span></pre><span class="Apple-style-span" style="border-collapse: collapse; line-height: 17px;"><span class="Apple-style-span" style="font-family: inherit;">Далее, если у нас не Debian-like дистрибутив (<i>у нас закоменчена опция <b>replacedefaultroute</b></i>) следует прописать роуты локальной сети (<i>об этом я говорил выше)</i>, обычно их можно найти на сайте провайдера.</span></span><br />
<br />
<span class="Apple-style-span" style="font-family: inherit;">Напомню что список текущих роутов получается командой <b>route -n</b>. Прописываются и удаляются роуты через команду <b>route</b>. Более подробно написано в <b>man route</b> (<i>который я очень рекомендую почитать)</i>. Так же следует помнить, что прописав роуты они скинутся после перезагрузки системы. Так что, лучше создать скрипт который будет добавлять роуты и добавить его в автозагрузку (<i>у разных дистрибутивов автозагрузка в разных местах)</i>. </span><br />
<br />
Собственно, настройка закончена. VPN включается по команде <b>pon название_соединения</b>, а выключается по команде<b> poff </b><b>название_соединения.</b><br />
<b><br />
</b><br />
<b></b><br />
<b></b>Приведу <u>альтернативный</u> пример настройки всего этого под <u>Gentoo</u>, соответственно с использованием конфигов Gentoo. Файл <b>/etc/conf.d/net</b>:<br />
<br />
<pre><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>config_eth0=( "айпи_локальной_сети netmask маска_локальной_сети" )</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>gateways_eth0="адрес_шлюза" </b># gateway</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>routes_eth0=( </b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> </b># прописываем роуты локальной сети. Пример ниже:</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> "-net айпи_адрес_роута netmask маска_сети_роута gw адрес_шлюза"</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> )</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>dns_servers_eth0="днс_сервер"</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>config_ppp0=( "ppp" )</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>link_ppp0="pty 'адрес_VPN_провайдера --nolaunchpppd --nobuffer'"</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>username_ppp0='юзернейм'</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>password_ppp0='пароль'</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>pppd_ppp0=(</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> noauth </b># узнаете эти строки? :3</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> refuse-eap</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> refuse-pap</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> refuse-chap</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> refuse-mschap</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> debug</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> nobsdcomp</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> nodeflate</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> mtu 1474</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> mru 1474</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> persist</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> logfile /var/log/pppd.log </b># можно так же добавить файл для логов pppd</span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> maxfail 10</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> defaultroute</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>)</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>depend_ppp0() {</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b> need net.eth0</b></span>
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b>}</b></span></pre>Скрипт будет запускаться при старте системы. Или это можно делать руками, как с любым скриптом в Gentoo: <b>/etc/init.d/net.ppp0 start </b>(<i>или<b> restart, stop</b></i>).<br />
Еще я забыл сказать, что нужно создать файл <b>/etc/init.d/net.ppp0</b>. Это делается простым копированием <b>net.lo</b>: <b>cp /etc/init.d/net.lo /etc/init.d/net.ppp0 </b>(и все из под рута).<br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b></b></span><br />
<a name='more'></a><span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: x-small;"><b><br />
</b></span><br />
<span class="Apple-style-span" style="font-family: inherit;">Собственно все.</span><br />
<br />
</div>nitxhttp://www.blogger.com/profile/15082011419035009816noreply@blogger.com8tag:blogger.com,1999:blog-5859890337560558536.post-6810834711008736022011-02-11T09:29:00.000-08:002011-02-11T09:33:06.732-08:00Проба пера.<div dir="ltr" style="text-align: left;" trbidi="on">Здравствуйте. Давно хотел создать нечто, куда можно было бы выливать весь свой бред, мысли, пожелания, удачный или печальный опыт и ... в общем просто дампы памяти из головы.<br />
<br />
Как можно догадаться по названию, основной тематикой моего блога будет изучение unix <i>(в частности *nix, т.к., например, linux - Linux Is Not UniX, что уже веет каким-то маразмом), </i>а так же программирование.<br />
<br />
Коротко расскажу о себе: учусь на втором курсе (<i>на момент 2010-2011 года</i>) НГУ на факультете информационных технологий. Собственно, на данный момент у нас преподаются предметы: операционные системы, сети и ООП. Возможно, об ихних лабораторных работах и пойдет речь в моем блоге, так или иначе, я бы хотел затронуть эту тему.<br />
<br />
Собственно сейчас сижу и думаю о чем бы написать первым делом.</div>nitxhttp://www.blogger.com/profile/15082011419035009816noreply@blogger.com5