Однострочник: получить дамп заголовков HTTP-трафика на первом ethernet-интерфейсе

Некоторые однострочники просто поражают своей лаконичностью, но могут быть не вполне функциональны.
Некоторые — написаны откровенно неэстетично и содержимое их вызывает блевотный рефлекс, но когда читать man'ы лениво — бегло сканируешь незамыленным глазом чей-то шедевр — и копируешь как есть, потому что… ну да, они «просто делают свою работу» (прямо как офисный планктон в Москве: просто делает что-то… как-то).
А есть однострочники, которые вроде и полезны весьма условно, но представляют интерес чисто академический: хочется разобрать их на винтики и понять, как же хиромантия сия устроена, что за магия заставляет вращаться чудесные шестерёнки Unix-way.
В качестве наглядного примера представляю на суд моих благодарных читателей (кстати, в последнее время я был безмерно счастлив отвечать на письма зело многочисленных поклонников моего скромного творчества) — вот этот многострочник, составленный из двух частей: одну легко найти на StackOverflow, а вторую приписал Ваш Покорный Слуга (здесь и далее — ВПС).

Вот:

sudo tcpdump -i $(ifconfig | sed -nr '/^[^[:space:]]/{ s%^([^[:space:]:]+).*$%\1%; h; b X}; /^\s*ether/{ g; p; q }; :X') -A -s 10240 'tcp port 3128 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'


Те истинные герои Совнгарда, которые первыми осознают и прочувствуют Суть работы механизмов радости в контексте представленного выше примера — да не сочтут они за труд отписаться в комментариях к посту, дабы подвиг их не канул в Лету.

Аминь!

P.S. Если вы низвергаетесь в грешный мир этих наших интернетов не через SQUID на дефолтном порту 3128, то замените циферки 3128 на что-то более другое. Спасибо!

Неувядающий SSH-туннель

  • Linux
Как известно, SSH-туннели смертны. Помирают они по самым разным, порой непредсказуемым причинам, так что все возможные казусы одним лишь рихтованием настроек SSH предусмотреть наперёд невозможно. Понятно, что так жить нельзя, и с этим разумеется, нужно было позавчера что-то делать :)
На счастье в *nix кроме монстроидальных ужасных by design вещей типа upstart или systemd есть ещё и маленькие надёжные программы, решающие свою узкую задачу просто, предсказуемо и прямолинейно, то есть в так называемом unix-way стиле. К числу таковых относится и так называемый супервизор RunIt. Почитать о нём подробно можно, например, на хабре, здесь же я приведу готовое решение проблемы рушащегося на головы туннеля:

sudo apt-get install runit
sudo mkdir /etc/sv/unbreak-tun
cat <<'EOF' | sudo tee /etc/sv/unbreak-tun/run
#!/bin/bash
exec 2>&1
chpst  -u gideon:gideon ssh -i /home/gideon/.ssh/unsecure.rsa -p 5714 -L 1234:localhost:4567 melpomena@remote.host
EOF
sudo chmod +x /etc/sv/unbreak-tun/run
sudo ln -s '../sv/unbreak-tun' /etc/service/

Собственно, вот и всё решение!
Поменяйте номера портов, имена хостов и логины пользователей на нужные перед копированием этого кода в консоль — и получите туннель который уж если работает, то убить его будет решительно невозможно. А вот штатным образом остановить службу — пожалуйста: sudo sv stop unbreak-tun.