суббота, 9 октября 2021 г.

Навигация по документу в vim

    Заезженная тема, но достойная отдельного рассмотрения. Рассмотрим команды перемещения по открытому документу в редакторе vim в нормальном режиме (есть еще режим редактирования, визуальный режим и режим ввода команд после двоеточия). Команды интуитивно сгруппированы в отдельные таблицы и параграфы.
 

аналогия "обычных" клавиш "стрелка вверх" и "стрелка вниз" курсор относительно текста не двигается, текст смещается на одну строку курсор относительно текста не двигается, текст смещается на полэкрана текст смещается на полный экран
вверх Ctrl-p
Ctrl-y Ctrl-u
Ctrl-b
вниз Ctrl-n Ctrl-e Ctrl-d
Ctrl-f

 Ctrl-y и Ctrl-e полезно запомнить, так как эти комбинации имеют полезную функциональность в режиме редактирования: копируют букву в текущей позиции в верхнюю или нижнюю строку соответственно.

текст не перемещаетсяотносительно окна, двигается только курсор
 текст перемещается относительно окна, курсор привязан к позиции в тексте
влево h

вниз j, на дно экрана L
вниз экрана zb
вверх k, вверх экрана H
вверх экрана zt
вправо l

в середину экрана M
в середину экрана zz z.

 

"Глобальные" перемещения:

gg идем в начало;
G
идем в самый конец;
50%
идем в середину всего документа (50% же);
:50
идем на 50-ю строку;

  ctrl-o, ctrl-i перемещаемся вперед-назад по сохраненной истории координат курсора. Не все положения курсора сохраняються в этой истории. Сохраняються координаты, в которые мы попадали в результате перемещения, которое классифицируется как "прыжок". Список сохраненных прыжков можно увидеть командой :jumps. Очень полезная фишка. Вам не нужно бегать по файловому менеджеру в поисках файла, который вы уже когда-то редактировали. Просто войдите в vim в нормальном режиме и понажимайте  ctrl-o, ctrl-i.

Строчные перемещения:

0
переходим в самое начало строки;
^
переходим в на первый непробельный символ строки;
$
переходим в самый конец строки;
-
переходим на начало строки ввех;
+
переходим на начало строки вниз;

Пословные перемещения:

w
переход к началу следующего слова;
W
переход к началу следущего слова;
e
переход к следующему концу слова;
E
переход к следующему концу слова;
b
переход к началу предыдущего слова;
B
переход к началу предыдущего слова;
tx, fx
переход к следующей букве х;
Tх, Fх
переход к предыдущей букве х;
;
повторить предыдущий tfTF-переход;

Ну а про эти команды мне даже как-то неудобно и говорить:
mx установить закладку х;
'x перейти к закладке х;
''
переходим к предыдущему месту, откуда делали последний переход к закладке;
:marks смотрим какие у нас закладки;

Учите клавиатуру. Воздастся. ))


среда, 5 мая 2021 г.

Конфигурирование связки SPF, DKIM, DMARC записей и sendmail на debian

    Что такое SPF, DKIM, DMARC объяснять не буду. Раз вы это читаете, то вы уже знаете, что это или хотя бы зачем. Тут просто расскажу как я это установил на debian buster c почтовым сервером sendmail. 

#apt install opendkim opendkim-tools

#vim /etc/opendkim.conf

Syslog                         yes
SyslogSuccess            Yes
LogWhy                      Yes
AutoRestart                Yes
AutoRestartRate        10/1h
UMask                        002
Canonicalization        relaxed/simple
Mode                          sv
Socket                        inet:8891@127.0.0.1
PidFile                       /var/run/opendkim/opendkim.pid
SignatureAlgorithm   rsa-sha256
UserID                       opendkim:opendkim
Domain                       my.domain.ua
Selector                      mymail

OversignHeaders       From
TrustAnchorFile         /usr/share/dns/root.key
ExternalIgnoreList     refile:/etc/opendkim/TrustedHosts
InternalHosts             refile:/etc/opendkim/TrustedHosts
KeyTable                     refile:/etc/opendkim/KeyTable

SigningTable               refile:/etc/opendkim/SigningTable

Обратите внимание на пять строчек, выделенных жирным шрифтом. Их понимание, на мое мнение, особенно важно для того, что мы хотим сделать.

вместо my.domain.ua подставим вывод команды  (на почовом сервере)

#hostname -d

вместо mymail подставим вывод команды (также на почтовике) 

#hostname 

Далее создаем директорию, где находится пара приватный-публичный ключи:

#mkdir -p /etc/opendkim/keys

И создаем собственно эти ключи:

#opendkim-genkey -D /etc/opendkim/keys -d my.domain.ua  -s mymail
#chown -R opendkim:opendkim /etc/opendkim/keys
#chmod 640 /etc/opendkim/keys/mymail.private
#chmod 644 /etc/opendkim/keys/mymail.txt

mymail.private - здесь хранится приватный ключ, доступ к которому имеет только почтовый демон (в нашем случае - сендмейл).
mymail.txt - здесь хранится публичный ключ, который мы впишем в файл зоны днс.
    Далее создаем и редактируем три таких файла:

#vim /etc/opendkim/KeyTable

mymail._domainkey.my.domain.ua my.domain.ua:mymail:/etc/opendkim/keys/mymail.private
Здесь мы говорим мы говорим мильтеру opendkim, а значит сендмейлу, где находится приватный ключ.

#vim /etc/opendkim/SigningTable

*@my.domain.ua mymail._domainkey.my.domain.ua
Здесь мы говорим какие почтовые адреса соответствуют dkim-записи в днс.

#vim /etc/opendkim/TrustedHosts

127.0.0.1
localhost
my.domain.ua
Тут имя файла говорит само за себя.
 
    Рестартуем опендким и смотрим, слушает ли он порт, что мы прописали в конфиге выше:
#systemctl restart opendkim
#netstat -nlp | grep 8891
tcp        0      0 127.0.0.1:8891          0.0.0.0:*               LISTEN      23116/opendkim

    Расскажем сендмейлу, что у него появился новый мильтер (о мильтере можно думать как о некоем плагине, который подсоединяется к главному процессу сендмейла с помощью специального API - milter API). Редактируем текстовый конфиг сендмейла:
#vim /etc/mail/sendmail.mc
...

INPUT_MAIL_FILTER(`milter1', `...')dnl
INPUT_MAIL_FILTER(`milter2', `...')dnl
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@127.0.0.1')dnl
define(`confINPUT_MAIL_FILTERS',`opendkim,milter1,milter2')dnl
...

milter1 и milter2 вписаны для примера. Их может и не быть или может быть больше двух. У меня, например, к сендмейлу подсоединены два мильтера кламава и спамассассина. Третий стало быть опендким. Обратите внимание на `S=inet:8891@127.0.0.1' - эта запись должна совпадать с тем, что мы прописали в конфиге выше.

Выполняем

#sendmailconfig
#systemctl restart sendmail 

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

$ORIGIN         my.domain.ua.
@                     IN SOA  mydns.my.domain.ua. hostm.my.domain.ua. ( ... )
                        IN      NS      mydns.my.domain.ua.
                        IN      MX      10 mymail.my.domain.ua.
@                     IN      TXT     "v=spf1 +mx +a ip4:11.11.11.11 -all"
mymail._domainkey        IN    TXT    "v=DKIM1\; h=sha256\; k=rsa\; p=""xxxx""xxxx""xxxx""xxxx" 
_adsp._domainkey        IN    TXT    "dkim=all"
_dmarc                        IN    TXT    "v=DMARC1\; p=reject\; rua=mailto:hostm@my.domain.ua"

    11.11.11.11 - айпишник нашего почтовика. Строка

mymail._domainkey        IN      TXT     "v=DKIM1\; h=sha256\; k=rsa\; p=""xxxx""xxxx""xxxx""xxxx"

полностью соответствует содержимому файла mymail.txt, что мы создали ранее. ххххххх - так обозначены цифры ключа. Есть пара нюансов. Точки с запятой в файле днс соответствуют началу комментариев. Поэтому мы их экранируем слэшем. Также, строки в файле зоны днс не могут быть длиннее кажется 256 символов, что меньше, чем длина нашей строки (строка, что начинается из v= ), из-за чего эту длинную строку надо разбить несколькими вставками "" - они обозначены синим цветом. Также длинные строки можно заключать в круглые скобки, но у меня почему-то это не работало.

    Строка с v=spf1 и есть spf запись. Строка с v=DKIM1 и есть dkim запись. Строка с v=DMARC1 и есть dmarc запись. Две строки, начинающиеся с _adsp и _dmarc просят всех не принимать письма без DKIM-подписи нашего домена. Собственно для этого все это и затевалось.

    Теперь при отсылке почты в логах почтовика появяться соответствующие строки:

# journalctl -u opendkim

DKIM-Signature field added (s=mymail, d=my.domain.ua)

    Также в служебной информации писем появяться DKIM-подписи вашего домена.

    Я б рекомендовал бы вот эту ссылку , которая была основой данного изложения, но надеюсь, здесь все написано достаточно точно.

воскресенье, 17 января 2021 г.

Sendmail: анализ логов

    Отчаявшись найти хотя б даже и неинтуитивный анализатор логов почтового сервера на Sendmail и Dovecot, пришлось осилить несколько строк командной оболочки. Дело было в Дебиан.

#journalctl --since yesterday -u sendmail|grep ctladdr|grep Sent|awk -F: '{print $5}'|grep -Po 'ctladdr=<\K[^>]*' 

Это смотрим отправщиков писем.

#ls -al /var/mail/|awk '{printf("%-20s%s\n", $3,$5)}'

Это анализируем почтовые ящики.

#journalctl -u dovecot|grep pop3-login|egrep -v Disconnected|awk -F, '{print $1}'|awk -v RS='<' -v FS='>' 'NR>1{print $1}'

Это анализируем читателей писем.


sort|uniq -c|sort -nk1 такое добавляем в конец пайпа для сортировки вывода по числам в первом столбце.

awk '{sum+=$2} END {print $2}' такого типа команду добавляем в конец пайпа, чтоб просуммировать числа во втором столбце.

Ну и напоследок формат по умолчанию записи в журнал сендмейлом в случае если отсылка мыла произошла успешно (схематично):

Date Time MyServerName sm-mta[x]: 10HF0kYP020730: from=<g@g.org>, size=x, class=0, nrcpts=1, msgid=<xxx>, proto=ESMTPSA, daemon=MTA, relay=server.domen [x.x.x.x]
Date Time MeServerName sm-mta[x]: 10HF0kYP020730: to=<g2@g2.org>, ctladdr=<g@g.org> (1254/1498), delay=00:00:02, xdelay=00:00:02, mailer=esmtp, pri=120563, relay=x.net. [x.x.x.x], dsn=2.0.0, stat=Sent (ok dirdel)



 

 

четверг, 31 декабря 2020 г.

git: обобщенная схема команд

 

Наиболее частые команды:

git init
git add .
git rm file.txt
git rm --cached file.txt
git mv old_name new_name
git rm \*~

git config --global user.email "your@mail.address.org"
git config --global user.name "you_name"
git config --global --add https.proxy https://10.10.0.1:3128
git config --list
git config --global --unset http.proxy
git config --list | grep proxy

git commit -m "some comment"
git commit -am "commit with all changed files"
git remote add master  https://your_name@bitbucket.org/_/repository_name.git
git remote -v //To list the existing remotes
git push -f master master
git remote rm master

git status //делайте почаще эти команды
git status -s
git log

git reset --hard <hash>
git reset --hard origin/master

git branch
git checkout -b newbranch
git checkout newbranch
git merge newbranch (делать, если находимся на ветке master)

git diff
git diff --staged

воскресенье, 13 декабря 2020 г.

Основные команды для работы с пакетами в Debian

  • dpkg -i пакет.deb проинсаллировать пакет
  • dpkg -r пакет (без расширения  deb) удалить пакет, исключая файлы конфигурации
  • dpkg -P пакет (без расширения  deb)полностью удалить пакет
  • dpkg -l список всех проинсталлированных пакетов
  • dpkg -l пакет (без расширения  deb) вывод короткой информации про отдельный пакет
  • dpkg -L (без расширения  deb) вывод всех файлов проинсталлированных из данного пакета
  • dpkg -c пакет.deb список файлов в еще непроинсталлированном пакете
  • dpkg -S /path/to/file показывает какому пакету принадлежит файл
  • dpkg -p пакет (без расширения  deb) вывод детальной информации про отдельный пакет
  • dpkg -s пакет (без расширения  deb) проверяет, установлен ли пакет