Мини заметки – выпуск 14
Мини заметок не было целых два месяца. Я знаю, вы по ним соскучились! В этом выпуске: настраиваем 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