Некоторые картинки не загружаются из РФ и РК, используйте VPN.
Показаны сообщения с ярлыком *nix. Показать все сообщения
Показаны сообщения с ярлыком *nix. Показать все сообщения

среда, 8 мая 2024 г.

Sendmail двоеточие

При использовании sendmail и eocat может возникнуть проблема  с обработкой двоеточий в теле. Для обхода используйте пустую строку перед телом. Например сохранять тело письмо не так

echo "My text: this text" | tee file.txt

а в от так

echo -e "\nMy text: this text" | tee file.txt

или sed c cat

from=lte@domain.ru
to=it@domain.ru
( cat <<EOCAT
MIME-Version: 1.0
From: $from
To: $to
Subject: [ROOM][LTE][SMS]
Content-Type: text/plain
EOCAT
cat file.txt |sed -E '1 s/^(.*)$/\n\1/g' ) | /usr/sbin/sendmail -t

пятница, 23 февраля 2024 г.

Bash скрипт заметка

Заметка скрипт.

Интересный моменты в скрипте:

  1. Вызов функции из себя как вариант цикличности, а не рекурсии
  2. $EUID -ne 0
    Проверка на наличие root прав у текущего пользователя
  3. echo -e "[User]\nSystemAccount=true"> /var/lib/AccountsService/users/$AdminName
    Скрытие учетки в *nix-подобных системах (сервисный аккаунт)
  4. logname
    Получение имени залогинившегося пользователя, даже если он под sudo
  5. eval getent passwd {$UID_MIN..$UID_MAX} 
    eval - преобразует текст в команду
  6. getent passwd {1000..6000} | cut -d: -f1
    получение списка пользователей с UID между 1000-6000, все сервисные аккаунты имеют UID < 1000
  7. blkid -U "$(grep -vE "^#|^$" /etc/crypttab | tail -n1 | cut -d" " -f1 | cut -d"-" -f2-)"
    LUKS иногда создает устройство с именем равным LUKS-UUID_source_block_device, но вот получить именно адрес в виде /dev/sda3 не так просто
Задачи скрипта:
  1. Проверить наличие определенного пользователя
  2. Создать администратора, при его отсутствии
  3. Переименовать выбранного пользователя
  4. Сбросить ID Anydesk
  5. Изменить passphrase для шифрованного раздела
  6. Переименовать ПК
Для чего такое надо?, для клонирования подготовленной системы

четверг, 22 февраля 2024 г.

QEMU KVM Два монитора


Появилась интересная задачка - организация рабочего места на съемном носителе (ssd). Ну интересное тут другое, там используется виртуализация на базе QEMU. Установка и настройка производились на Hyper-V (виртуализация в виртуализации) на внешний ssd (проброшен в VM).

Установка QEMU выглядела так:

sudo apt-get install  --no-install-recommends qemu-system-ppc libvirt-daemon-system libvirt-clients virt-manager gir1.2-spiceclientgtk-3.0

Вот я сделал, а заказчик спрашивает, а как мне работать на двух мониторах?

Поясню, на носителе базовая операционная система, а в ней есть гипервизор QEMU KVM. Человек запускает виртуальную машину и работает через консоль. А у него два монитора и растянуть окно нельзя.

В поисках решений перепробовал много вариантов, в итоге решение нашлось.

четверг, 9 ноября 2023 г.

SAMBA Подключение аудита

Спустя два года я таки настроил на Ubuntu 14 с Samba 4.3.11 аудит действий с файлами.

Это оказалось не так просто, как описывалось во всех инструкциях:

  1. Нужно установить samba-vfs-modules, мне не понадобилось, но возможно
  2. В настройках rsyslog все по другому
  3. Priority не безграничен
  4. У syslog:adm должны быть права записи в каталог с логами. При этом оповещений нету, просто не создаются файлы логов
Я было хотел на каждую шару отдельный лог, но так просто сделать нельзя, поэтому решил  поделить шары по своей логике. В итоге у меня вышло 5 разных групп, вот для них я и покажу как делал.

среда, 24 мая 2023 г.

"/bin/bash^M: bad interpreter: No such file or directory"

 Данная ошибка связана с форматом переноса строк, лично у меня первый раз возникла, ибо я редко переношу свои скрипты на сервер файлом, чаще копипастом. Если формируете скрипт SH на Mikrotik, то получите такую же ошибку, так как он использует формат конца строк CR LF


пятница, 19 мая 2023 г.

Mikrotik SSH private key for authorization on other ssh services

Запускаем SSH Keygen и генерируем ключ по кнопке Generate, бешено дергаем мышкой, дабы  ускорить процесс (всякие настройки не трогаем).

Сохраняем публичную часть - через Save + конвертация:
Как видно из скриншота, это можно сделать ручками
Или сразу копируем из окна PuttyGEN:

Экспортируем закрытую часть в старом формате:

Я назвал файлы my.ppk и my.pub, перебрасываем наши файлы на Mikrotik и импортируем

Внимание!!!

Пользователь указывается тот, из под которого будет инициировано подключение ssh к удаленному ресурсу, также следует учесть пользователя под которым будет работать задание в шедуллере Mikrotik. После чего закидываем (простым копипастом содержимого my.pub, там должна быть одна строчка) открытую часть на сервер где требуется авторизация со стороны Mikrotik в файл /home/username/.ssh/authorized_keys (/root/.ssh/authorized_keys - для авторизации под рутом - оч плохая идея)

Собственно все, теперь можно авторизоваться под ssh ключами:

среда, 17 мая 2023 г.

Mailx,SendMail set sender address

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

Пояснение:

Почтовый сервер exchange, релей - postfix. Отчеты внутри сети передаются без проблем и на отправителя никто внимание не обращает. Но все письма пересылаются на GMAIL, где сортируются и раскидываются по категориям и я читаю их на завтрак.

Сегодня я не увидел самые важные отчеты на пя gmail, зато они были в аутлуке с рабочей почтой. Открыл postfix и нашел это:

our system has detected that this message is 550-5.7.1 likely unsolicited mail

Собственно гугл тонко намекает, что письмо отправлено с подозрительного адреса, и это действительно так, ибо адрес отправителя root@server.company.ru  подставляется автоматически. Можно конечно настроить сервер так, чтобы отправителем был легитимный адрес, но мне кажется это не целесообразным в сети, где и так есть свой почтовый сервер, поэтому в скрипте просто поправлю адрес отправителя:

Mail

user@server:~$ echo Not mount point | mail -s "[BACKUP] error" it@company.ru -r server@company.ru

Mailx

user@server:~$ echo Not mount point | mailx -s "[BACKUP] error" it@company.ru -r server@company.ru

Sendmail

user@server:~$ echo -e "Subject:[BACKUP] error\nnot mount point" | sendmail -f "server@company.ru" it@company.ru

или

user@server:~$ echo -e "Subject:[BACKUP] error \nFrom: server@company.ru \nTo: it@company.ru \n\n not mount point" | sendmail -t

Обращаем внимание на отсутствие пробелов в "\nFrom" и "\nTo", иначе будет ошибка "No recipient addresses found in header"

четверг, 9 февраля 2023 г.

Bash заметки по даты-время

Получить разницу дат в секундах

user@server:~$ old_time=$(date +%s)
user@server:~$ new_time=$(date +%s)
user@server:~$ echo $old_time $new_time
1675929074 1675929084
user@server:~$ date -d @${old_time}
Чт фев  9 10:51:14 MSK 2023
user@server:~$ date -d @${new_time}
Чт фев  9 10:51:24 MSK 2023
user@server:~$ let diff_date=$new_time-$old_time
user@server:~$ echo $diff_date
10

Если разница укладывается в 24 часа, то секунды можно перевести в удобочитаемый вид

user@server:~$  date -u -d @${diff_date} +"%T"
00:00:10

Стоит обратить внимание на параметр -u, который определяет что зона у нас UTC, иначе ответ будет считать плюс текущую зону, т.е. в мое случае +3 часа

user@server:~$ date -d @${diff_date} +"%T"
03:00:10

А вот разницу мы ранее считали без параметра -u, но можно и с.

Если же разница более суток и нужен красивый вывод, то можно представить в следующем варианте

user@server:~$ date -u -d @${diff_date} +"%j day %T"
001 day 00:00:10

Или просто в часах:

user@server:~$ diff_time=15654
user@server:~$ hours=$(echo "scale=0; $diff_time/3600" | bc);
user@server:~$ minute=$(echo "scale=0; ($diff_time-($hours*3600))/60" | bc); 
user@server:~$ sec=$(echo "$diff_time-($hours*3600)-($minute*60)" | bc);
user@server:~$ printf "%s:%0*d:%0*d\n" $hours 2 $minute 2 $sec
4:20:54

вторник, 7 февраля 2023 г.

Sendmail cat пустое тело или нет первой строки

 Переписывал скрипт, в нем использовался mail для отправки письма и все работало норм, решил переписать для sendmail, чтобы указывать отправителя и столкнулся со странной штукой - приходит пустое сообщение.


Не обращаем внимание на косяк с CURRENT_TIME_FORMATE

вторник, 24 января 2023 г.

Восстановление ACL

Переносил 4Тб данных при помощи rsync и не учел сложную структуру доступа, переносить по новой с правильными ключами - ждать еще 8 часов. Поэтому я выгрузил рекурсивно ACL:

root@server:~$ getfacl -R /archive_mount/archive > /home/user/archive2023.acl

и хотел загрузить вот так:

user@server:~$ sudo setfacl -R --set-file=archive2023.acl /archive/archive/

но, эта фигня зависла на всю ночь и никакого результата не дала, в итоге я нашел как именно восстановить ACL:

user@server:~$ sudo setfacl  --restore=/home/user/archive2023.acl | tee /home/user/report_acl.log

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

root@server:/home/user# getfacl -R /archive_mount/archive > /home/user/archive2023_2.acl
root@server:/home/user# tar -cf archive2023.tar archive2023*
root@server:/home/user# gzip archive2023.tar
root@arhive:/home/user# ll /home/user/
root@arhive:/home/user# ll archive2023_2*
-rw-rw-r-- 1 user user   392713145 Jan 24 10:58 archive2023_2.acl
-rw-r--r-- 1 user user   384913154 Jan 23 23:21 archive2023.acl
-rw-r--r-- 1 root root    29577829 Jan 24 11:01 archive2023.tar.gz

Можно было бы сравнить эти два файла прямо на сервере (cmp), но как видим из вывода выше - новый файл больше старого, т.е. они уже разные, поэтому я решил сравнить их при помощи Notepad++

Сравнивать не имеет смысла, т.к. при выгрузке использовались ID групп и пользователей, т.к. сервер, на котором проводилась операция, вне домена и не имеет этих пользователей, а вот новый файл был уже с буквенными обозначениями групп и имен пользователей.

понедельник, 23 января 2023 г.

Crontab использует временную зону отличную от системной

 Собрал сервер, поправил временную зону, добавил задания в cron, а они не выполняются с запозданием в 3 часа, т.е. во временной зоне +6. А для sa-stats.pl это критично, т.к. в кроне задание висит в 23.59, а выполняется оно в 02.59 О_О

Не помню, перезагружал я сервер или нет, но вот на что стоит обратить внимание:

user@server:~$ grep -i cron /var/log/syslog
Jan 23 12:48:14 postfix crontab[6204]: (user) BEGIN EDIT (user)
Jan 23 12:49:01 postfix crontab[6204]: (user) REPLACE (user)
Jan 23 12:49:01 postfix crontab[6204]: (user) END EDIT (user)
Jan 23 12:49:01 postfix cron[788]: (user) RELOAD (crontabs/user)
Jan 23 12:49:06 postfix crontab[6261]: (user) LIST (user)
Jan 23 12:49:14 postfix crontab[6262]: (user) BEGIN EDIT (user)
Jan 23 12:49:24 postfix crontab[6262]: (user) REPLACE (user)
user@server:~$ date
Mon Jan 23 17:49:40 MSK 2023

Добавление TZ=Europe/Moscow первой строчкой в cron с перезапуском службы не помогло

user@server:~$ sudo /etc/init.d/cron restart

А вот перезапуск syslog проблему решил. Проконтролировать можно просто запросив вывод задач и снова глянуть в лог:

user@postfix2:~# crontab -l | grep -v "#"
0 12 * * * /usr/bin/certbot renew --quiet
59 23 * * * /opt/postfix-report/postfix-report.sh
30 23 * * * /opt/postfix-backup/postfix-backup.sh
user@postfix2:~# grep -i cron /var/log/syslog  | tail -n 2
Jan 23 13:17:01 postfix2 CRON[11501]: (user) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan 23 13:57:06 postfix2 crontab[12561]: (user) LIST (user)
user@postfix2:~# date
Mon Jan 23 16:57:18 MSK 2023
user@postfix2:~# sudo service cron restart
user@postfix2:~# crontab -l | grep -v "#"
0 12 * * * /usr/bin/certbot renew --quiet
59 23 * * * /opt/postfix-report/postfix-report.sh
30 23 * * * /opt/postfix-backup/postfix-backup.sh
user@postfix2:~# grep -i cron /var/log/syslog  | tail -n 4
Jan 23 13:57:06 postfix2 crontab[12561]: (user) LIST (user)
Jan 23 13:57:28 postfix2 cron[12579]: (CRON) INFO (pidfile fd = 3)
Jan 23 13:57:28 postfix2 cron[12579]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
Jan 23 13:57:33 postfix2 crontab[12601]: (user) LIST (user)
user@postfix2:~# sudo service syslog restart
user@postfix2:~# crontab -l | grep -v "#"
0 12 * * * /usr/bin/certbot renew --quiet
59 23 * * * /opt/postfix-report/postfix-report.sh
30 23 * * * /opt/postfix-backup/postfix-backup.sh
user@postfix2:~# grep -i cron /var/log/syslog  | tail -n 6
Jan 23 13:17:01 postfix2 CRON[11501]: (user) CMD (   cd / && run-parts --report /etc/cron.hourly)
Jan 23 13:57:06 postfix2 crontab[12561]: (user) LIST (user)
Jan 23 13:57:28 postfix2 cron[12579]: (CRON) INFO (pidfile fd = 3)
Jan 23 13:57:28 postfix2 cron[12579]: (CRON) INFO (Skipping @reboot jobs -- not system startup)
Jan 23 13:57:33 postfix2 crontab[12601]: (user) LIST (user)
Jan 23 16:58:04 postfix2 crontab[12652]: (user) LIST (user)
user@postfix2:~# date
Mon Jan 23 16:58:12 MSK 2023

воскресенье, 22 января 2023 г.

sa-stats.pl Указать интервал времени

sa-stats.pl пример сутки:

user@server:~$ ./sa-stats.pl -s `date -d '-1 day'` -e `date` > file.txt

sa-stats.pl пример от текущего до полуночи в прошлое:

user@server:~$ ./sa-stats.pl  -s 'midnight' -e 'now' > file.txt

 

Ubuntu Вывод на экран и в разные файлы

 Задача банальна - перенести 4Тб с диска на одном сервере, на диск на другом. Вариантов решения куча, и один из них - rsync. Проблема только в одном - видеть что процесс идет, а если я вижу, то я  могу не увидеть чего то важного, например промелькнувшей ошибки. Поэтому надо осуществить вывод и на экран и в файл, в этом мне может помочь tee, но листать файл на несколько миллионов строк в поисках ошибок - такое себе, надо как-то вывести ошибки в отдельный файл, а вот и готовая строка:

user@server:~$ sudo rsync -avh --ignore-errors --delete root@vsv02:/archive_mount/* /archive/ > >(tee -a /home/user/rsync.log) 2> >(tee -a /home/user/rsync-error.log >&2)

Собственно у меня, после исправления ошибок на уровне доступа к файлам, ошибок 0

воскресенье, 15 января 2023 г.

Linux mount loop img read-only (ro)

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

user@postfix:~$ sudo mount -o ro,loop postfix.img /OLD_POSTFIX/

Ошибку "mount: /OLD_POSTFIX: cannot mount /dev/loop0 read-only. "

user@postfix:~$ sudo mount -o ro,norecovery,loop postfix.img /OLD_POSTFIX/

Если образ содержить несколько разделов, то нужно указать смещение

user@postfix:~$ sudo mount -o ro,norecovery,loop,offset=1048576 postfix.img /OLD_POSTFIX/

Также можно указать тип ФС

user@postfix:~$ sudo mount -o ro,norecovery,loop,offset=1048576  -t ext4 postfix.img /OLD_POSTFIX/

суббота, 14 января 2023 г.

Xen get version

Для Ubuntu (не забываем про xl/xm)

 user@xen2:~$ sudo xl info | grep -i ver
version                : #154-Ubuntu SMP Thu Jan 5 17:03:22 UTC 2023
xen_version            : 4.11.4-pre

А вот для RH

 more /etc/redhat-release