====== Общее ====== ===== Дата/Время ===== Текущая дата/время **$ 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