#1 19.01.12 00:22
Передача данных из файла в скрипт парсера (php или bash)
На определённый порт сервера приходят пакеты.
Слушаем пакеты и записываем их в файл так (фоном)
Код::
tcpdump -i eth1 -v port 20200 -l | tee capture.cap
В итоге имеем файл в которой сразу при поступлении пакета происходит его запись в файл.
Стоит следующая цель: Пакет записаный в файле обрабатывается парсером. из него выуживается вся инфа и заноситься с БД.
Стоит вопрос: Как реализовать передачу данных из файла в скрипт парсера (по совмещению он и будет писать данные в БД). Парсер всё таки буду писать на php.
Как я вижу возможное решение:
Мысль 1. Использовать для слежения за файлом bash скрипт новые данные будут получены применением команды
Код::
tail -f capture.cap
Но т.к. в баш не силён ставлю эту мысль под сомнение.
Мысль 2. Читать файл capture.cap через равные промежутки времени (скриптом php по крону, например каждые 10 секунд). После прочтения файла затираем его содержимое, а что прочитали ранее обрабатываем и заносим в БД. Но тут встает вопрос "А что если будет теряться часть данных в момент, чтения файла и его затирания".
Мысль 3. Исходя из второй мысли предпочтителен будет вариант с использованием tail, т.к. это гарантирует передачу всех данных к парсеру. но хз как его реализовать.
Хочу услышать ваши мысли по этому поводу!
Offline
#2 19.01.12 08:01
Re: Передача данных из файла в скрипт парсера (php или bash)
а смысл сохранять в файл и потом его же воспроизводить с помощью "tail -f"? с тем же успехом можно сразу выполнять действия с "tcpdump -i eth1 -v port 20200 -l"
Че-нить такое:
Код::
#Запускаем в фоне и сохраняем в /home/user/capture.cap nohup tcpdump -i eth1 -v port 20200 -l > /home/user/capture.cap & #Делаем копию по крону того что есть и обнуляем(интервал минимальный я не думаю что что-то потеряется. cp /home/user/capture.cap /home/user/capture.cap.`date +%F" "%H:%M`;echo " " > /home/user/capture.cap Итого имеем файл типо /home/user/capture.cap.2012-01-19 04:45 для парсинга.
Исправлено Tinkoff (19.01.12 08:02)
Offline
#3 19.01.12 17:02
Re: Передача данных из файла в скрипт парсера (php или bash)
еще один вариант на ум пришел, также в фоне пишем в лог, а php парсер просто по крону работает так:
1. Обрабатывает лог, добавбляет в базу и в конец файла пишет сообщение, типо
Echo "Обработка лога завершена" date +%F >> /home/user/capture.cap
2. Когда парсер запускается второй раз начинает обработку уже с этой записи.
Offline
#7 27.01.12 16:17
Re: Передача данных из файла в скрипт парсера (php или bash)
Решение в итоге следующее
первый скрипт
Код::
#!/bin/bash if [ "$1" ] # Проверка наличия аргумента порта командной строки. then PORT=$1 else PORT=80 # Значение по-умолчанию, если число не задано в командной строке fi DATE=$(date +%Y.%m.%d---%H_%M_%S) FILENAME=/home/evtuhovdo/script/temp/capture_$PORT.cap #echo "Прослушиваем порт $PORT и записываем его в файл $FILENAME!" /usr/sbin/tcpdump -i eth1 port $PORT -p -v -l -tt -x > $FILENAME
Исправлено den-lex (27.01.12 16:20)
Offline
#8 27.01.12 16:18
Re: Передача данных из файла в скрипт парсера (php или bash)
и второй скрипт restart_listen.sh который мы по крону перезапускам каждые 5 минут
Код::
#!/bin/bash
if [ "$1" ]
# Проверка наличия аргумента порта командной строки.
then
PORT=$1
else
PORT=80 # Значение по-умолчанию, если число не задано в командной строке
fi
#Находим PID ранее запущенного процесса
PS=$(ps -ax | grep "./listen.sh $PORT" | grep "bash")
#echo Длинна PS ${#PS}
PID=${PS:0:6}
if [ ${#PS} != 0 ]
then
#Убиваем listen.sh
kill -9 $PID
#$(echo msg 331591001 Убили процесс listen PID $PID > /root/.climm/scripting)
#И остался процесс tcpdump его тоже грохаем
PST=$(ps -ax | grep /usr/sbin/tcpdump | grep "port $PORT")
if [ ${#PST} != 0 ]
then
kill -9 ${PST:0:6}
#$(echo msg 331591001 Убили процесс tcpdump PID ${PST:0:6} > /root/.climm/scripting)
fi
bash /home/evtuhovdo/script/listen.sh $PORT > /dev/null 2>&1 &
#/bin/bash /home/evtuhovdo/script/listen.sh $PORT > /home/evtuhovdo/script/info_listen.txt
#echo "Перезапустили list=$PID и tcpdump=${PST:0:6}"
$(echo msg 331591001 Перезапуск listen.sh "$PORT!"!!! > /root/.climm/scripting)
else
bash /home/evtuhovdo/script/listen.sh $PORT > /dev/null 2>&1 &
$(echo msg 331591001 Запустили ранее не задействованый listensh "$PORT!"!!! > /root/.climm/scripting)
fi
#Малость подождём чтобы файл для дампа скопировался и система отдышалась =)
sleep 3
/usr/bin/php5 /home/evtuhovdo/script/parser.php $PORT
exitИсправлено den-lex (27.01.12 16:23)
Offline
#9 27.01.12 16:25
Re: Передача данных из файла в скрипт парсера (php или bash)
и в кроне записываем такую байду
Код::
*/5 * * * * bash /home/evtuhovdo/script/restart_listen.sh 555 */5 * * * * bash /home/evtuhovdo/script/restart_listen.sh 556
успешно отработало с 10ю прослушиваемыми портами одновременно, на хилом серваке 1,8Celeron+512ОЗУ
Offline
#10 27.01.12 16:25
#11 31.01.12 09:33
Re: Передача данных из файла в скрипт парсера (php или bash)
внимание вопрос, а нельзя ли на php открыть сокет и парсить этот трафик готовыми функциями? есть предположение, что это вполне реально. данное решение, если оно реализуемо, выглядит более разумным. я не настаиваю, всё-таки я не спец в программировании, но всё-таки.
http://www.php.net/manual/en/function.socket-create.php
Offline
#12 31.01.12 16:17
Re: Передача данных из файла в скрипт парсера (php или bash)
ninjah, речь тут все же идет не о тех данных, которые передаются через сокеты, а про данные самих пакетов (src IP, dst IP и т.п.)
den-lex, я так понимаю, что это некое подобие биллинга в разрезе портов... тебе какие реально данные из выхлопа tcpdump нужны? вероятно существуют более элегантные решения...
Offline
#13 31.01.12 16:28
#14 01.02.12 17:32
Re: Передача данных из файла в скрипт парсера (php или bash)
ninjah, ты чертовски прав, немного почитав книжки понял что путь к успеху лежит через сокеты =) Думаю что удобнее на perl будет, а выше описанный анализ пакетов бессмысленная трата времени. Т.к. на заголовок IPv4 и TCP мне наплевать, а нужны только данные.
На данный момент нашел утилиту netcat с её помощью можно замечательно получать данные из пакетов, и по сути не замачиваться с открытием сокетов, утилита сама открывает сокет и не завкрывает пока соединение не закроет удалённая сторона.
П.С. ответ на вопрос: Это будут данные от GPS трекера.
Offline
#15 01.02.12 17:33
#16 01.02.12 17:49
Re: Передача данных из файла в скрипт парсера (php или bash)
Offline
#17 01.02.12 17:56
#18 02.02.12 21:50
#19 02.02.12 21:51
Re: Передача данных из файла в скрипт парсера (php или bash)
В этом случае нет никаких задержек и данные сразу после поступления летят в парсер. Приём пакетов осуществляется не tcpdump (т.к. на заголовки ipv4 и tcp мне плевать), а через netcat.
Исправлено den-lex (02.02.12 21:52)
Offline
#20 03.02.12 09:03
#21 08.02.12 00:20
Re: Передача данных из файла в скрипт парсера (php или bash)
маньяки...
Код::
<?php
$port=88;
$sock = socket_create_listen($port);
socket_getsockname($sock, $addr, $port);
print "Server Listening on $addr:$port\n";
while($c = socket_accept($sock)) {
socket_getpeername($c, $raddr, $rport);
print "Received Connection from $raddr:$rport\n";
while ($data=socket_read($c,1500)) {
//parse or ptint this
echo $data;
}
}
socket_close($sock);
?>ну или более правильный вариант (мой на 1 соединение всего)
http://ru.php.net/manual/ru/function.so … .php#80691
но в любом случае ход мысли понятен, и здесь не нужен ни tcpdump ни nc
Offline

