LINUX.ORG.RU
решено ФорумAdmin

Консоль, конвеер - что не так?


0

1

Хотел наковырять из трафика поисковые запросы к яндексу. Придумал такую команду:

 
tcpdump -i eth0 -A |grep -a GET|grep  yandsearch|grep -o -E '(%[1234567890ABCDEF]+\+*)+'|xargs -i python2.7 -c "import urllib, sys; print urllib.unquote(sys.argv[1])" '{}'
Не работат. В то-же время
sudo tcpdump -i eth0 -A >trafic

cat trafic|grep -a GET|grep  yandsearch|grep -o -E '(%[1234567890ABCDEF]+\+*)+'|xargs -i python2.7 -c "import urllib, sys; print urllib.unquote(sys.argv[1])" '{}'
 — работает.В чем секрет?


Ответ на: комментарий от akk

Прошу прощения, там в первой команде опечатка. Разумеется sudo есть.. без него все прикращается с формулировкой

tcpdump: eth0: You don't have permission to capture on that device
(socket: Operation not permitted)

Результат выполнения первой команды( конечно с sudo) - молчание, вторая команда сыпит в консоль запросы.

naszar
() автор топика

man tcpdump !!!!!

-l Make stdout line buffered. Useful if you want to see the data while capturing it.
E.g.,
``tcpdump -l | tee dat" or ``tcpdump -l > dat & tail -f dat".

Bers666 ★★★★★
()
Ответ на: комментарий от Bers666

Спасибо большое.. но не лечит. Можно немного упростить.

$ sudo tcpdump -l -i eth0 -A |grep -a -o 'GET.*yandsearch.*'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
GET /yandsearch?text=%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8&lr=75 HTTP/1.1
GET /yandsearch?text=%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8+%D1%84%D0%BE%D1%82%D0%BE&lr=75 HTTP/1.1
GET /yandsearch?text=%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8+%D1%84%D0%BE%D1%82%D0%BE&lr=75 HTTP/1.1
GET /yandsearch?text=%D1%84%D0%BE%D1%82%D0%BE+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8+%D1%80%D1%83%D0%B1%D0%BB%D0%B8&lr=75 HTTP/1.1
^C1494 packets captured
1524 packets received by filter
30 packets dropped by kernel
.. и
$ sudo tcpdump -l -i eth0 -A |grep -a -o 'GET.*yandsearch.*'|cat
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C1288 packets captured
1288 packets received by filter
0 packets dropped by kernel

naszar
() автор топика

Секрет в том что команда cat прочитывает файл и завершается и все последующие команды в конвеере понимают что данных больше нет, буфер накапливать бесполезно - и так же завершают свою работу.

В первом же случае tcpdump выдает информацию построчно, небыстро и завершаться не собирается - второй грип в конвеере терепеливо заполняет свой буфер - прежде чем отдавать его третьему - если запустить и подождать минут 10-20 - отфильтрованные строки в конце концов сквозь все эти буфера таки доберутся до конца конвеера.

Собственно это проблема, достаточно неприятная, грепа, где их в конвеере больше двух.

Решение - добавить в третий и второй грер опцию --line-buffered

anonymous
()

TS, заюзай urlsnarf из пакета dsniff

Bers666 ★★★★★
()

Какой олдскул с массой конвееров grep|grep|grep. Освойте уже egrep.

dbzer0
()
tcpdump -i eth0 -A | perl -n -e 'BEGIN { $| = 1; } print if m!^GET\s+/yahdsearch\?.*\sHTTP/1\.\d+!;'
berrywizard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.