Мини заметки — выпуск 14

9 сентября 2013

Мини заметок не было целых два месяца. Я знаю, вы по ним соскучились! В этом выпуске: настраиваем VNC в Ubuntu, конвертируем онлайн-книги в PDF, изучаем консольные сниферы, клонируем схемы в PostgreSQL и не только. Предыдущие выпуски: тринадцатый, двенадцатый, одиннадцатый, десятый.

1. Консольные сниферы

Если вам нужно грепнуть сетевой трафик по некоторой строке, используйте ngrep:

sudo ngrep -d lo -W byline port 8081

Для более сложных вещей лучше использовать tcpdump:

sudo tcpdump -n -q -i lo -s 0 -A src or dst port 8081

Вместо флага -A можно использовать -X, тогда пакеты будут выводиться в hex’е.

Так можно отсечь неинтересные пакеты:

sudo tcpdump -n -q -i lo -s 0 -A '(src or dst port 8081) and (length > 74)'

Удобно использовать tcpdump в связке со strings:

sudo tcpdump -n -i lo -s 0 -l -w - '(src or dst port 8081) and (length > 74)' | strings

Я лично для того, чтобы посмотреть HTTP-трафик, использую такой однострочник:

sudo tcpdump -nql -i lo -s 0 -A '(src or dst port 8081) and (length > 74)' | perl -lne 's/^.{8}(HTTP|GET|HEAD|POST|PUT|DELETE)/$1/; print $_'

Помимо tcpdump есть еще tcpflow, который показывает только данные, без IP и TCP заголовков, но, к сожалению, не поддерживает UDP:

sudo tcpflow -i eth0 'src or dst port 5432' -c -D

Если вам нужен снифер, осведомленный о существовании протоколов, используйте tshark. Это типа консольный WireShark:

sudo tshark -npi lo -d tcp.port==8081,http -f 'src or dst port 8081' -R "http.request.method" -T fields -e ip.src -e ip.dst -e http.request.method -e http.host -e http.request.uri

Здесь -i задает интерфейс, -f — фильтр того, что нужно перехватывать, а -R — фильтр того, что нужно выводить. Часть -d tcp.port==8081,http говорит tshark декодировать трафик на 8081-ый порт, как HTTP. В конце команды перечисляются поля, которые должны выводиться.

Получить более подробный вывод с заголовками запросов/ответов и тп можно так:

sudo tshark -npi lo -d tcp.port==8081,http -f 'src or dst port 8081' -V -R "http.request || http.response"

Вообще, tshark гениален. Если он видит в ответе, скажем:

Content-Type: application/json
Content-Encoding: gzip

… то он разжимает gzip, декодирует json и выводит в консоль результат декодирования json’а.

Еще из интересных сниферов есть urlsnarf, но в последних версиях Ubuntu он почему-то стал плохо работать. См также заметку Перехват сетевого трафика при помощи библиотеки libpcap.

2. Настройка VNC-сервера в Ubuntu

Проще всего включить Desktop Sharing, и подцепиться к машине любым VNC клиентом на :0. Но если кто-нибудь включить монитор, он сможет подглядывать за вашими действиями.

Чтобы этого не случилось, на сервере говорим:

sudo apt-get install tightvncserver gnome-session-fallback
echo "gnome-session --session=gnome-fallback" > ~/.xsession
vncserver -geometry 1278x780 -depth 16

На клиенте:

sudo apt-get install xtightvncviewer
vncviewer 192.168.0.100:1

Вообще-то, у вас, скорее всего, предустановленна remmina, но, как по мне, какая-то она глюкавая.

Вы можете столкнуться с забавным багом. При нажатии кнопки D у вас свернутся все окна. Лечится переходом в System Tools → System Settings → Keyboard → Shortcuts → Navigation и вешанием на Hide all normal windows какого-нибудь бесполезного сочетания, скажем, Ctr+Alt+Esc. Аналогичная фигня со стрелочками вверх и вниз. Похоже, это касается всех сочетаний, в которых используется кнопка Super.

Для остановки VNC на сервере говорим:

vncserver -kill :1

Чтобы запустить vncviewer в полноэкранном режиме, используйте флаг -fullscreen. С помощью клавиши F8 можно работать с буфером обмена и выйти из vncviewer.

3. Как сконвертировать онлайн-книгу в PDF

Для решения этой проблемы есть такая замечательная программа wkhtmltopdf. Убунтовский пакет не умеет работать с несколькими входными HTML-файлами, поэтому качаем бинарник для Linux отсюда.

Вот так собирается PDF из набора html-файлов:

wkhtmltopdf ./html/{1,2,3}.html result.pdf

Также wkhtmltopdf умеет работать с URL, но качает при этом он как-то фигово, поэтому лучше заранее сохранить все на диске. В этом случае вы также сможете поправить HTML-код, если PDF получится кривой.

Программа имеет множество флагов, см wkhtmltopdf -H.

4. Связка из vim и rsync

Если вам нужно собирать код на сервере, удобно редактировать его прямо на этом сервере. Обычно в таких случаях ходят на сервер по ssh и редактируют код в прекрасном текстовом редакторе vim. Но как только интернет начинает по каким-то причинам подтупливать, писать код становится невозможно.

Поэтому в последнее время я редактирую код локально, а на сервер заливаю его таким скриптом:

#!/bin/sh

rsync -e ssh --progress \
  --exclude 'deps/*/.git' \
  --exclude '*.swp' \
  --exclude 'tags' \
  -zutr /home/eax/project eax@eax.dev.example.com:

В результате решилась не только проблема с сетью. Теперь мне не нужно синхронизировать .zshrc или подправленные мной шаблоны behaviour’ов для vimerl. Все лежит локально, в одном месте. Удобно.

5. Как доказать провайдеру, что он теряет пакеты

Чтобы слать провайдера дэфолтным маршрутом с его предложениями попробовать купить другой роутер, используйте утилиту mtr:

eax@portege> sudo mtr -r -c 1000 -i 0.1 -n mail.ru
HOST: portege             Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 10.0.0.1           0.0%  1000    3.1  13.2   1.0 816.6  54.3
  2.|-- 11.101.101.11      0.2%  1000    6.9  19.6   6.4 806.3  52.9
  3.|-- 12.112.211.21      0.3%  1000    7.3  20.9   3.8 889.2  59.3
  4.|-- 17.232.232.71      1.8%  1000    2.8  17.8   2.2 872.2  60.0
  5.|-- 94.132.231.49      0.2%  1000    3.0  16.8   2.5 855.4  57.7
  6.|-- 217.69.139.199     0.3%  1000    3.1  15.8   2.4 838.5  58.9

Сразу видно, где и какой процент пакетов теряется.

6. Как прикрутить к своему блогу «Twitter-комментарии»

Можно добавить в конце постов такую ссылку:

https://twitter.com/intent/tweet
  ?screen_name=afiskon
  &text=%D1%82%D0%B5%D0%BA%D1%81%D1%82
  &url=http://eax.me/mini-notes-issue-14/

Пригодится, если вы используете OctoPress и не перевариваете Disqus.

7. Куча подозрительного UDP-трафика на 224.0.0.251:5353

Если iptraf в Ubuntu показывает кучу странного UDP-трафика на 224.0.0.251:5353, говорим:

sudo service avahi-daemon stop
sudo update-rc.d -f avahi-daemon remove

… и проблема уйдет.

8. Определяем версию проекта по числу коммитов

Чтобы отличить версию вашего проекта 2.14.1, собранную вчера, от версии 2.14.1, собранную сегодня, можно добавить к версии число коммитов:

$ git describe --always --tags | sed -e "s/-[^-]*$//;s/-/./"
2.14.1.187

Если вы пользуетесь Jenkins, не забудьте отключить в свойствах проекта проставление тэгов!

9. Как создать копию схемы в PostgreSQL

В отличие от MySQL в PostgreSQL есть схемы. Допустим, есть база данных, в которую ходит много пользователей, каждый из которых работает со своей схемой. Таблицы при этом у всех пользователей одинаковые. Чтобы завести еще одного пользователя с его собственной схемой, приходится немного извратиться. Один из способов решить проблему следующий.

Делаем бэкап существующей схемы:

pg_dump -h postgres.example.com -U user1 -n user1 -f dump1.sql dbname

Говорим:

sudo -u postgres psql

… и заводим нового пользователя:

CREATE USER user2 WITH password 'qwerty';
GRANT ALL privileges ON DATABASE dbname TO user2;

Заменяем имя схемы в дампе:

sed s/user1/user2/g dump1.sql > dump2.sql

Вообще-то, на этом шаге можно испортить данные. Надеюсь, вы используете достаточно длинные имена пользователей и названия схем, чтобы этого не случилось. Или что для вас это не критично.

Далее:

psql -h postgres.example.com dbname user2 -f dump2.sql

Если не использовать флаг -f, psql будет ругаться на использование в дампе \N вместо NULL.

Еще один способ описан здесь.

10. Как собрать PDF-версию Learn You a Haskell for Great Good

Как оказалось, все довольно просто:

sudo apt-get install pandoc texlive-full
git clone git@github.com:pvorb/learn-you-a-haskell.git
cd learn-you-a-haskell
sh pdf-en.sh
evince learn-you-a-haskell-en.pdf

Правда, texlive-full — довольно тяжелый пакет.

Дополнение: Мини заметки — выпуск 15

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.