====== Общее ======
===== Дата/Время =====
Текущая дата/время **$ date**
**Сменить часовой пояс**: необходимо создать символическую ссылку нужного файла (**/usr/share/zoneinfo**)- **/etc/localtime**\\
:!: Это сменить только **локальное время**, сам часовой пояс хранится в **etc/timezone**, он не сменился и **в системных логах** по прежнему был другой пояс, отредактировал этот текстовый файл и все стало норм!
# ln -sf /usr/share/zoneinfo/Asia/Omsk /etc/localtime
**Синхронизация времени**\\
NTP (Network Time Protocol), популярная утилита **chrony** это его реализация\\
* **chronyc** — интерфейс командной строки для хрони
* **chronyd** — демон, который можно запустить во время загрузки
* **tracking / sources** - аргументы cmd
===== Host =====
# Сменить имя хоста (но нужен ребут видимо)
"NewName" >> /etc/hostname && "NewName" >> /etc/hosts (тут надо заменить старое имя)
# Либо так, тут вроде без ребута применяется
hostnamectl set-hostname "NewName"
===== Копирование =====
==== rsync ====
[[https://www.opennet.ru/man.shtml?topic=rsyncd.conf&category=5&russian=0|Развернутая дока]]
rsync ключи исходный_каталог пользователь@хост:/каталог_назначения
Синхронизирует указанные каталоги.
* **-a, –archive** - позволяет выполнять рекурсивную синхронизацию, сохраняет символические ссылки, специальные файлы и файлы устройств, время модификации, группу, владельца и права
* **-z, –compress** - сжимает все передаваемые данные файлов
* **-P, -progress** - показать % выполнения во время передачи
* **-R, --relative** - использовать относительные пути (чтобы сохранялся путь расположения)
* **–delete (..-before, ..-after)** - удалять файлы, которых нет на передающей стороне
**Синхронизация указанного каталога**
# rsync -azP source destination (user@host:destination)
:!: **Пропускать каталоги**, скопировать только файлы
таким же фокусом можно регулировать глубину вложенности рекурсивного копирования, типа "/*/*/" level 2 или что то вроде того..\\
rsync --exclude='*/' source/ destination/
:!: Запуск в несколько потоков
* find -type d выводит имена всех директорий.
* xargs -I '{}' xargs запускает для каждого файла команду rsync. Ключ -P 5 утилиты xargs задает количество одновременно запущенных команд (потоков rsync), то есть одновременно будут запущена передача 5-ти файлов. Каждый файл передается отдельно.
find -type d | xargs -I '{}' -P 5 -n1 rsync -a --delete /home/old/Foto/'{}'/ /home/old/CloudDisk/'{}'/
:!: Постоянная синхронизация каталогов
[[https://www.dmosk.ru/instruktions.php?object=rsync-server|Источник]]
Для CentOS ставим и запускаем **rsync-daemon**\\
Концепция:
* на источнике определяем директории доступные для синхронизации, с набором параметров для каждой
* пользователь здесь **условный**, в рамках rsync'a, можно не указывать, будет анонимус
* на приемнике делаем скрипт для единичной синхронизации, запускаем его по расписанию
Клиент (источник):\\
# /etc/rsyncd.conf
max connections = 10
exclude = lost+found/
dont compress = *.gz *.tgz *.zip
# use chroot = false - ???
[service1]
path = /home/dn/outfolder/
comment = My service 1
read only = yes
list = yes
auth users = synuser
secrets file = /etc/rsyncd.scrt (формат простой- логин:пароль)
hosts allow = 192.168.0.100
hosts deny = *
Сервер (приемник):
#!/bin/bash
password_file='/etc/rsyncd.scrt'
user='synuser'
ip='192.168.0.101'
source='service1'
destination='/var/infolder/service1/'
rsync -a --delete-after --password-file=$password_file $user@$ip::$source $destination
В файле кредлов сохранен только пароль\\
* Возможны траблы с SELinux, его надо настроить либо отключить\\
* Права на файлы кредлов 600\\
==== scp ====
Передать файл по ssh можно либо перенаправив вывод:
# cat .ssh/name.pub ssh user@host "cat >> .ssh/authorized_keys"
Копирование **с удаленной машины**, команда **scp** (порядок файлов мб наоборот)
# scp [-P 22] user@host:source_file desc_file
Копирование **на удаленную машину**, команда **scp**
# scp [-P 22] source_file user@host:desc_file
Для копирования открытого ключа есть специальная утилита **ssh-copy-id**, она сама скопирует нужный файл в нужное место
# ssh-copu-id user@host
===== xarg =====
Выполнение команды для каждого элемента\\
Программа берет данные из стандартного ввода или из файла, разбивает их в соответствии с указанными параметрами, а затем передает другой программе в качестве аргумента\\
**[команда_генератор_списка] | xargs [опции_xargs] [команда]**
* **-I** - выполнить для каждого элемента, в кавычках указываем условное обозначение для найденных элементов (может быть любым)
* **-P (num)** - кол-во потоков для выполнения
* **-i** - для замены аргумента в нужном месте
:!: Примеры использования
# Аргументы передаются в конце команды
find. -name *.png -type f -print | xargs tar -cvzf images.tar.gz
# Так в указанное место (скобки похоже по умолчанию используются)
ls /etc/*.conf | xargs -i cp {} /home/likegeeks/Desktop/out
# Добавить строку (дату в данном случае) к каждому элементу вывода
ls / | xargs -I '{}' echo "$(date '+%Y-%m-%d') - {}"
tar -cvf $pathToBcps$nameArchive /etc/letsencrypt /var/www /etc/apache2 | xargs -I '{}' echo "$(date '+%Y-%m-%d_%H-%M') - {}" > /usr/zxbcps/bin/logs/lastBcps.log
# Переименование
ls | sed -e "p;s/.txt$/.sql/" | xargs -n2 fmv
# Смена прав доступа
find . -group root -print | xargs chown temp
# Удалить файлы старше 7 дней
find /tmp -type f -name '*' -mtime +7 -print0 | xargs -0 rm -f
# Можно заменить циклом, например это
find . -type f -and -iname "*.deb" | xargs -n 1 dpkg -I
# Эквивалентно
for file in `find . -type f -and -iname "*.deb"`; do dpkg -I "$file"; done
===== watch =====
Запуск указанной команды с периодами\\
* **-d** - выделять измененные данные
* **-n** - интервал в секундах
* **-t (--no-title)** -
* **-x (--exec)** - передать выполнение в sh -c
# Выполнение нескольких команд, 10 сек и показывать разницу
watch -n10 -d "ls -l; echo '<=======>' ls -l ../;"
===== Подстановка команд =====
Подстановка команд в скрипте может быть в **конструкции- $()**, в КИ можно использовать **кавычки- ``**\\
В последнем случае, символы перевода строки будут удалены, что бы этого избежать, нужно заключить команду в двойные кавычки\\
$ "`ls -l /dir`"
===== Приостановить/Возобновить процесс =====
Системные вызовы **SIGSTOP и SIGCONT**
kill -s STOP 16102
kill -s CONT 16102
===== Сбор инфы из ОС =====
:!: Инфа разбита по блокам, результат в Json
#!/bin/bash
#
# Скрипт для сбора и вывода информации с хоста, используется в zabbix, UserParameters
# Информация разбита на смысловые блоки, блоки на кейсы в свитче,
# название нужного блока передается первым аргументом при запуске скрипта
# каждый блок соответствует zabbix-ключу, соответствие задано уже в конфиге заббикс агента,
# типа- "UserParameter=mykeys.host,/var/tmp/get-info.sh host" - ключ для получения имени хоста
#
case $1 in
'host') # Имя хоста
echo '[{"Имя хоста": "' `hostname` '"}]';;
'os') # ОС, дистрибутив и версия ядра
# Первый вариант лучше, но у Debian его нет, поэтому есть второй
distrib=`cat /etc/system-release 2>/dev/null`
if [[ -z $distrib ]]; then
distrib=`cat /etc/os-release | grep -Po "PRETTY_NAME=\K.*" | sed -e s/\"//g`
fi
printf '[{"Дистрибутив": "%s", "Версия ядра": "%s"}]\n' "$distrib" `uname -r`;;
'cpu') # ЦП
echo '[{"Модель":"'`lscpu | grep -Po '^Model name:\x20*\K.*'`'' x''`lscpu | grep -Po '^CPU\(s\):\x20*\K.*'`'"}]';;
'mem') # ОЗУ, объем в гб
echo '[{"Объем": "' `free -th | grep 'Total:' | awk '{print $2}'` '"}]';;
'devnet') # Сетевые уст-ва
# Массив доступных интерфейсов, только имена
devs=( $(ip -br l | grep -vE '^lo|^docker0' | awk '{print $1}') )
result='[ '
# Проходим перечень интерфейсов, собираем инфу по каждому
for dev in ${devs[@]}; do
status=`ip -br a show $dev 2>/dev/null | awk '{print $2}'`
# Встречаются какие то абстрактные интерфейсы, по ним нет никакой инфы, такие пропускаем
if [[ -z $status || $status == 'DOWN' ]]; then
continue
fi
speed=`cat /sys/class/net/$dev/speed 2>/dev/null`
duplex=`cat /sys/class/net/$dev/duplex 2>/dev/null`
ips=`ip -br a show $dev 2>/dev/null | grep -Eo '([0-9]{0,3}\.){3}[0-9]{0,3}/([0-9]{0,3})' 2>/dev/null`
label=`cat /sys/class/net/$dev/device/label 2>dev/null`
result+='{"Наименование": "'$dev'", "Модель": "'$label'", "Скорость": "'$speed'", "Поддержка duplex": "'$duplex'", "Статус": "'$status'", "IP-адреса": "'$ips'"},'
done
echo ${result::-1}']';;
'devstor') # Устройства хранения, со своими разделами
res="`lsblk -Jo MODEL,SERIAL,SIZE,TYPE,TRAN | grep -E '"type":"disk"|"type": "disk"' | sed s/'model'/'Модель'/g | sed s/'serial'/'Серийный номер'/g | sed s/'size'/'Размер'/g | sed s/'tran'/'Тип'/g | sed -e s/'"type":"disk"\,'//g$
echo '['${res::-1}']';;
'location') # Расположение, исходя из IP адреса
var=`curl -s ipinfo.io | grep -E 'country|region|city' | sed s/'city'/'Город'/g | sed s/'region'/'Регион'/g | sed s/'country'/'Страна'/g`
echo '[{'${var::-1}'}]'
esac
===== Oчистить кэш файловой системы в Linux ядре =====
# Чистим pagecache:
echo 1 > /proc/sys/vm/drop_caches
# Чистим dentrie и inode кэши:
echo 2 > /proc/sys/vm/drop_caches
# Чистим pagecache, dentrie и inode кэши:
echo 3 > /proc/sys/vm/drop_caches
===== Разное =====
:!: Распаковать RPM без установки
apt install rpm2cpio
rpm2cpio myFile.rpm | cpio -idmv
Thread dump java\\
Тред дамп джава
jstack -l 11568 > output_thread_dump.txt
# Для процессов запущенных из под daemon
sudo -u daemon jstack -l 3346175 > output_thread_dump.txt
# Просмотр инфы процесса
cat /proc/1588434/environ
Завершить сеанс пользователя\\
Сначала посмотреть его оболочку, найти процессы этой оболочки и грохнуть, все или основной\\
w
ps -ft pts/0 -t pts/2
kill -9 11111 2222
===== Сеть =====
:!: Замер скорости
Утилита **iperf3**, кроссплатформенная, замер пропускной способности\\
# Винда
https://iperf.fr/iperf-download.php\\
# Linux
sudo dnf install iperf3
# прослушивание сервером
iperf3 -s
# Запуск клиента
iperf3 -c host-ip