Как снифить протокол приложения или пользователя

Ядро Linux начиная с версии 2.6.14 предоставлет возможность перехватывать пакеты из userspace которые затем можно записывать используя фильтр пакетов ядра.

В таблицу INPUT iptables в самом верху добавить правило

-A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30

В таблицу OUTPUT в самом верху добавить

-A OUTPUT -m owner --uid-owner 1006 -j CONNMARK --set-mark 1
-A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30

А затем запустить dumpcap чтобы он сохранил в файл протокол обмена

# dumpcap -i nflog:30 -w uid-1006.pcap

И сам файл потом открыть при помощи WireShark.
Источник

Как избавиться от диакритики

Один из моих bash скриптов обрабатывающих входящие счета от чешской компании вдруг сломался. Оказалось, что тот кто фомирует счета допустил ошибку в шаблоне и одна из букв перестала быть с диакритикой. Чтобы впредь из-за такой мелочи не ломался скрипт я решил избавить входящий документ от диакритики полностью. Можно было использовать recode но зачем если sed справляется с транслитерацией не менее быстро, а главное что он имеется в любой *nix системе.

echo "Daňový portál" | sed 'y/áéíóúýčďěňřšťžůÁÉÍÓÚÝČĎĚŇŘŠŤŽŮ/aeiouycdenrstzuAEIOUYCDENRSTZU/'
Danovy portal

Как узнать путь откуда запущен bash скрипт

BASEDIR=$(readlink -e "$0")
if [ $? -ne 0 ] ; then
  echo -e "Script path get error."
  exit 1
fi
BASEDIR="${BASEDIR%/*}"
echo "${BASEDIR}" 
exit 0

В дополнение к команде readlink есть ещё realpath и realname которые вернут полный путь и имя переданного им файла. Разумеется файл должен существовать.

Но внимание! Приведённые выше команды вернут путь на сам файл даже если скрипт запустили через симлинк (symlink). Например может понадобиться чтобы скрипт мог что либо записать в папку из которой был запущен даже через симлинк. Чтобы этого добиться необходимо поступить например вот так:

SAVEDIR=`pwd`
BASEDIR=`cd "$(dirname "$0")" && pwd`
cd "${SAVEDIR}"
echo -e "${BASEDIR}"
exit 0

Как продлить жизнь Skype 4.2.0.13

Меня, как и многих невольных пользователей текущие владельцы Skype поставили перед выбором: либо обновление, либо иди нахрен. Я посмотрел на свой довольно большой список контактов в котором находится много клиентов и скрепя сердцем выбрал первое — update. Внимательно осмотрел инсталяционый скрипт внутри rpm пакета и не найдя там ничего крамольного установил скайп 4.3.0.37. Оказалось, что новая версия не может загрузиться со старым профилем. Просто вываливается сразу после соединения. Я “пошаманил” с базами попробовал в новый профиль записать старые базы, но не помогло. (Обновлено. Решение было найдено). Это подсадило меня на коня. Масло в огонь подлило и то что они сломали интерфейс взаимодействия с внешними скриптами. Мои отлаженные скрипты перестали работать потому, что им передаются пустые параметры. Ну и чтобы окончательно вынудить людей искать альтернативу скайпу они прекратили поддержку звуковой подсистемы ALSA отдав предпочтение исключительно PulseAudio. Сначала сломали API для сторонних приложений, а теперь ещё и это.

Continue reading Как продлить жизнь Skype 4.2.0.13

Используем fetchmail для автоматизации разбора почты.

Потребовалось мне принимать емейлы фильтровать их по определённым критериям и обрабатывать скриптами (отделять вложения, выполнять действия над вложениями). С такой задачей мог бы справиться плагин FiltaQuilla для Thunderbird. Однако плагин некорректно работает с моим Thunderbird версии 30 для Linux. Если он выполняется автоматически то сохраняет пустое вложение, хотя при ручном выполнении всё делает корректно. Автор упорно молчит, а править чужой плагин у меня небыло времени.

Итак мне было нужно:

  • периодически проверять наличие писем в специальном почтовом ящике;
  • стягивать их в раздельные файлы;
  • сохранять все вложения из каждого письма;
  • анализировать заголовки и тексты писем;
  • запускать скрипты по манипуляции с текстами писем и вложениями.

Continue reading Используем fetchmail для автоматизации разбора почты.

Скрипт удаления старых томов для bacula

Я уже писал о том как вручную удалять старые тома из базы и с диска. Казалось что это однократная операция. Однако пришлось делать это во второй раз. Попутно выявилась проблема с приоритетом команды restore. Диск с бэкапами заполнился, задания застряли в очереди и команда restore создала задание которое послушно встало в хвост очереди. Приоритеты очереди работают только в том случае если очередь движется. Bacula не приостанавливает ткущее задание чтобы выполнить задание с более высоким приоритетом. А оно стоит в очереди и не может выполниться изза нехватки места на диске. Гугл не смог найти ответ как же запустить рестор вне очереди. Пришлось очистить очередь, при помощи команды cancel в bconsole после чего отработал рестор.

Это всё отступления, вернёмся-же к автоматизации:
Continue reading Скрипт удаления старых томов для bacula

Оператор цикла for в bash

Великая магия оператора for о которую приходится биться каждый раз пока не усвоишь урок, кроется в том что он рубит входные данные по символам разделителям которые перечислены в переменной IFS=

Не менее странным является и то, что этой переменной невозможно присвоить один байт-символ CR (возврат каретки) 0xA.
Никакие танцы с бубнами и операторы echo не дают этой возможности.
Два символа можно

IFS=$(echo -en "\n\b") # работает
echo -en "$IFS" | hexdump -C
00000000  0a 08                                             |..|
00000002

но один или много \n — не получается.

IFS=$(echo -en "\n\n\n\n\n") # не работает. Переменная будет пустой.
echo -en "$IFS" | hexdump -C # да говорю же следующая строка будет пустой

IFS=$(echo -en "A" | tr 'A' '\n') # не пойдёт!
IFS="\
\
" # тоже не будет работать

Continue reading Оператор цикла for в bash

ssh внутри while цикла который получает данные из stdin

Наткнулся я на то что скрипт запущенный локально — работает, а если его запустить на удалённой машине он вываливается из цикла while

#!/bin/bash

  SERVERS="10.10.1.6\n10.15.4.240"

  echo -e "${SERVERS}" | while read SERVER ; do
    echo -e "${SERVER}"
    ssh root@${SERVER} "uptime"
  done

Как оказалось проблема в том что ssh съедает stdin в первой итерации цикла.
Для меня это было неожиданно, однако лечится либо опцией -n либо перенаправлением stdin на < /dev/null .

#!/bin/bash

  SERVERS="10.10.1.6\n10.15.4.240"

  echo -e "${SERVERS}" | while read SERVER ; do
    echo -e "${SERVER}"
    ssh -n root@${SERVER} "uptime"
    ssh root@${SERVER} "uptime" < /dev/null
  done

Возврат к доброму iptables вместо firewalld

В последних версиях Fedora (19) вместо iptables по умолчанию используется динамический фаервол firewalld. Чтобы вернуть всё как было нужно остановить и запретить автозапуск firewalld.

# systemctl disable firewalld 
# systemctl stop firewalld

Затем нужно установить iptables-services (если он не установлен):

# yum install iptables-services

Потом запустить сервис iptables

# touch /etc/sysconfig/iptables
# systemctl start iptables
# systemctl enable iptables

И если используете IPv6

# touch /etc/sysconfig/ip6tables
# systemctl start ip6tables
# systemctl enable ip6tables

И наконец как обычно настраивайте файлы конфигурации /etc/sysconfig/iptables и /etc/sysconfig/ip6tables.

Fast HDD Eraser – Быстрое стирание дисков

Мне часто приходится затирать жёсткие диски пачками, например при модернизации стораджей, и мне был очень необходим скоростной источник потока данных которыми затирается целевой диск. Чтобы более менее надёжно затереть данные на диске неразрушив сам диск, недостаточно затереть его нулями из /dev/zero. В тоже время поток данных из /dev/urandom слишком медленный чтобы быстро затирать современные жёсткие диски.
Поскольку необходимый мне уровень стирания не претендовал на уровень военной разведки то я решил выкрутиться через большой массив случайных (псевдослучайных) чисел. А чтобы массив этот быстро работал я решил закинуть его в память. И /dev/shm – идеальное место.
Для стирания я использовал raid контроллер чтобы затирать сразу множество дисков. А для автоматизации процесса написал bash-скрипт. Скрипт имеет свой счётчик продвижения и его можно прервать Ctrl+C и затем продожить с той позиции где он был прерван.
Continue reading Fast HDD Eraser – Быстрое стирание дисков