Linux
Базовая теория, синтаксис Bash, а также заметки и примеры по командам для настройки и управления 🐧 Linux.
Linux
Структура каталогов
/homeи/root- домашние директории пользователей./binиsbin- бинарные файлы (/bin/lsили/bin/bash, в современных системах это часто ссылки на/usr/bin)./procи/sys- виртуальные файловые системы (например, данные о процессоре в/proc/cpuinfo, памяти в/proc/meminfoили включение маршрутизации в/proc/sys/net/ipv4/ip_forward)./dev- файлы устройств (например, диски/dev/sda, терминалы/dev/ttyи т.п.)./run- временная память (tmpfs) для хранения данных о запущенных процессах (например, файлы.pidи сокеты/run/docker.sock)//boot- файлы для загрузки системы (например,vmlinuz- само ядро,initrd.img- временная ФС для старта,/boot/grub/grub.cfg- меню загрузчика)./lib- системные библиотеки (аналог.dllв Windows)./etc- хранение конфигурационных файлов (nginx.conf,fstab,passwd)./var- переменныданные (например, логи в/var/log, образы контейнеров в/var/lib/dockerи задачи планировщика в/var/spool/cron)./mnt- точки монтирования внешних дисков и сетевых шаров./tmp- временные файлы (часто очищаются при перезагрузке системы)./opt- директория для хранения стороннего софта (например, Google Chrome).
Системные группы
root- группа суперпользователя с полным доступом к системе.sudo(илиwheelдляRHEL) - пользователи, имеющие право выполнять команды с привилегиямиroot.adm- доступ на чтение системных журналов в/var/log.systemd-journal— позволяет читать логи черезjournalctlбез повышения привилегий.bin- доступ владения системными исполняемыми файлами.sys- доступ к определенным системным ресурсам и узлам в/dev.disk- прямой доступ на чтение и запись к блочным устройствам (дискам).audioиvideo- доступ к звуковым картам, камерам и графическим адаптерам (GPU).plugdev- позволяет монтировать и размонтировать съемные устройства (USB-флешки, диски).lpadmin— дает права на настройку и управление принтерами через CUPS.shadow- доступ к чтению файла/etc/shadowдля утилит проверки паролей.docker- управление контейнерами без использования командыsudo.lxd/libvirt- управление виртуальными машинами и контейнерами в системеLXC(Linux Containers).www-data- используется веб-серверами (Nginx, Apache) для работы с файлами и скриптами.
Загрузка ядра
Процесс загрузки системы:
При нажатии кнопки питания, процессор запускает
POST(Power-On Self-Test). Происходит проверка базового оборудования (оперативной памяти, CPU и дисковых контроллеров). ЗатемBIOSилиUEFI(современный стандарт с поддержкой таблиц разделовGPTи безопасной загрузкиSecure Boot) ищетBoot Loaderна доступных устройствах (HDD/SSD/NVMe) согласно заданному в настройках приоритету (Boot Order).Загрузчик (
Bootloader, обычноGRUB2) в отличии отBIOSумеет работать с разделами (GPT/MBR) и файловыми системами (ext4,xfs,btrfs), он считывает свой конфиг из/boot/grub/grub.cfg, выводит меню выбора ядра и загружает в оперативную память два файла -vmlinuz(сжатое ядро Linux) иinitrd/initramfs(временная файловая система в ОЗУ), а также передает ядру инструкции (например, какой раздел считать корневымroot=/dev/sda1). На этом этапе ядро не может найти корневой диск самостоятельно, если он находится наLVM,RAIDили зашифрован, так как у него еще нет драйверов для сборки этих томов.Ядро распаковывается, инициализирует базовые подсистемы (прерывания, управление памятью) и монтирует
initramfsкак временный корень/. Загружаются модули драйверов изinitramfsдля доступа к контроллерам дисков, монтируется реальная корневая файловая системаrootfsв режимеread-onlyи выполняетсяswitch_root(временная ФС очищается, освобождая память, а реальная ФС становится основным корнем/).Ядро запускает самый первый процесс (инициализации) в
User Spaceиз файла/sbin/init(во всех современных системах это ссылка наsystemd). Этот процесс имеетPID 1и является родительским для всех остальных процессов, он анализирует дерево зависимостей юнитов (таких как.service,.target,.socket,.mount,.timer), запускаетfsck(File System Check) для проверки целостности ФС и переводит корневую ФС изread-onlyв режимread-write, монтирует файловые системы из/etc/fstab, запускает все службы параллельно (например, сеть, логированиеjournald,ssh, графическую оболочку) и переводит систему в нужное состояние, напримерmulti-user.target(консоль) илиgraphical.target(рабочий стол).
Системные вызовы
Системные вызовы (Syscall) - это единственный способ для программы в User Space попросить ядро выполнить действие, требующее повышенных привилегий (например, прочитать файл, отправить пакет в сеть или создать новый процесс).
fork()- создать копию текущего процесса (дочерний процесс).execve()- запустить новый код программы поверх текущего процесса.wait()- подождать завершения дочернего процесса.exit()- завершить работу процесса.open()- открыть файл.read()/write()- чтение и запись.close()- закрыть дескриптор.stat()- получить информацию о файле (размер, права).socket()- создать сокет.bind()- присвоить сокету адрес и порт.listen()- вывести сокет в состояниеLISTEN.connect()- попытка установки соединения с удаленным сервером (отправкаSYN).accept()- установка соединения (состояниеESTABLISHED).
Порядок работы системных вызовов на примере процессов:
- При вызове команды
lsвBash, он сначала делаетfork(), создается точная копия самогоBash(дочерний процесс), у них одинаковые переменные окружения, открытые файлы и код. - После клонирования вызывается
execve("/bin/ls", ...), который стирает кодBashвнутри процесса и заменяет его кодом программыls. - Родительский процесс вызывает
wait(), чтобы приостановить свою работу, пока дочерний процесс не закончит работу и не вернет статус выхода.
Ссылки
Symlink- мягкая (символическая) ссылка, указывает на путь к файлу (как ярлык в Windows). Если оригинальный файл удаляется, ссылка становится битой.
ln -s /path/testfile /path/test_soft_link создать символическую (-s) ссылку, которая ссылается на файл testfile
rm test_soft_link при удалении исходного файла у символической ссылки будет ошибка (No such file or directory)
Hardlink- жесткая ссылка, указывает напрямую наinode(физический адрес данных на диске). При удаление, файл остается доступным, пока существует хотя бы одна жесткая ссылка на него. Доступно создание только файлов и только внутри одной файловой системы.
ln /path/testfile /path/test_hard_link создать жестку ссылку, которая указывает на один и тот же inode (адрес на диске)
Inode
Inode (index node) - это служебная структура данных в файловой системе Linux (каждый файл = 1 Inode), которая хранит метаданные о файле (размер, права доступа, UID, GID, временные метки, указатели на блоки данных на диске). Имена файлов хранятся в блоках директории, вместо самой Inode. Директория - это тоже файл, который сопоставляет Имя с номером Inode. При создание 10-ти файлов подряд, их номера Inode могут идти как по порядку (например, 101, 102, 103), так и нет (101, 540, 22), т.к. при удаление файла, его Inode освобождается. Система может отдать этот номер новому файлу.
ls -li /bin отобразить номера inode
stat file наглядно отображает права, UID, GID, временные метки, номер Inode (также номера можно увидеть в ls -li docker) и Links - количество жестких ссылок (Hardlink).
sudo find / -inum 15 найти все жесткие ссылки в системе по номеру inode
Если диск не полный, но файлы не создаются, это значит, что закончились свободные inode, их количество фиксируется при создании файловой системы, в момент форматирования раздела. Можно отобразить доступное и используемое количество inode с помощью команды df -i. Требуется найти директорию и удалить много мелких файлов (например, find / -xdev -type f | cut -d "/" -f 2,3,4 | sort | uniq -c | sort -n) или отформатировать раздел заново с флагом -N (количество inode) или -i (байтов на один inode), например, mkfs.ext4 -N 2000000 /dev/sdb1. В XFS или Btrfs (вместо Ext4) - inode выделяются динамически.
Дескрипторы
Файловый дескриптор (FD) - это неотрицательное целое число (индекс), которое ядро Linux присваивает каждому объекту, открытому процессом. Через это число приложение общается с файлом, сокетом или пайпом. Когда процесс запрашивает открытие файла (через системный вызов open()) или создание сетевого соединения (socket()), ядро выделяет структуру в памяти для управления этим объектом, помещает указатель на эту структуру в таблицу дескрипторов процесса и возвращает процессу наименьшее свободное число (индекс в этой таблице). Например, если на веб-сервер зашло 500 пользователей одновременно, у него будет открыто 500 дескрипторов (по одному на каждое TCP-соединение), помимо этого несколько дескрипторов для загрузки внешних библиотек, а также как минимум 1 дескриптор на чтение конфигурации и еще 1 на запись в лог-файл. При этом, если пользователь хочет загрузить картинку на сайте, сервер открывает этот файл на диске, чтобы прочитать его и отправить в сокет (на время скачивания открывается еще 1 дескриптор).
Дескрипторы ограничиваются лимитами:
- Мягкий лимит (
Soft limit) - по умолчанию1024на один процесс (можно отобразить параметровulimit -Sn). Если программа попытается открыть 1025-й файл, она получит ошибкуToo many open files. Пользователь или приложение может самостоятельно увеличить свой мягкий лимит в любой момент, но не выше жесткого (например, с помощьюulimit -n 2048изменит лимит для текущей сессии терминала и всех дочерних процессов или в файле/etc/security/limits.confдля всех процессов). - Жесткий лимит (
Hard limit) - максимум, который может выставить себе процесс (можно отобразить параметромulimit -Hn). - Системный лимит (
File Max) - сколько всего дескрипторов может быть открыто во всей ОС (определяется параметромsysctl fs.file-max). - Лимиты сервисов
systemdзадаются в unit-файле параметромLimitNOFILE=65535, т.к. они работают в изолированном окружение.
В Linux всем процессам при из создание выделяется 3 зарезервированы системой дескриптора для ввода, вывода и ошибок: 0 (stdin), 1 (stdout) и 2 (stderr). Например, команда ls выполняется как ls 1> /dev/stdout 2> /dev/stderr, но можно переопределить направление дескрипторов, например поток ошибок в дескриптор вывода: ls test 2>&1 или передать оба дескриптора в файл: ls test > stdout.txt 2>&1.
exec используется для управления открытя и закрытия дескрипторов для текущего процесса или замещение текущего процесса новым процессом с передачей текущего PID.
# Открываем файл и закрепляем за ним дескриптор №3
# Мягкая ссылка /proc/self всегда указывает на тот процесс, который к ней обращается
# Отобразить список используемых дескрипторов для текущего процесса
# Найти дескрипторы по номеру PID текущего родительского процесса (bash) и отобразить кем он используется
|
# Если удалить файл, дескриптор останется висеть в памяти и занимать место в лимите
# Очистить содержимое файла без удаления или изменить размер (работает напрямую с атрибутами на уровне ФС)
# Закрываем дескриптор
# Отобразить все дочерние файловые дескрипторы в указанной директории
# Отобразить все файловые дескрипторы по названию процесса
# Остановить все процессы использующие файлы, для дальнейшего umount /mnt/backup
# Отобразить все файлы открытые указанным пользователем (или исключить пользователя)
# Отобразить открытые сокеты по номеру порта
Типы файлов в lsof:
REG(Regular File) - обычный файл на диске (текст или бинарник).DIR(Directory) - директория (невозможно удалить или размонтировать диск, пока директория занята процессом).DEL(Deleted) - файл, который был удален, но дескриптор все еще открыт процессом. Это главная причина, почему место на диске не освобождается, т.к. файл физически остается на диске, пока процесс его не закроет.IPv4- сетевой сокет (TCP или UDP).unix(Unix Domain Socket) - локальный сокет для связи процессов внутри одного сервера (например, docker-cli общается с Docker Daemon через/var/run/docker.sock).FIFO(First In, First Out) - канал для передача вывода одной команды на вход другой (pipe).CHR(Character Device) - устройства для доступ к терминалам или бесконечным потокам данных (например,/dev/pts/0,/dev/nullили/dev/random).BLK(Block Device) - блочное устройство (жесткие диски, разделы), например, при форматировании или монтировании.LINK(Symbolic Link) - символическая ссылка, если процесс обращается к пути через ссылку.
Память
free -m
used- память, занятая процессами (реально потребленная программами в состоянииR/S/D/T).free- абсолютно пустая память (обычно мало, потому что Linux занимает ее кешем).buff/cache- сумма буфера и кеша. Если приложению понадобитсяRAM, ядро высвободит старый кеш и отдаст память процессу.available- реальное количество памяти, которое система может выделить приложению без ухода вSwap(складывается изfree+ доступная часть изbuff/cache).Page Cache- это копия содержимого самих файлов в оперативной памяти. При повторном чтение файла, Linux берет его изPage Cache, а не с диска. Когда приложение пишет в файл, оно на самом деле пишет вPage Cache, ядро помечает эти страницы какDirty(грязные) и записывает их на реальный диск чуть позже в фоновом режиме (через системный процессkworker). Например, при загрузке файла в 10 Гб на сервер с 16 ГБ RAM,freeрезко уменьшится,buff/cacheвырастет на 10 ГБ, а страицы помечаются какDry. Через несколько секунд (по таймеру, обычно каждые 30 секунд, настраивается в/proc/sys/vm/dirty_expire_centisecs) или когдаDirtyстраниц становится больше 10% (настраивается в/proc/sys/vm/dirty_background_ratio), а также с помощью командыsyncядро сбрасывает их на диск черезBuffers(упаковывая данные в сырые блоки по адресам изInode).Buffers- это очередь на запись в блоки данных (прослойка между файловой системой и физическим устройством). Диск состоит из ленты пронумерованных ячеек (секторов), файловая система разбивает эту ленту на блоки (обычно по 4 КБ), аInodeхранит список номеров этих блоков. Роль буфера записать файлы изPage Cacheпри сбросе данных на физические сектора диска, для этого ядро читает содержимоеInodeпо его номеру из кеша в RAM (Slab/VFScache), чтобы узнать физический адрес блока на диске и копирует измененные данные изPage Cacheв соответствующий блокBuffers, помечает этот блок какDirtyи ставит его в очередь на физическую запись в конкретный сектор диска, ядро передает команду контроллеру диска, после подтверждения записи, страницы в буфере и кеше помечаются какClean(чистые). Т.к. диск не умеет записывать по 1 байту, ядро всегда оперирует целыми блоками, даже при изменением одного символа.
ipcs -lm объем страниц разделяемой памяти (shared memory) для кеширования данных
cat /proc/meminfo | grep -iE "^cache|^buff|^dirty" отобразить объем кеша, буфера и грязных страниц (Dirty) в кеше (еще не записанных на диск)
sync записать все кешированные, но еще не записанные данные на диск (вместо кеша данные будут читаться из диска)
echo 1 > /proc/sys/vm/drop_caches отправить сигнал PageCache на вход drop_caches для очистки страничного кеша (free - buff/cache)
echo 2 > /proc/sys/vm/drop_caches отправить сигнал dentrie для очистки кеша структуры файловой системы inode
filefrag используется для опредиления адресов физических блоков (Physical_offset) на диске (обычно, в неупорядоченном порядке). В процессе дефрагментации ФС, ядро пытается переложить блоки так, чтобы они шли подряд.
filefrag -v /usr/share/pixmaps/fish.png
)
Файл размером 7254 байта занимает 2 блока (length) по 4096 байт на диске, потому что ФС не умеет выделять меньше одного блока. Файл не фрагментирован, т.к. соблюдается порядок 230327..230328.
Swap - область на диске, куда ядро вытесняет неиспользуемые страницы памяти (обычно из состояний S и T, и даже R, если эти данные давно не запрашивались), чтобы освободить RAM для активных процессов (R). Swap включается, когда свободная память опускается ниже минимального значения (минимальное количество килобайт, которое ядро обязано держать свободным определяется в файле /proc/sys/vm/min_free_kbytes), ядро приостанавливая выделение памяти процессам и запускает поток kswapd, начиная плавно переносить данные на диск, чтобы система не упала в OOM (Out Of Memory).
Thrashing - критическое состояние, когда RAM кончилась, и система постоянно перекладывает данные из Swap в RAM и обратно (когда CPU загружен на 100%, но us/sy низкие, а iowait зашкаливает). Признак Thrashing, если оба этих числа постоянно высокие (сотни или тысячи КБ/с) одновременно. Это значит, что ядро забирает данные из свопа для одного процесса, и тут же выкидывает данные другого процесса, чтобы освободить место.
OOM Killer
Если память и swap закончились, приходит процесс OOM Killer (Out Of Memory Killer), чтобы система не упала (Kernel Panic), ядро завершает один или несколько процессов.
Ядро не выбирает процесс случайно. Оно начисляет каждому процессу очки (badness score) от 0 до 1000, чем значение больше, тем выше шанс, что процесс будет убит. Значение можно увидеть с помощью cat /proc/[PID]/oom_score. Если в файле процесса /proc/[PID]/oom_score_adj записать -1000, OOM Killer будет игнорировать этот процесс. В логе отображается ядра (dmesg | grep -i oom) отображает какой процесс убит, сколько памяти он занимал и какой у него был oom_score.
Критерии отбора:
- Объем памяти - кто съел больше всех RAM.
- Время жизни - ядро быстрее убивает новые процессы и жалеет старые.
- Приоритет (
nice) - процессы с низким приоритетом убиваются быстрее. - Права - процессы от
rootполучают небольшую скидку.
Процессы
LA (Load Average) - среднее (avg) количество процессов в состоянии R и D за 1, 5 и 15 минут. Если LA выше количества ядер CPU - система перегружена (присутствует очередь). LA показывает нагрузку не только на CPU, но и на дисковую подсистему (из-за учета процессов в состоянии D). Для опредиления, что LA высокий из-за диска, нужно смотреть wa в top или %iowait в iostat.
top или ps aux/cat /proc/181/status
Running(R) - исполняется или ждет исполнения очереди вrun-queue.Sleeping(S/D) -Sпрерываемый (ожидает событие ввода пользователя или сетевой пакет),Dнепрерываемый (обычно ждетI/Oот диска, нельзя убить с помощьюkill -9).Stopped(T) - процесс остановлен сигналом (например,SIGSTOPилиSIGTSTP/Ctrl+Z). Он не выполняется, пока не получитSIGCONT.Zombie(Z) - процесс завершен и память освобождена, но родительский процесс не прочитал код выхода через системный вызовwait()(занимает место в таблице процессов).Dead(X) - процесс, который окончательно убит и в этот момент удаляется из системы (обычно увидеть его почти невозможно, так как это состояние длится доли секунды).Idle(I) - спящий поток ядра (kernel thread), например,kworker, который не учитываются в Load Average.
%Cpu(s): 0.9 us, 0.7 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us(user) - время на работу пользовательских приложений.sy(system) - время ядра Linux (обработка системных вызовов).ni(nice) - время, затраченное на процессы с измененным приоритетом (через командыniceилиrenice).id(idle) - простой.wa(iowait) - процент времени процессора, который ожидает ответа от диска.\hi(hardware interrupts) - время на обработку аппаратных прерываний, например, если проблема с драйверами или с железом (сетевой картой, контроллером диска и т.п.).si(software interrupts) - время на обработку программных прерываний, например, при очень интенсивном сетевом трафике (ядро не успевает обрабатывать пакеты, возможно в случае DoS).st(steal time) - время ожидания процессора для других ВМ (актуально на гипервизоре) на этом же железе из-за конкуренции ресурсов на физическом хосте.
Сигналы
Программа kill реализует системный вызов kill().
kill -[num] [PID] или pkill [proc_name]
SIGHUP(1) - сигнал разрыва соединения, часто используется, чтобы заставить демоны (фоновые службы) перечитать файлы конфигурации без полной остановки.SIGINT(2) - прерывание текущего выполнения (чаще интерактивное с помощьюCtrl+Cи может быть переопределено на уровне приложения), заставляет программу немедленно, но корректно завершить работу.SIGKILL(9) - принудительное завершение процесса на уровне ядра. Этот сигнал нельзя перехватить или игнорировать (как иSIGSTOP).SIGTERM(15) - сигнал завершения приложения самостоятельно, позволяя приложению завершить текущие транзакции и сохранить данные (kill -15по умолчанию).SIGSTOP(19) - немедленная остановка (пауза) процесса ядром. Процесс переходит в состояниеT(Stopped).SIGCONT(18) - сигнал продолжения (continue). Выводит процесс из состоянияT(Stopped) и возвращает его в очередь на исполнение.SIGTSTP(20) - запрос на остановку (паузу) процесса (чаще интерактивно с помощьюCtrl+Z) с возможностью переопредиления действия.
TCP/UDP
Процесс установки TCP-соединения (TCP 3-way Handshake):
SYN (Клиент -> Сервер) => SYN-ACK/Synchronize-Acknowledge (Сервер -> Клиент) => ACK (Клиент -> Сервер)
Статусы установки соединения:
LISTEN- сервис открыл порт и ждет входящих подключений (SYN).SYN_SENT- клиент отправил запрос (если нет ответа, сервер выключен илиfirewallдропает пакеты).SYN_RECV- cервер ответил (если клиент молчит, возможно классическаяSYN-flood/DoSатака, когда очередь на сервере забивается полуоткрытыми соединениями).ESTABLISHED- соединение установлено, данные могут передаваться между процессами.
Статусы закрытия соединения (Termination):
FIN_WAIT_1- на нашей стороне приложение отправлен пакетFINна закрытие соединения (приложение закрывает соединение) и ждемACKот сервера.FIN_WAIT_2- получилиACKна этапеFIN_WAIT_1, ожидаем от удаленной стороны пакетFIN, что сервер тоже закрыл соединение.CLOSE_WAIT- удаленный сервер прислал пакетFINи наше ядро автоматически ответилоACK. Ядро ждет, когда наше приложение вызовет командуclose()для перехода в статусLAST_ACK.LAST_ACK- финальное подтверждение закрытия со стороны того, кто был в статусеCLOSE_WAIT, отправляет удаленному серверу своей пакетFINи ждетACK.TIME_WAIT- состояние на стороне того, кто первым инициировал закрытие (отправил первый пакетFIN). Соединение фактически завершено, данные переданы, но ядро Linux удерживает запись в памяти в течение2 * MSL(Maximum Segment Lifetime, по умолчанию 30 * 2). Используется для надежного закрытия соединения (4-way handshake), если наш финальныйACK(в ответ наFINот сервера) потеряется в сети, сервер не поймет, что мы закрылись, и пришлет свойFINповторно, но находясь вTIME_WAIT, ядро увидит этот повторныйFINи снова отправитACK, а если бы соединение было сразу удалено, мы бы ответили ошибкой (RST), и сервер решил бы, что произошел сбой. Это процесс гарантирует, что старые пакеты от этого соединения окончательно исчезнут в сети и не попадут в новую сессию, открытую на этом же порту.
Параметр net.ipv4.tcp_orphan_retries определяет, сколько раз ядро будет пытаться отправить FIN (завершающий пакет), если удаленная сторона не отвечает (по умолчанию 8 раз). После этого TCP-соединение принудительно разрывается и удаляется из памяти.
Параметр net.ipv4.tcp_fin_timeout определяет, сколько секунд сокет может находиться в состоянии FIN_WAIT_2, ожидая FIN от удаленной стороны (по умолчанию 60 секунд). Если за это время сервер не прислал свой FIN, ядро убивает сокет.
UDP не подтверждает доставку (отсутствие установки соединения) и не гарантирует порядок пакетов (UDP не будет их пересобирать, за это отвечает приложение). Заголовок содержит 8 байт служебной информации (у TCP минимум 20), соот-но больше полезных данных в пакете. Используется в служебных пакетах (DNS, DHCP), телефонии (VoIP) и стриминге.
Сокеты
ss (Socket Statistics) - консольная утилита для анализа сетевых соединений.
ss -a- отобразить все сокеты.ss -ta- отобразить все TCP-соединения.ss -ua- отобразить все UDP-соединения.ss -x- отобразить только локальные UNIX-сокеты (общение процессов внутри одной ОС).ss -l- отобразить только сокеты, которые ждут входящих соединений в статусеLISTEN.ss -t- отобразить только установленные TCP-соединения в статусеESTABLISHED.sudo ss -p(processes) - отображает процессы использующие сокет и номера файловых дескрипторов для этого сокета, например,users:(("xray",pid=1469658,fd=18)).ss -r(resolve) - резолвит адреса в имена с помощьюDNS.ss -n(numeric) - не резолвить номера портов (80,443) в имена протоколов (http,https).
ss -s (summury statistics):
estab- количество соединений активно передают данные в статусеESTABLISHED.closed- сумма всех соединений, которые находятся в процессе закрытия (статусыFIN_WAIT,CLOSE_WAITиLAST_ACK).orphaned(сироты) - TCP-соединения, которые уже не привязаны ни к одному процессу в системе (например, процесс убили черезkill -9, а сокет еще закрывается ядром).timewait- количество сокетов в статусеTIME_WAIT.
iproute2
ip (пакет iproute2) - это современный стандарт управления сетевым стеком в Linux, который полностью заменяет устаревший net-tools.
Все изменения через
ipне сохраняются после перезагрузки системы.
ip -s link выводит подробную статистику всех сетевых интерфейсов для анализа проблема на накальном (L2) уровне.
RX(Receive) - прием данных.TX(Transmit) - передача данных.bytes/packets- общий объем данных и количество пакетов (еслиpacketsрастут быстро, аbytesнет, возможно, идутSYN-floodатака).errors- общее число ошибок на физическом (L1) уровне (возможно повреждение кабеля или настроек оборудования).dropped- пакеты, которые ядро получило, но решило выбросить (например, переполнение очередей из-за нехватка CPU или памяти, пакеты приходят быстрее, чем система успевает их обработать).overrun- переполнения буфера на сетевой карте до того, как ядро успело о нем узнать (например, нехватка дескрипторы).mcast- количество многоадресных (multicast) пакетов (например, при использование кластераKeepalived).ip aилиip addr show- отображает список сетевых интерфейсов.ip -br a show- вывести только название интерфейса, статус работы и ip-адрес.ip link set dev eth0 up- включить сетевой интерфейс.ip link set dev eth0 down- выключить сетевой интерфейс.ip link set mtu 1550 dev eth0- изменить значениеMTU.ip link set dev eth0 address AA:BB:CC:DD:EE:FF- изменитьMACадрес (предварительно требуется отключить интерфейс).ip addr add 192.168.3.115/24 broadcast 192.168.3.255 dev eth0- добавить еще один адрес для интерфейса.ip addr del 192.168.3.115/24 dev eth0- удалить адрес.
Маршрутизация - это процесс для определения пути отправки IP-пакетов к адресу назначения. Чем длиннее маска, тем выше приоритет.
ip route show- отобразить таблицу маршрутизации.ip route get 8.8.8.8- симуляция отправки пакета. Отображает через какой интерфейс и шлюз, а также с какимSource IPуйдет пакет.ip route add default via 192.168.3.1- добавить маршрут по умолчанию.ip route add 192.168.4.0/24 via 192.168.3.100 dev eth0 metric 10- добавить статический маршрут через указанный интерфейс (чем ниже метрика, тем выше приоритет).ip route del 192.168.4.0/24 via 192.168.3.100- удалить маршрут.ip route add blackhole 1.2.3.4- заблокировать отправку на указанный ip-адрес.ip route add unreachable 1.2.3.4- пакеты будут отбрасываться, а отправитель получит ICMP-ответHost unreachable.
ARP таблица используется для сопоставления IP и MAC адресов.
ip neigh show- отобразить ARP-таблицу.ip neigh add 192.168.3.110 lladdr b0:be:76:43:21:41 dev eth0- добавить в таблицу.ip neigh del dev end33 192.168.3.110- удалить.ip neigh flush- очистить ARP-таблицу.
mtr - объединяет функциональность traceroute и ping в одном инструменте сетевой диагностики для каждого узла в трассеровке, который постоянно шлет пакеты и показывает статистику в динамике.
mtr -b google.comотображать имя и IP-адрес.mtr -b -I eth0 google.com- указать интерфейс для проверки.mtr -b --tcp -P 443 google.comиспользоватьTCP SYNпакеты илиUDPдейтаграммы (--udp) для опроса все хостов в трассировке.mtr -s 1000 google.comуказать размер пакета.
OSI
Сетевая модель OSI - это стандарт, который делит процесс передачи данных от провода до приложения на 7 уровней.
Физический (
Physical) - передача битов (нулей и едениц) без логики по витой паре (медные провода для передачи электрических импульсов), оптоволокну (нить толщинной с волос из сверхчистого стекла, передает данные вспышками света на расстояния в коллометры без потерь) или радиоволнам, например,Wi-Fi(стандарты802.11, устройство преобразует биты данных в радиосигнал определенной частоты,2.4 ГГцили5 ГГц, роутер принимает эти волны и превращает их обратно в электрические импульсы для передачи по проводу) а такжеBluetooth(по тому же принципу, но на меньших мощностях и коротких дистанциях), сотовая (4Gи5G) или спутниковая связь (радиосигнал уходит в космос и возвращается обратно).Канальный (
Data Link) - упаковка потока битов в кадры (frames), которые добавляет заголовки из физических адресов отправителя и получателя, а также подтверждения целостности передачи данных с помощьюCRC(Cyclic Redundancy Check - контрольная сумма) иMTU(Maximum Transmission Unit - максимальный размер кадра, который может быть передан, стандартно вEthernetсоставляет1500) и тегVLAN(для логического разделения, если нужна маршрутизации между виртуальными сетями, требуется роутер 3-го уровня). Добавляются уникальныеMACадреса в формате00:1A:2B:3C:4D:5Eи устройства 2-го уровня коммутаторы (switch), которые хранят таблицу MAC-адресов (в отличии от хаба/повторителя 1-го уровня, который отправляет всем широковещательные сигналыBroadcast), для каждого подключенного устройства в его порты.Сетевой (
Network) - маршрутизация данных между разными сетями. Добавляется маршрутизация, цель которой найти кратчайший путь от отправителя к получателю через десятки промежуточных узлов. На сетевом уровне работают роутеры, которые поддерживают протоколARP(Address Resolution Protocol) для сопоставления IP и MAC-адресов (мост между 2 и 3-ем уровнем), также выполняютNAT(Network Address Translation - технологию преобразования IP-адресов). Данные упаковываются в пакеты (packets), где в кадр со 2-го уровня добавляются заголовки IP-адреса отправителя и получателя, а также версия (IPv4илиIPv6), тип протокола (TCP,UDPилиICMP), длина заголовка (для определения, где заканчиваются инструкции и начинаются данные), тип сервиса (QoSдля приоритезации, например, для видеозвонков обычно он выше, чем для загрузки файла), общая длина (размер всего пакета целиком), идентификатор, флаги и смещение для фрагментации (если пакет слишком большой, роутер нарезает его на куски, а эти метки помогают собрать его обратно),TTL(Time To Live - время жизни пакета, это счетчик прыжков по роутерам, где каждый вычитает единицу) и контрольная сумма заголовка (проверка, не повредились ли сами инструкции в пути).Транспортный (
Transport) - передача сегментов данных, где добавляется протокол (ICMP,6/TCPили17/UDP) и порты (16-битные числа) в диапазоне от0до65535(где0-1023системные,1024–49151зарегистрированные пользовательские и49152–65535частные-динамические), а также порядковый номер (Sequence Number, который позволяет собрать сегменты в правильном порядке), номер подтвержденияACK(Acknowledgment Number - это номер следующего байта, который ожидает получатель), флагиSYN(Synchronize - запрос на установку соединения),ACK(Acknowledgment - подтверждение получения),FIN(Finish - запрос на разрыв соединения) иRST(Reset - немедленный разрыв) и окно (Window Size), сколько данных получатель готов принять за один раз, прежде чем пришлет подтверждение, если устройство в сети не получает ACK в течение определенного времени (тайм-аут), он считает, что данные потеряны, и отправляет их еще раз. ВUDPразмер заголовком 8 байт в отличии от 20 вTCP, в нем отсутствуют поля для подтвержденияACK, порядковых номеров и управления окном.Сеансовый (
Session) - управление сессиями связи, используется для открытия, поддержания и закрытия соединений.Представления (
Presentation) - преобразование форматов данных, такие процессы как сжатие, шифрование (например, протоколыSSLиTLS, которые превращают пароль в нечитаемый набор символов), кодирование и форматирование (например, преобразование текста вASCIIили работа с форматами изображений (JPEG,PNG), видео (MPEG), звука).Прикладной (
Application) - используется приложениями в протоколах 7-го уровня, например,HTTP/HTTPS(80/443),FTP(20 передача данных и 21 передача команд),SSH(22),RDP(3389),NFS(2049),SMB/CIFS(445),DNS(53),DHCP(67, 68),NTP(123/UDP),SMTP(25/465/587),POP3(110/995),IMAP(143/993),SNMP(161/162 для мониторинга и управления сетевым оборудованием),LDAP(389/636),IPMI(623/UDP),SIP(5060/5061), Docker API (2375/2376),etcd(2379/2380), kubelet API (10250).
SSL/TLS
SSL (Secure Sockets Layer) - это старая версия протокола TLS, который является более безопасным стандартом, по сути, TLS 1.0, это обновленный проприетарный протокол SSL 3.1. Последняя версия SSL выпущена в 1996 году, в 2014 году была обнаружена критическая уязвимость POODLE, которая позволяла расшифровать данные, поэтому согласно документу RFC 7568 официально SSL 3.0 был признан устаревшим и небезопасным в 2015 году.
Под капотом TLS происходит процесс рукопожатия (Handshake), цель которого договориться о секретном ключе, чтобы никто не подслушал передачу между двумя сторонами. TLS использует MAC (Message Authentication Code), если в процессе передачи зашифрованного пакета изменится хотябы один бит, проверка на второй стороне не пройдет. Для каждой новой сессии создается новый ключ, и даже если кто-то взломает ключ от вчерашней сессии, сегодняшнюю он прочитать не сможет. В TLS сначала используется асимметричное шифрование и сертификаты для проверки подлинности и безопасного обмена общим секретом, после этого общение переходит на быстрое симметричное шифрование с использованием этого секрета. В классическом методе RSA (Rivest-Shamir-Adleman) сервер передает клиенту свой открытый ключ, которым клиент шифрует сгенерированное случайное число (будущий секретный ключ) и отправляет его обратно. Поскольку расшифровать это сообщение может только сервер своим закрытым ключом, обе стороны получают общий секрет, недоступный для перехвата в сети.
Процесс состоит из 4-х шагов:
- Приветствие. Клиент передает серверу известный ему список алгоритмов шифрования, а свервер в свою очередь выбирает алгоритм и передает ему SSL-сертификат.
- Проверка сертификата. Сначала клиент проверяет сертификат сервера через
CA(Certification Authority - удостоверяющий центр сертификатов). - Обмен ключами. Клиент и сервер используют асимметричное шифрование. У сервера есть заранее созданная пара: открытый ключ (лежит в сертификате и доступен всем) и закрытый ключ (хранится только на сервере). Клиент использует открытый ключ сервера, чтобы зашифровать и передать данные, на основе которых оба участника сгенерируют общий секретный ключ. Благодаря асимметрии, даже если перехватить этот пакет, расшифровать его и узнать секрет сможет только владелец закрытого ключа (сервер).
- Переход с асимметричного на симметричное шифрование. Как только сессионный ключ согласован, выключается асимметричное шифрование (которое слишком медленное и тяжелое для процессора). Все последующие данные шифруются этим одним секретным ключом.
DHCP
DHCP (Dynamic Host Configuration Protocol) - протокол, который позволяет устройствам автоматически получать IP-адрес и другие настройки сети. Работает по UDP (порты 67 для сервера и 68 для клиента).
Этапы получения адреса (DORA):
DISCOVER- клиент отправляет в сеть широковещательный (Broadcast) пакет на адрес255.255.255.255, который содержит MAC-адрес и список опций, которые он хочет получить (например, маску, шлюз, DNS).OFFER- сервер отправляет ответ также на адрес255.255.255.255с содержимымIP, маски (например,24) и время аренды (Lease Time). Сервер сразу резервирует этот адрес на короткое время.REQUEST- клиент отправляет на255.255.255.255подтверждение, что он принимает предложение от сервера (на случай, если в сети несколько DHCP-серверов, чтобы те отозвали свои офферы). В пакете указан идентификатор выбранного DHCP-сервера и готовность получить предложенный адрес.ACK- сервер подтверждает привязку, и передает в пакете список всех DHCP Options (DNS, NTP, шлюз и т.д.). После этого клиент (на стороне ядра ОС) настраивает свой сетевой интерфейс.
Клиентские демоны (например, dhclient или systemd-networkd) пишут этапы DORA в лог: journalctl -u systemd-networkd | grep -i dhcp
Или использовать сниффер: sudo tcpdump -i eth0 -vvv -n port 67 or port 68
Служебные сообщения:
NAK- отказ от сервера (адрес больше невалиден, например, если клиент переехал в другу подсеть).RELEASE- добровольный отказ клиента от IP.INFORM- запрос только опций, если IP уже есть.DECLINE- клиент нашел конфликт адресов в сети.FORCERENEW- сервер заставляет клиента обновиться.
Команды для управления DHCP:
dhclient -v eth0- получить или обновить IP-адрес на конкретном интерфейсе (запустит процессDORA).dhclient -r eth0- освободить текущий IP-адрес (например, чтобы сбросить настройки перед сменой сети).cat /var/lib/dhcp/dhclient.leases- лог клиента об аренде (когда получен IP, какой сервер выдал и когда истекает), или по пути/run/systemd/netif/leases/, если используетсяnetworkd.
DNS
DNS (Domain Name System) - это сетевой протокол, который отвечает за преобразование доменных имен в IP-адреса, понятные компьютерам. При работе протокола DNS происходит взаимодействие между Прикладным (7) и Транспортным (4) уровнями модели OSI. DNS-запрос спускается с прикладного уровня (где живет сам сервис DNS) на транспортный (4-й), чтобы упаковаться в сегмент UDP (чаще всего) или TCP для передачи по сети через порт 53.
DNS переключается на TCP, когда размер ответа превышает стандартный лимит UDP в 512 байт, например, если у домена много IP-адресов или используются большие записи, а также при использование DNSSEC, где используются цифровые подписи для защиты данных от подмены (сами данные не шифруются и остаются открытыми, но гарантируется их целостность и подлинность).
Порядок преобразования адреса на стороне ОС:
- Прежде чем спросить ОС, браузер или сервис сначала смотрят в свой внутренний кеш имен (если недавно был переход на сайт, запрос в систему даже не уйдет).
- Файл
/etc/nsswitch.confпозволяет определить порядок в системе (например,hosts: files mdns4_minimal [NOTFOUND=return] dns). ПараметрNOTFOUND=returnв протоколеmDNS(служба Avahi) означает, что если имя заканчивается на.local, но не найдено здесь, ОС не пойдет дальше к DNS-серверу, а сразу вернет ошибку. - Файл
/etc/hosts. - Файл
/etc/resolv.conf- главная конфигурация в системе, в которой прописаны все IP-адреса DNS-серверов резолверов. - Системная DNS-заглушка (Stub Resolver) в
systemd-resolved, которая слушает запросы на локальном127.0.0.53(если адрес указан в файле/etc/resolv.conf) и кеширует ответы, если локально ответа нет, запрос улетает на внешний DNS-сервер, который опрашивает корневые DNS-сервера. - Если запись в кеше
resolvedне найдена, внешний DNS-сервер определяется в приоритете от файла/etc/systemd/resolved.conf(DNS=), статическая настройка вNetplan-> динамическая отDHCP->FallbackDNSв файле/etc/systemd/resolved.conf.
Порядок преобразования адреса на стороне DNS-сервера:
- Сначала резолвер обращается к одному из 13 корневых серверов (
TLD/Top-Level Domainсервера - домены вернего уровня), т.к. корневые сервера не знают проgoogle, но знают, кто управляют всеми доменами в зоне.com. - Резолвер идет к
TLDсерверу зоны.comи получает от него адреса авторитетных серверов (Authoritative Name Servers), которые принадлежат доменуgoogle. - В свою очередь авторитетный сервер (
ns1.google.com,ns2.google.comи т.д.) возвращяет IP-адрес (A-запись) для сервераgoogle.comи времяTTL(сколько этот ответ можно хранить в кеше). - Резолвер (например,
8.8.8.8) запоминает этот IP-адрес у себя в кеше и отдает его компьютеру.
DNS-записи:
A(Address) - привязывает имя кIPv4адресу.AAAA- привязывает имя кIPv6адресу.CNAME(Canonical Name) - псевдоним одного имени для другого (например,www.site.com, сервер переадресует на записьsite.com). По стандартамDNSвRFC 1034, CNAME-запись нельзя вешать на корневой домен, Поэтому для корня используется только A-запись (прямой IP).NS(Name Server) - указывает, какой DNS-сервер является авторитетным (главным) для этой зоны (делегируование прав на управление доменом, для преобразования адресов субдоменов в указанной зоне).MX(Mail Exchanger) - указывает на сервер, принимающий почту в домене. УMXзаписей всегда есть приоритет, чем меньше число, тем выше приоритет сервера.PTR(Pointer) - обратная запись (переводит IP-адрес в имя). Используется, чтобы почтовые серверы могли проверить, правда ли этот IP-адрес принадлежит серверу. БезPTRписьма уходят в спам.SRV(Service) - позволяет найти сервер для специфических служб (например, IP-телефония илиSIP). Запись содержит порт и приоритет.SOA(Start of Authority) - главная запись зоны. СодержитMNAME(главный сервер),RNAME(e-mailадминистратора домена), серийный номер зоны для синхронизации DNS-серверов (если администратор домена поменяет IP-сервера, он увеличит это число, резервные DNS-серверы увидят, что число выросло, и скачают обновление) и время проверки в секундах, как часто запасные серверы должны спрашивать главный.TXT(Text) - произвольный текст, например, для подтверждения владения доменом вLet's Encrypt, а также для защиты от спамаSPF(кто может слать почту).
Команды для управления DNS:
nslookup google.com- проверить резолвинг и отобразить, какой сервер отвечает.resolvectl status- отображает, какие реальные DNS-серверы сейчас используетsystemd-resolvedна разных сетевых интерфейсах.resolvectl statistics- отображает статистику, включая количество записей в кеше (памяти).
dig (Domain Information Groper) - консольная утилита для опроса DNS-серверов (альтернатив nslookup).
dig google.com SOA- отобразить параметры реплизации DNS-зоны.dig TXT _acme-challenge.example.com- пример запроса отLet's Encryptбота для проверки содержимого TXT-записи.dig @1.1.1.1 google.com A- использовать DNS-сервер Cloudflare для преобразования имени в IP-адрес.dig @9.9.9.9 google.com MX- использовать DNS сервер Quad9 для полученияMXзаписи.dig -x 8.8.8.8 @9.9.9.9- разрешить IP-адрес в имя (получитьPTRзапись).
HTTP/REST
Методы запросов:
GET- получение данных (запросы с использованием этого методом не могут изменять данные).POST- изменение данных или создание нового ресурса (обычно данные передаются в теле запроса).PUT- полное обновление ресурса (заменяет старый объект новым).PATCH- частичное обновление ресурса (меняем только одно поле).DELETE- удаляет указанный ресурс.
Заголовки запросов:
User-Agent- содержит информацию о приложении или версии браузера отправителя (например,curl/8.9.1илиMozilla/5.0).Accept-Encoding- указывают кодировку содержимого (алгоритм сжатия), которую понимает отправитель (например,gzip, deflate, br, zstd).Accept-Language- сообщает серверу, какие языки клиент понимает и какая локаль предпочтительнее (например,ru,en;q=0.9,en-US;q=0.8)Content-Length- указывает размер тела запроса в байтах.Content-Type- указывает тип данных, передаваемых в теле запроса (например,application/json).Accept- сообщает серверу, какие типы контента клиент готов принять в ответ (например,application/json).Authorization- содержит учетные данные для проверки подлинности клиента (например,Basic <credentials>илиBearer <token>).Cookie- передает серверу пары ключ-значение (сессионные ID, токены), установленные ранее черезSet-Cookie.Origin- указывает домен (протокол, хост и порт), с которого инициирован запрос (обязателен для проверокCORS).Referer- содержит адрес страницы (URL), с которой был совершен переход на текущий ресурс.X-Forwarded-For- передает реальный IP-адрес клиента, если запрос прошел через прокси-сервер или балансировщик нагрузки.X-Forwarded-Proto- указывает исходный протокол (httpилиhttps), который использовал клиент до того, какSSLбыл сброшен на прокси.
Статусы ответов:
2xx- успех200(OK) - все прошло успешно.201(Created) - ресурс успешно создан (ответ наPOST).204(No Content) - запрос выполнен, но в ответе нет тела (обычно подтверждение послеDELETE).3xx- перенаправление301(Moved Permanently) - ресурс навсегда переехал.304(Not Modified) - ресурс не менялся (используется для кеширования).4xx- ошибка на клиенте400(Bad Request) - сервер не понял запрос (ошибка в синтаксисе).401(Unauthorized) - ошибка авторизации.403(Forbidden) - авторизован, но нет прав на это действие.404(Not Found) - ресурс не найден.405(Method Not Allowed) - метод недоступен, например, попытка сделатьGETтам, где разрешен толькоPOST.409(Conflict) - конфликт данных (например, при создание пользователя с email, который уже занят).429(Too Many Requests) - лимит на количество запросов (Rate Limit).5xx- ошибка на сервере500(Internal Server Error) - общая ошибка на стороне сервера.502(Bad Gateway) - ошибка прокси или шлюза (например,Nginxне достучался до приложения).503(Service Unavailable) - сервер перегружен или на обслуживании.504(Gateway Timeout) - сервер слишком долго ждал ответа от вышестоящего узла.
Bash
Переменные
text="ip a" # передаем текст в переменную
ipaddr= # передает вывод команды
# Арифметические операции
# Арифметические операции с поддержкой чисел с плавающей точкой
|
# Ручной ввод переменной
# Экранирование
# Скрыть вывод
# Для ввода пароля
pass=
# Коды возврата
&& ; ||
# Индексы
line="Это длинная строка, которую нужно сократить до 50 символов."
# Экспортируем глобальные переменные и используем их для подстановки в файле
Многострочный ввод
Heredoc (Here-document) или EOF (End Of File) - это механизм, который позволяет передавать многострочный текст в команду без использования внешних файлов.
name="srv-01"
ip="192.168.3.100"
Срезы
# Объявить срез/список
array=()
array=(1 2 3 4 5) # создать массив
array=() # создать массив от 1 до 254
array=() # передает вывод команды в массив (разделенных через пробел)
array= # создать массив от 1 до 5
array+=(4) # добавить новое значение в массив
array[1]="test" # изменить значение по номеру индекса
for ; do ; done
Карты
# Создать карту
# Пример конфигурации в формате ctx=namespace1,namespace2
# Создаем карту из context=namespace
# Создаем срез из context-ов
# Заполняем массив и список с помощью read
while ; do
if ; then
ctxArray[""]=""
ctxList+=("")
fi
done
for; do
IFS=','
for; do
done
done
Циклы
for; do
done
array=()
for; do
done
array=(1 2 3 4 5)
for; do
if [; then
# Прерываем цикл
break
elif [; then
# Прерывает текущую интерацию в цикле
continue
fi
done
p=1
while [; do
# Eсли условие истинно, выполнять цикл в блоке do, пока не станет ложным
# ((p++)) # увеличить на 1
# p=$(($p+10)) # прибавлять 10
p+=0 # прибавлять текст в конец переменной
done
num=0
| | while ; do
# ((num+=1))
done
Условия
| Оператор | Описание |
|---|---|
-z | строка пуста |
-n | строка не пуста |
=, (==) | строки равны |
!= | строки неравны |
-eq | равно |
-ne | неравно |
-lt, (<) | меньше (для арифметических вычислений) |
-le, (<=) | меньше или равно (для арифметических вычислений) |
-gt, (>) | больше (для арифметических вычислений) |
-ge, (>=) | больше или равно (для арифметических вычислений) |
! | отрицание логического выражения |
[-a]/[[&&]] | логическое и (первая команда исполняется всегда, вторая - только в случае успешного завершения первой) |
[-o]/[[||]] | логическое или (первая команда исполняется всегда, вторая - только в случае неудачного завершения первой) |
-e file | проверяет, существует ли файл |
-d file | проверяет, существует ли файл и является ли он директорией |
-f file | проверяет, существует ли файл и является ли он файлом |
-r file | проверяет, существует ли файл и доступен ли он для чтения |
-w file | проверяет, существует ли файл и доступен ли он для записи |
-x file | проверяет, существует ли файл и является ли он исполняемым |
-s file | проверяет, существует ли файл и не является ли он пустым |
if ; then
elif ; then
else
fi
# Получить список директорий и исполняемых файлов в дочерних директориях
path="/etc/*"
for; do
for; do
if [; then
fi
done
done
# Условия типа switch
Функции
calc 3 + 2
calc 3 - 2
Опции
getopts - это встроенная в bash команда для разбора аргументов (опций/ключей/флагов) командной строки.
# Принимаем аргументы: -h (без значения) и -f (с обязательным параметром)
while ; do
done
Базовые команды
# узнать путь к текущей директории
# пути
# файлы
# Access - время последнего чтения или выполнения файла
# Modify - модификации содержимого файла
# Change - изменения метаданных (например, прав доступа или владельца)
# Birth - дата создания файла
# tee (>/>>)
| |
# tar (архивирование)
# printf (форматированный вывод)
# tac/rev
| |
# head/tail
| |
# Выравнивание текста по полям
|
# wc (Word Count)
| | | |
# sort (сортировка)
| | | | |
# uniq (уникальные значения)
| | | | | | |
# tr/translate (like replace/sed)
| | | | | |
# paste (like join)
| # Объединяет два файла в один многоколоночный вывод
# cut (как awk, но и не инициализирует интерпретатор целого языка и работает быстрее на огромных объемах данных)
# cut не умеет объединять разделители и менять порядок вывода для столбцов (awk по умолчанию считает любое количество пробелов за один разделитель)
| | | | |
# tr + cut + column
| | |
# split string
str="sha256:c79464ed2966afa47b2db6a17d0cdc0500ddc6f941992df043304f1f57ade"
# Отрезать все после первого двоеточия (оставить левую часть)
# Отрезать все до первого двоеточия (оставить правую часть)
# split file
# diff (сравнение файлов)
# set (отладка скриптов)
Базовые пакеты
# Обновление всех установленных в систему пакетов
&&
# Установка пакетов
# Установка пакетов из PPA
# Интерактивный поиск по истории команд
|
# Выполнить выбранную команду из списка
# Интерактивный интерфейс для навигации по историю команд
|
# Анализ занятого дискового пространства с навигацией по каталогам
# Поиск файлов с предпросмотром и подсветкой синтаксиса
# Поиск всех файлов с расширением yml/yaml в системе
|
|
# Поиск в файлах по их содержимому
# Текстовый редактор в стиле IDE с поддержкой выделения, управления мышью, подсветки синтаксиса и файловым менеджером
|
Профиль
nano ~/.bashrc
# Определить переменную окружения, доступную для дочерних процессов, запущенных в текущей сессии
# Игнорировать запись в историю команд, которые начинаются с пробела
# Добавить фильтрацию по введеному тексту в истории команд при испоьзовании стрелочек вверх и вниз
if ; then
fi
# Псевдонимы для команды или набора команд с флагами для сокращения ввода
# Забиндить очистку ввода на Ctrl+L
source ~/.bashrc применить политики (перечитать профиль)
oh-my-bash - используется для управления оформлением ввода (промпта) в терминале.
При установки oh-my-bash, обновляется профиль bashrc, делая рядом резервную копию старого файла в .bashrc.omb-TIMESTAMP:
# Вывести список доступных тем
# Изменить тему
&&
fzf over bash complete - реализует автодополнения опций для команд в интерфейсе fzf.
compgen
compgen - это встроенная команда оболочки Bash, которая генерирует список возможных вариантов автодополнения (используется под капотом системы при нажатии клавиши Tab) в терминале, чтобы оболочка выводила список доступных команд, опций, файлов или переменных.
compgen -c выводит все команды, доступные в текущей оболочке
compgen -a выводит все алиасы, определенные в текущей оболочке
compgen -b выводит все встроенные команды Bash
compgen -k выводит все зарезервированные слова Bash
compgen -v выводит все переменные, определенные в текущей оболочке
compgen -A export выводит все экспортированные переменные
compgen -A function выводит все функции, определенные в текущей оболочке
compgen -A arrayvar выводит все массивы, определенные в текущей оболочке (echo ${BASH_ALIASES[@]})
compgen -A hostname выводит все известные хосты
compgen -A job выводит все активные фоновые задания (запускаемые через &)
compgen -A service выводит все службы (для систем, поддерживающих службы, например, через systemd)
compgen -d выводит все директории в текущем каталоге
compgen -f выводит все файлы и директории в текущем каталоге
compgen -u выводит всех пользователей системы
compgen -g выводит все группы системы
compgen -W "start stop status restart" st выводит список слов из wordlist, которые начинаются с префикса st
jobs
(ping google.com > icmp.log 2>&1) & запустить задачу в фоне (отображается [номер задачи] и PID дочернего процесса)
jobs отобразить список фоновых задач (+ задача активна)
fg 1 открыть задачу по номеру (вернуть stdin и tty)
bg %1 - продолжить выполнение задачи в фоне, если она была остановлена (Ctrl+Z)
kill %1 завершить последнию запущенную задачу
disown %1 завершить последнию (если она первая) запущенную задачу
disown завершить все фоновые задачи (очистить всю очередь заданий)
wait встает на паузу и ждет завершения указанной или всех фоновых задач.
&
PID=
# wait %1
for ; do
&
done
nohup ping google.com > icmp.log 2>&1 & используется для запуска процессов в фоне (защита от SIGHUP сигналов)
ps -ef | grep "ping google.com" найти процесс
kill $(pgrep ping) завершить процесс
(ping google.com > icmp.log 2>&1 &) запустить скрипт в subshell (создает процесс bash, рядом запускает отдельный процесс ping и потом завершает процесс bash)
(exec ping google.com > icmp.log 2>&1 &) сразу заменяет процесс bash в subshell на ping (забирает его PID) с помощью exec
pstree -a -p $USER
echo {1..10} | xargs -n 1 -P 4 bash -c 'echo Start task $1 && sleep $1 && echo Complate task $1' _ принимает 1 аргумент и запускат до 4-х потоков за раз
echo "google.com 4 github.com 4" | xargs -n 2 -P 2 sh -c 'ping -c $2 $1' -- принимает 2 аргумента
echo "google.com github.com" | xargs -n 1 -P 2 ping -c 5
GNU Parallel - инструмент командной оболочки для параллельного выполнения задач на одном или нескольких компьютерах (ожидает завершения работы без вывода прцоесса в фон).
sudo apt install parallel
printf "%s\n" google.com github.com | parallel -j 2 ping -c 5 {}
GPU Task Spooler - система буферизации задач, которая упрощает управление задачами (как jobs в PowerShell).
sudo apt install task-spooler
tsp ping google.com -c 5 создать задачу
tsp -l отобразить список задач
tsp -s 0 отобразить статус задачи
tsp -s 0 отобразить PID задачи
tsp -o 0 отобразить путь к tmp файлу с выводом
tsp -t 0 вывести вывод работы задачи в режиме tail во время выполнения
tsp -k 0 остановить процесс (отправить сигнал SIGTERM)
tsp -C очистить все выполненные (со статусом finished) задачи
cron
ls /etc/cron.d/ директория хранения задач различных пакетов (atop, sysstat)
Директории для скриптов, которые надо выполнять раз в час, день, неделю и месяц: ls -l /etc/cron.hourly
ls -l /etc/cron.daily
ls -l /etc/cron.weekly
ls -l /etc/cron.monthly
crontab -l просмотр задач
crontab -l | grep -Pv "^$|^#" отобразить только активные задания
crontab -e создать задачу от текущего пользователя
crontab -u lifailon -l отобразить задачи пользователя lifailon
sudo crontab -u root -e создать задачу от пользователя root
crontab -r удалить все задачи
cat /etc/crontab
#### # .---------------- минута (0 - 59)
#### # | .------------- час (0 - 23)
#### # | | .---------- мень месяца (1 - 31)
#### # | | | .------- месяц (1 - 12) или jan,feb,mar,apr...
#### # | | | | .---- день недели (0 - 6) (Воскресень 0 или 7) или sun,mon,tue,wed,thu,fri,sat
#### # | | | | |
#### # * * * * * user-name command to be executed
#### 17 * * * * root cd / && run-parts --report /etc/cron.hourly
#### 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
#### 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
#### 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
0,14,29,44 * * * * каждые 15 минут
*/15 * * * * каждые 15 минут
- Выполнять перезапуск службы каждый день в 23:00 и писать в лог:
00 23 * * * systemctl restart zabbix-agent && echo $(date): Reboot Zabbix Agent use cron >> /var/log/reboot.log
- Выполнять перезагрузку системы один раз в субботу в 3 часа ночи:
00 03 * * 6 echo $(date): Reboot Operating System use cron >> /var/log/reboot.log && /sbin/reboot
- Выполнять один раз после перезагрузки системы:
@reboot date >> ~/date-reboot.log
journalctl -eu cron || cat /var/log/syslog | grep -i cron
addr="google.com"
path="/var/log/metrics/icmp-test.log"
date=
loss=
if [; then
else
fi
echo "*/1 * * * * bash /root/google-icmp-test.sh" >> /var/spool/cron/crontabs/root добавить задачу в планироващик на выполнение скрипта каждую минуту
cp /etc/hosts /etc/hosts.bak backup файла
echo "11.11.11.11 google.com" >> /etc/hosts изменить адрес для недоступности хоста
cp /etc/hosts.bak /etc/hosts восстановить файл
cat /var/log/icmp-test.log | grep unavailable отфильтровать лог по unavailable
grep
Описание ключей для grep и ripgrep:
| Ключ | Описание | Пример |
|---|---|---|
-E | Расширенные регулярки (поддержка +, {}, (), ?, |) | rg "error|crit" |
-P | Регулярные выражения Perl | rg -P "(?<=id=)\d+" |
-i | Поиск без учета регистра (заглавных/строчных букв) | rg -i "user" |
-v | Инверсия (показать все, кроме подходящих строк) | rg -v "^#" |
-w | Ищет точное совпадение целого слова | rg -w "bin" |
-o | Выводит только найденный текст, вместо всей строки | rg -o "127\..*" |
-n | Показывает номер найденных строк в файле | rg -n "auth" |
-c | Выводит количество найденных строк | rg -c "login" |
-l | Выводит только имена файлов с совпадениями | rg -l "TODO" |
-r | Рекурсивный поиск (искать во всех подпапках) | rg "config" |
-A n | After. Показать n строк после найденной | rg -A 2 "Error" |
-B n | Before. Показать n строк до найденной | rg -B 2 "Error" |
-C n | Context. Показать по n строк до и после найденной | rg -C 1 "Error" |
-m n | Количество строк вывода после n совпадений в одном файле. | rg -m 1 "root" |
-q | Вернуть только код возврата 0 (найдено) или 1 (не найдено). | rg -q "ok" && echo 1 |
-F | Отключить регулярные выражения | rg -F "1.2.3.4" |
Примеры использования:
cat /var/log/auth.log | grep sshd отфильтровать логи всех SSH-подключений
cat /etc/passwd | grep -w sys поиск целого слова, окруженное пробелами (-w) или знаками пунктуации (например, (/) или :)
cat /etc/ssh/sshd_config | grep -win port не учитывать регистр (-i) и отобразить номера строк (-n)
ss -n | grep -E ":22|:80|:443|:8080" использовать Regex (-E) для поиска нескольким шаблонам через pipe (|)
ss -n | grep -Ec ":22|:80|:443|:8080" вывести кол-во (--count) совпадений
ss -n | grep "192.168.3\....:" поиск любых трех символов (.) после точки (точка экранируется)
ss -n | grep "192.168.3\..+:" поиск любого кол-во (*/+) любых символов (.) после точки и до символа :
cat /etc/ssh/sshd_config | grep -v "^#" вывести значения, не подходящие под критерии поиска (-v), которые начинаются (якорь ^) с символа #
cat /etc/ssh/sshd_config | grep -Ev "^$|^#" удалить пустые строки ^$ (якори начала и конца строки) и комментарии (^#)
cat /etc/ssh/sshd_config | grep -E "0{2,}" найти символ 0, который повторяется 2 или более (,) раз подряд
cat /etc/zabbix/zabbix_agentd.conf | grep "=$" найти строки, которые кончаются ($) на символ = (получить все параметры без значений)
echo -e "Test-one\ntest-two\ntest-three" | grep -E "^[a-zA-Z\-]+$" искать только текст, где есть буквы и тире (без цифр)
echo 'test<version>1.2.3</version>test' | grep -P "(?<=<version>).*(?=</version>)" группировка (-P) для поиска значения между известным набором символов слева (?<=) и справа (?=)
echo "test<version>3.6.4</version>test" | grep -Eo '[0-9.]+' вывести только (-o) цифры и точки (повторяются любое кол-во раз подряд)
zabbix_path=$(systemctl status zabbix-agent | grep -Po "(?<=-c ).*(?=.conf)" | sed "s/$/.conf/") забрать путь до конфигурационного файла zabbix-агента
cat $zabbix_path | grep -Po "(?<=^Server=).+" найти и вывести только имя сервера
resolvectl | grep "DNS Servers" -m 1 напечатать только первое совпадение (-m int)
networkctl status | grep -A 3 "DNS:" найти строку и напечатать три строки после нее (-A)
networkctl status | grep -B 3 "DNS:" найти строку и напечатать три строки до нее (-B)
networkctl status | grep -C 1 "DNS:" найти строку и напечатать одну строки до нее и одну после (-C)
grep -H "Error" /var/log/* поиск в нескольких файлах (выводит название файла в начале строки)
grep -L "DNS" /etc/systemd/*.conf поиск в файлах, в которых нет совпадения (-L)
if echo "GET" | grep -Eq "^GET"; then echo da; else echo net; fi подавлять вывод (-q) для проверки в условиях
ripgrep (rg) - это более быстрая замена grep написанная на языке Rust, с схожим синтаксисом и дополнительными функциями.
Уникальные ключи ripgrep:
| Ключ | Описание | Пример |
|---|---|---|
-z | Искать внутри сжатых файлов (gz, bz2) | rg -z "err" logs.gz |
-t | Искать только в типах файлов (py, js, conf, log) | rg "port" -t conf |
-T | Исключить тип файлов из поиска | rg "error" -T log |
-u | Искать везде, включая .gitignore | rg -u "secret" |
-uu | Искать везде, включая скрытые файлы (.file) | rg -uu ".env" |
sed
Описание ключей:
| Ключ | Описание | Пример |
|---|---|---|
-n | Подавить автоматический вывод (использовать с p) | sed -n '5p' file.txt |
-i | Редактировать файл на месте | sed -i 's/old/new/' file.txt |
-E | Регулярные выражения (поддержка +, {}, ()) | sed -E 's/(a|b)/c/' |
-e | Выполнение нескольких команд в одном вызове | sed -e 's/a/b/' -e 's/c/d/' |
p | Только вывести найденные строки (использовать с -n) | sed -n '/pattern/p' |
s | Поиск и замена | sed 's/найти/заменить/' |
g | Глобальная замена (все совпадения в строке) | sed 's/a/b/g' |
d | Удалить строку по номеру | sed '3d' file.txt |
a | Добавить текст после строки | sed '2a New line' file.txt |
i | Вставить текст перед строкой | sed '2i New line' file.txt |
c | Заменить всю строку целиком | sed '1c Header' file.txt |
r | Чтение и вставка содержимого из другого файла | sed '3r other.txt' main.txt |
w | Запись результата (только совпадений) в файл | sed 's/a/b/w res.txt' |
y | Посимвольная замена (транслитерация) | sed 'y/abc/ABC/' |
! | Инверсия команды (выполнить, если не совпало) | sed '/#/!d' file.txt |
& | Подставить весь найденный текст в замену | sed 's/[0-9]/(&)/g' |
\1, \2 | Обратные ссылки на группы () | sed -E 's/(.*):(.*)/\2:\1/' |
I | Флаг игнорирования регистра | sed 's/admin/root/Ig' |
Примеры использования:
cat /etc/passwd | sed -n "1,5p" отобразить с первой по пятую строку (p)
cat /etc/passwd | sed "$ d" удалить (d) последнюю строку
cat /etc/passwd | sed "1,3d" удалить c первой по третью строку (2,3d)
echo "One 1" | sed "s/One/Two/; s/1/2/" заменить One на Two и 1 на 2
cat /etc/zabbix/zabbix_agentd.conf | sed "s/127.0.0.1/192.168.3.102/" заменить (s) ip-адрес
cat /etc/ssh/sshd_config | sed "/^#\|^$/d" удалить пустые строки ^$ и комментарии ^#
timedatectl | grep zone | sed -E "s/.+zone: //" удалить любое кол-во лимволов до слова zone: включительно, используя Regex (-E/-r)
echo "test<version>3.6.4</version>test" | sed -E 's/[^<]*<(.*)>.*/\1/;s/<.*//;s/.*>//' использовать regex для удаления текста до и после искомого значения
echo -e "test\ntest" | sed "2s/test/test2/" заменить во второй строке (2s)
echo -e "test\ntest\ntest\ntest" | sed "2,3s/test/test2/" заменить во второй и третей строке (2,3s)
echo -e "test\ntest\ntest\ntest" | sed "2c test2" заменить текст целиком во второй строке (2c)
echo "The test and test" | sed "s/test/test2/g" заменить для каждого совпадения (/g - global)
echo "The test and test" | sed "s/test/test2/2" заменить для второго совпадения (/2)
echo "line2" | sed "i\line1" добавить строку в начало (i)
echo "line1" | sed "a\line2" добавить строку в конец (a) или в после указанной строки (2a)
echo "11 22 33 34" | sed "y/123/234/" заменить 1 на 2, 2 на 3 и 3 на 4 (y)
awk
GAWK/GNU AWK - это скриптовый язык программирования и утилита командной строки, предназначенная для построчной обработки текста, структурированного по столбцам.
Описание ключей:
| Ключ | Описание | Пример |
|---|---|---|
-F | Указать разделитель полей (по умолчанию space/tab) | awk -F: '{print $1}' /etc/passwd |
-v | Передать внешнюю переменную из оболочки в скрипт awk | awk -v a=$VAR '{print $1, a}' |
-f | Прочитать программу awk из указанного файла | awk -f script.awk data.txt |
$0 | Обращение ко всей текущей строке целиком | awk '{print $0}' file.txt |
$n | Обращение к конкретному полю по номеру ($1, $2…) | awk '{print $1, $3}' file.txt |
NF | Обращение к последнему полю | awk '{print $NF}' |
NR | Вывести строку по номеру (Number of Record) | awk 'NR==5 {print $0}' file.txt |
RS | Разделитель входных записей (по умолчанию новая строка) | awk 'BEGIN{RS=""} {print $1}' |
OFS | Разделитель полей при выводе (Output Field Separator) | awk 'BEGIN{OFS=","} {print $1,$2}' |
ORS | Разделитель записей при выводе (Output Record Separator) | awk 'BEGIN{ORS="\n\n"} {print $0}' |
BEGIN | Блок команд, выполняемый ОДИН раз до начала чтения файла | awk 'BEGIN{print "START"} {print $0}' |
END | Блок команд, выполняемый ОДИН раз после обработки файла | awk '{s+=$1} END{print s}' |
~ | Оператор соответствия регулярному выражению | awk '$1 ~ /root/ {print $3}' |
!~ | Оператор НЕсоответствия регулярному выражению | awk '$1 !~ /#/' file.txt |
if | Условный оператор внутри тела awk | awk '{if($3>100) print $1}' |
length | Функция подсчета количества символов в строке/поле | awk 'length($0) > 80' |
1 | Краткая форма команды {print $0} (всегда истина) | awk '/pattern/ {print "found"}; 1' |
sub | Замена первого вхождения в поле или строке | awk '{sub(/old/, "new", $1); print}' |
gsub | Глобальная замена всех вхождений (Global Substitute) | awk '{gsub(/a/, "b"); print}' |
split | Разбить строку в массив по разделителю | awk '{split($1, a, "."); print a[1]}' |
Примеры использования:
cat /etc/passwd | awk -F: '{print "name: " $1 " \t Dir: " $NF}' вывести содержимое первого и последнего $NF элемента в строке, используя разделитель : и табуляцию (\t)
echo 'one two three four' | awk '{print $(NF-1)}' вывести содержимое преподследнего элемента
echo 'one two three four five' | awk '{print $((NF/2)+1)}' вывести содержимое из середины
echo "One Two Three" | awk '{$3="Four"; print $0}' заменить третье значение/переменную в строке
cat /etc/passwd | awk 'BEGIN{FS=":"; OFS=" - "} {print $1,$7}' указать разделитель послей (элементов) на вход (FS) и заменить его на выходе (OFS)
uptime | awk 'BEGIN{RS=" "; ORS="\n"} {print $0}' указать разделитель записей (строк) на входе (RS) и заменить его на выходе (ORS)
echo -e "12345\n54321" | awk 'BEGIN{FIELDWIDTHS="2 3"}{print $1,$2}' указать фиксированное кол-во символов для разделения
lsof | awk '{if($7=="REG")print $0}' условие для выборки по столбцу
cat /etc/ssh/sshd_config | awk '/Port / {print $2}' условие поиска для вывода
cat /etc/ssh/sshd_config | awk 'length $0 > 1' вывести строки, которые длиннее, чем 1 символ (удалить пустые строки)
cat /var/log/syslog | grep "$date" | awk '{print length($6)}' вывести длинну значения
awk 'BEGIN{x = "low"; print toupper(x)}' использовать функцию для перевода в вверхний регистр
awk 'BEGIN{x = "LOW"; print tolower(x)}' использовать функцию для перевода в нижний регистр
echo "1 2 3 4:5:6" | awk '{item=$4; split(item,array,":"); print array[2]}' разбить 4 значение на массив (используя функцию split) и забрать значение по 2-му индексу
free | awk '{if (NR == 2) print $0}' вывести только вторую строку
free | awk '{if (NR >= 2) print $0}' вывести втроую и последующие строки
free | awk '{if (NF >= 5) print $0}' вывести строки, где 5 или больше значений
cat /etc/passwd | awk '{ if (NR >= 10 && NR <= 20) print $0}' вывести с 10 по 20 строки
last | sed -n 1p | awk '$2=" ",$4=" "{print $0}' вывести все, кроме 2 и 4 значения (заменить)
ps -A | awk '{sum=""; for(i=1;i<=NF;i++) { if (i != 2) {sum=sum" "$i} } print sum}' вывести все, кроме 2-го значения
perl
Perl - это интерпретируемый язык программирования, который может использоваться для написания программ с C-подобным синтаксисом, так и в однострочных конструкциях для обработки текста в Bash-скриптах.
| Ключ | Описание | Пример Perl | Аналог (grep/sed/awk) |
|---|---|---|---|
-ne | Поиск и печать нужных строк (как grep) | ls -lh / | perl -ne 'print if /root/' | ls -lh / | grep root |
-pe | Замена текста во всем файле (как sed) | ls -lh / | perl -pe 's/root/admin/g' | ls -lh / | sed 's/root/admin/g' |
-ane | Разбить строку на массив (как awk) | ls -lh / | perl -ane 'print "$F[8] $F[4]\n"' | ls -lh / | awk '{print $9,$5}' |
-F: | Указать разделитель полей | cat /etc/passwd | perl -ane 'print "$F[8] $F[4]\n"' -F: | cat /etc/passwd | awk -F: '{print $2,$1}' |
.. | Диапазон строк | cat /etc/passwd | perl -ne 'print if 1..5' | sed -n '1,5p' или awk 'NR==1, NR==5' |
next | Отрицание (пропуск строк) | cat /etc/ssh/sshd_config | perl -ne 'next if /^#/; print' | grep -Ev "^$|^#" или sed "/^#|^$/d" |
BEGIN/END | Подсчет количества строк | ls -lh | perl -ne '$s++; END{print $s}' | ls -lh | awk '{s++} END{print s}' |
Пример доступа к структуре данных в формате json:
docker inspect lifailon/docker-socket-proxy:arm64 | perl -MJSON::PP -0 -e 'print decode_json(<>)->[0]{Config}{Image}'
curl
curl ifconfig.me узнать внешний ip
curl -v telnet://192.168.3.100:22 проверить доступность порта с помощью протокола telnet
echo -e "Subject: Test\n\nThis is test body" | curl smtp://localhost:2525 --mail-from admin@docker.local --mail-rcpt admin@docker.local --user admin:admin -T - проверить отправку почты с помощью протокола smtp
curl -sS https://httpbingo.org/headers подавить вывод статистики/загрузки (--silent) и отображать только вывод ошибок (--show-error)
curl -sSI https://raw.githubusercontent.com/Lifailon/lazyjournal/main/scripts/install.sh отправить запрос HEAD (--head) вместо GET для отображения статуса и заголовков ответа (не возвращяет тело ответа)
curl -sSi https://httpbingo.org/headers вернуть заголовки и тело ответа
curl -s -o /dev/null -w "%{http_code}\n" https://httpbingo.org/basic-auth/username/password вернуть только статус ответа (например, 401 - ошибка авторизации)
curl -sSf https://httpbingo.org/post выйти с ошибкой (--fail), если код не равен ОК 200 (например, 405 - метод не поддерживается)
curl -sSf -X POST https://httpbingo.org/post изменить метод запроса на POST
curl -sSLI https://github.com/Lifailon/lazyjournal/releases/download/0.8.6/lazyjournal-0.8.6-linux-arm64 переходить по редиректах (--location) и узнать размер файла в content-length curl -sSO --limit-rate 5m https://raw.githubusercontent.com/Lifailon/hwstat/rsa/hwstat.sh скачать файл, используя оригинальное название (--remote-name) и ограничив загрузку в 5 МБайт
curl -sSL https://raw.githubusercontent.com/Lifailon/hwstat/rsa/hwstat.sh -o hwstat.sh указать название файла (--output)
curl -sS --unix-socket /var/run/docker.sock http://localhost/version отправить запрос на локальный UNIX socket
curl -sSLk $url игнорировать ошибку самоподписанного сертификата SSL (--insecure)
curl -sSLk $url --cert client.crt --key client.key --cacert ca.pem использовать сертификаты для запроса curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" https://httpbingo.org/headers подменить заголовок запроса User-Agent
curl -H "Authorization: Bearer token" https://httpbin.org/bearer передать токен в заголовке запроса для авторизации (--header)
curl -u username:password https://httpbingo.org/basic-auth/username/password авторизация (--user)
curl -H "Authorization: Basic $(echo -n username:password | base64)" https://httpbingo.org/basic-auth/username/password авторизация с помощью заголовка запроса
curl -x "http://user:pass@192.168.3.100:9090" "https://kinozal.tv/rss.xml" использовать proxy-сервер
curl -s "http://qbit:8888/api/v2/auth/login" --max-time 1 -c cookies.file -H "Referer: $QB_ADDR" -d "username=$QB_USER&password=$QB_PASS" 1> /dev/null передать данные авторизации в теле запроса (--data) и сохранить файл cookie для последующего использования в запросах
curl -s "http://qbit:8888/api/v2/app/version" -b cookies.file использовать файл cookie
curl --data-binary @config.conf https://httpbingo.org передать файл в исходном виде с переносом строк (байт в байт)
Пример отправки данных в базу временных рядов InfluxDB:
ip="192.168.3.104"
db="dbash"
table="icmp_metrics_table"
server="google.com"
host=
while ; do
date="000000000"
ping=
loss=
if ; then
status="true"
rtt=
else
status="false"
rtt="0"
fi
# Table Tag (string/int) Field (double/int) TIMESTAMP
done
netcat
nc -zv 192.168.3.100 5985 проверить порт без попытки соединения (-z) в подробном режиме (-v)
nc -zvn 192.168.3.100 1-1000 2>&1 | grep succeeded сканирование TCP-портов, не используя преобразование DNS (-n)
nc -zvnu 192.168.3.100 5550-5560 сканирование UDP-портов (-u)
nc -lp 8081 создать сокет (чат сервер) в режиме прослушивания (listen) с указанием номера порта (-p)
nc 192.168.3.101 8081 подключиться к сокету (чат-клиент)
nc -lp 8081 > out.txt все поступившие данные на сокет записываются в файл (вместо вывода в консоль)
cat /etc/passwd | nc -N 192.168.3.101 8081 передать содержимое файла на удаленный сокет принимающей стороны (содержимое /etc/passwd запишется в out.txt) и закрыть удаленный сокет (-N)
nc -w 5 -Uvl server.sock > out.txt создать UNIX-сокет и передать вывод в файл, сокет закроется через 5 секунд (-w 5) или если будет задан параметр -N на стороне клиента
lsblk | nc -Uv server.sock подключиться к локальному сокету с второго терминала и отправить вывод команды в файл сокета приема \
Пример API сервера:
PORT=8085
# Добавить обработку сигналов kill -2 (ctrl+c) и kill -15
while ; do
request=
request=
method=
endpoint=
if ; then
response="HTTP/1.1 405 Method Not Allowed\n\nMethod not supported on \n"
elif ; then
response="HTTP/1.1 200 OK\nContent-Type: text/plain\n\n"
elif ; then
response="HTTP/1.1 200 OK\nContent-Type: application/json\n\n"
elif ; then
response="HTTP/1.1 200 OK\nContent-Type: image/svg+xml\n\n"
else
response="HTTP/1.1 404 Not Found\n\n404 Not Found\n"
fi
|
done
curl -s http://localhost:8085/api/date
curl -s http://localhost:8085/api/disk | jq .blockdevices[]
Пример отправки метрик в базу данных временных рядов Graphite с помощью протокола UDP:
# StatsD (UDP)
# Формат: метрика:значение|type
# g (gauge) - запоминает последнее число
# c (counter) - счетчик, которй суммирует значение
# ms (timer) - считает среднее или перцентили
# s (set) - считает количество уникальных записей
# Хранятся в stats и stats_counts по указанном пути через точку
while ; do
|
done
Пример отправки метрик с помощью протокола TCP:
# Carbon (TCP)
# Формат: метрика значение timestamp
while ; do
|
done
Пример проброса порта (L4 Reverse Proxy) сервера (переадресует локальный порт 2222 на 22 удаленной машины):
Froxy - классический прямой и обратный прокси-сервер:
arch="x64" # или "arm64"
froxy --socks 1080 запустить SOCKS прокси-сервер на порту 1080
froxy --forward 8080 запустить HTTP/HTTPS прокси на порту 1080
froxy --forward 8080 >> froxy.log & запустить фоновый процесс и передать вывод логов в файл
froxy --local 5514 --remote 192.168.3.100:514 запустить обратный прокси сервер на порту 5514, который перенаправляет на хост 192.168.3.100 и порт 514 (syslog)
froxy --local 192.168.3.100:2121 --remote 192.168.3.101:21 TCP туннелирование для RDP
froxy --local 127.0.0.1:8443 --remote https://example.com принимать HTTPS трафик на порту 8443 и переадресовать на указанный URL (поддерживаются GET и POST запросы с передачей заголовков и тела запроса от клиента, для использования API запросы и прохождения авторизации на сайтах используя cookie)
froxy --local *:8443 --remote https://example.com --user admin --pass admin слушать на всех интерфейсах и использовать авторизацию
jq
jq - это язык запросов для работы с JSON.
apt install jq
nodes=$(curl -s -H "Accept: application/json" https://check-host.net/nodes/ips) получить список node
echo $nodes | jq обработка входных данных командой jq (вывод отображается в правильно структурированном формате, а все элементы подсвечиваются соответствующим цветом)
echo $nodes | jq '.nodes | length' количество дочерних объектов в блоке node[]
echo $nodes | jq -r .nodes[1] получить значение второго объекта массива в формате raw string вместо JSON
echo $nodes | jq -r .nodes[-1] получить значение последнего объекта массива
hosts=$(curl -s -H "Accept: application/json" https://check-host.net/nodes/hosts) получить список всех хостов
echo $hosts | jq -r '.nodes | to_entries[].key' получить список всех вложенных ключей (адреса хостов) из объека (не является массивом)
echo $hosts | jq -r '.nodes | to_entries[].value' получить только значения всех вложанных ключей
echo $hosts | jq '.nodes."bg1.node.check-host.net"' получить значение дочернего ключа nodes по имени
echo $hosts | jq '.nodes | [.[]] | last' преобразовать отдельные объекты внутри nodes в массив, и передать полученный вывод в функцию last для получения значений последнего объекта
echo $hosts | jq '.nodes | to_entries[].value.location[0] == "ru"' проверить каждый элемент объекта в условии на true/false (вернет массив)
echo $hosts | jq '.nodes | to_entries[] | {Host: .key, Country: .value.location[1], City: .value.location[2]}' получить данные key-value из объекта nodes и пересобрать массив с новыми значениями ключей
echo $hosts | jq -r '.nodes | to_entries[] | "\(.key) (\(.value.location[1]), \(.value.location[2]))"' собрать массив строки из содержимого ключей
var="-" && echo $hosts | jq --arg v "$var" -r '.nodes | to_entries[] | "\(.key) \($v) \(.value.location[1]) \($v) \(.value.location[2])"' передать внешнюю переменную, которая будет использоваться внутри запроса
echo $hosts | jq -r '.nodes | to_entries[] | select(.value.location[0] == "ru") | .key' произвести фильтрацию с помощью функции select(), чтобы получить только нужные объекты
echo $hosts | jq '.nodes | to_entries[] | select(.value.location[0] != "ru") | .key' вывести объекты, которые не равны значению
echo $hosts | jq '.nodes | length' вывести общее количество объектов
echo $hosts | jq '.nodes | to_entries | map(select(.value.location[0] != "ru")) | length' создать массив функцией map() (объеденяет отдельные объекты {}{} группируются в один массив [{},{}]) только из тех объектов, которые соответствуют условию select() и вывести количество найденных объектов
echo $hosts | jq -r '.nodes | to_entries[] | select(.value.location[0] == "ru" or .value.location[0] == "tr") | .key' проверить два условия через or или and (для проверяемого типа данных int кавычки не используются)
echo $hosts | jq -r '.nodes | to_entries[] | select(.key | index("jp")) | .key' вывести список хостов региона Japan, которые в названии ключа содержат ключевое слово jp (частичное совпадение в значении)
echo '{"iso": [{"name": "Ubuntu", "size": 4253212899}, {"name": "Debian", "size": 3221225472}]}' | jq '.iso[] | {name: .name, size: (.size / 1024 / 1024 / 1024 | tonumber * 100 | floor / 100 | tostring + " GB")}' получить ГБ из байт и округлить вывод до 2 символом после запятой
echo '{"iso": [{"name": "Ubuntu", "progress": 0.333}]}' | jq '.iso[] | {name: .name, progress: (.progress * 100 | floor / 100 * 100 | tostring + " %")}' получить процент из дробной части (33%)
echo '[{"name": "Ubuntu", "added_on": 1625072400}, {"name": "Debian", "added_on": 1625158800}]' | jq '.[] | {name: .name, date: (.added_on + 3 * 3600 | strftime("%H:%M:%S %d.%m.%Y"))}' получить дату
jc
jc - инструмент для преобразования вывода популярных инструментов командной строки в JSON, YAML или словари Python, что позволяет передавать вывод в такие инструменты, как jq.
apt install jc
dig google.com | jc --dig
dig example.com | jc --dig | jq -r '.[].answer[].data'
jc --pretty /proc/meminfo
systemctl list-units --all --plain --no-legend --no-pager | jc --systemctl -p
yq
yq - это язык запросов для YAML, JSON, XML, CSV, TOML, INI и HCL.
snap install yq
cat /etc/netplan/*.yaml | yq .network.ethernets список адаптеров в конфигурации netplan
cat /etc/netplan/*.yaml | yq .network.ethernets.eth0.nameservers.addresses[] вывести массив dns адресов, настроенные на адаптере
curl -s https://kinozal.tv/rss.xml -x kinozal:proxy@192.168.3.100:9090 | yq -p xml .rss.channel.item[1].link вывести ссылку из первого элемента
curl -s https://raw.githubusercontent.com/JingWangTW/dark-theme-editor/main/hugo.toml | yq -p toml .params.footer.socialLink прочитать конфигурацию Hugo
xq
xq - это инструмент командной строки для запросов к XML и HTML в стиле jq.
apt-get install xq || brew install xq
curl -s https://kinozal.tv/rss.xml -x kinozal:proxy@192.168.3.100:9090 | xq -nx /rss/channel/item вывод содержимого дочерних элементов с тегами
curl -s https://kinozal.tv/rss.xml -x kinozal:proxy@192.168.3.100:9090 | xq -x /rss/channel/item/link вывести только содержимое (массив ссылок)
curl -s https://kinozal.tv -x kinozal:proxy@192.168.3.100:9090 | xq -nq "head" вывести блок head целиком (с тегами)
curl -s https://kinozal.tv -x kinozal:proxy@192.168.3.100:9090 | xq -q "head" вывести только текст из дочерних элементов выбранного тега (содержимое title)
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:proxy@192.168.3.100:9090 | xq -nq "body > div > div > div > div > table > tbody > tr > td"
curl -s -X POST -u "Login:Password" "http://localhost:9091/transmission/rpc" | xq -q a -a href забрать X-Transmission-Session-Id для дальнейших запросов к API (обратиться к тэгу a и атрибуту href)
htmlq
htmlq - это язык запросов для HTML в стиле jq.
brew install htmlq
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:proxy@192.168.3.100:9090 | htmlq table tr td a -t получить содержимое таблицы (вывести только текст содержимого)
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:proxy@192.168.3.100:9090 | htmlq table tr td a -a href получить только ссылки
curl -s -X POST -u "Login:Password" "http://localhost:9091/transmission/rpc" | htmlq a -a href забрать X-Transmission-Session-Id для дальнейших запросов к API (обратиться к тэгу a и атрибуту href)
dasel
dasel - это инструмент для обработки JSON, YAML, TOML, XML и CSV c поддержкой конвертации между форматами.
brew install dasel
echo '{"name": "Tom"}' | dasel -r json 'name'
echo '{"name": "Tom"}' | dasel -r json -w yaml конвертировать json в yaml
echo '{"name": "Tom"}' | dasel -r json -w xml конвертировать json в xml
echo '{"name": "Tom"}' | dasel put -r json -t string -v 'contact@tomwright.me' 'email' добавить свойство
echo '{"email": "contact@tomwright.me","name": "Tom"}' | dasel delete -r json '.email' удалить свойство
tee users.json <<EOF
EOF
dasel -f users.json -r json ".users.[0].email"
tee users.yaml <<EOF
users:
- name: Иван Иванов
email: ivan.ivanov@example.com
- name: Мария Петрова
email: maria.petrova@example.com
EOF
dasel -f users.yaml -r yaml ".users.[1].email"
<EOF
[[]]
= "Иван Иванов"
= "ivan.ivanov@example.com"
[[]]
= "Мария Петрова"
= "maria.petrova@example.com"
dasel -f users.toml -r toml ".users.[1].email"
tee users.xml <
Иван Иванов
ivan.ivanov@example.com
Мария Петрова
maria.petrova@example.com
EOF
dasel -f users.xml -r xml ".users.user.[0].email"
Системная информация
| Команда | Описание |
|---|---|
cat /etc/hostname | Имя хоста |
cat /etc/hosts | Локальная таблица преобразовани ip в имя |
cat /etc/hosts.{allow,deny} | Белый список адресов и ограничение доступа к внешним сервисам (echo "in.telnetd: 192.168.3., .domain.ru" >> /etc/hosts.allow) |
cat /proc/net/arp | Локальная таблица сопоставления ip c MAC-адресом |
hostnamectl | Подробная информация о системе (Operating System, Kernel, Architecture) |
lsb_release -a | Версия дистрибутива |
cat /etc/os-release | Описание дистрибутива и версия ОС в формате ключ=значение |
cat /proc/version | Версия ядра и дистрибутива |
uname или arch | Выводит архитектуру процессора формате x86_64 или aarch64 |
dpkg --print-architecture | Выводит архитектуру процессора формате amd64 или arm64 |
lscpu | Подробная информация о процессоре в yaml формате |
nproc | Кол-во ядер |
cat /proc/cpuinfo | Информация по ядрам процессора |
uptime | Выводит время работы системы, кол-во залогиненных пользователей и LA - средняя загрузка системы за последние 1, 5 и 15 минут на 1 ядро |
cat /proc/loadavg | Выводит LA, 4-е значение - это кол-во процессов выполняемых в данный момент/общее количество процессов в системе и последнее значение, это PID последнего созданного процесса |
cat /proc/cmdline | Содержит имя файла образа ядра и его параметры запуска, которые были указаны в приглашении загрузчика GRUB |
cat /proc/stat | Выводит общую статистику работы CPU с момента последней загрузки (user/nice/system/idle/iowait/irq/softirq/steal_time/guest/guest_nice) |
dmidecode -t bios | Информация о системе (system/baseboard/processor/memory) или использовать bios-vendor |
dmidecode -t baseboard | Версия материнской платы, Video, Sound и их статус |
lsusb -vt | Информация о USB устойствах (Bluetooth адаптер, мышка, клавиатура, принтеры) |
lspci | Информация о PCI устройствах (подключенные к материнской плате компьютера по шине PCIe) |
lshw -short | Информацию по каждому PCI устройству |
lshw -class bus | Материнская плана и USB устройства, а также display (VGA controller), ё и disk |
cat /proc/partitions | Выводит таблицу со списком всех блочных устройств (дисков) и их разделов, которые ядро распознало в системе на данный момент |
cat /proc/asound/cards | Выводит список всех звуковых карт и аудиоинтерфейсов, которые распознало ядро через систему ALSA |
ls /sys/class/net | Список сетевых интерфейсов |
cat /proc/net/dev | Список сетевых интерфейсов и их статистика (bytes, packets, errs, drop) для Receive (приема) и Transmit (передачи) |
ethtool -S ens33 | Статистика сетевого интерфейса (ip down для сброса статистики и выгрузить модуль ядра с драйверов modprobe -r module и ip up) |
ethtool -i ens33 | Драйвер сетевой карты |
ethtool ens33 -p 60 | Включить светодиод на сетевой карте на 60 секунд |
lsmod | Выводит информацию из файла /proc/modules, какие дополнительные драйверы и функции сейчас загружены |
modinfo ip_tables | Выводит информацию о конкретном модуле |
cat /sys/block/sda/stat | Статистика диска sda (аналогично stat -f /dev/sda) |
ls /etc/*modprobe* | Содержит конфигурационные файлы со списками модулей ядра |
cat /etc/services | Список всех сервисов и сопоставленных с ними портов в системе (`cat /etc/services |
cat /etc/mime.types | Список сопосталвения файлов и их программ (`cat /etc/mime.types |
ls -l /dev | grep sd | Список всех дисков и разделов в файловой системе |
cat /proc/diskstats | Статистика дисков |
cat /proc/buddyinfo | Информация о фрагментации памяти в ядре Linux, спользуется для диагностики проблем с фрагментацией памяти |
cat /proc/cgroups | Отображает информацию о текущих контрольных группах (cgroups), которые ядро использует для ограничения и изоляции ресурсов (CPU, память, ввод-вывод) для процессов |
who -Ha | Выводит список пользователей, вошедших в систему в данный момент из системного файла /etc/utmp |
who -b | Выводит дату и время последней загрузки операционной системы |
last | Выводит историю перезагрузок (-n 5 reboo), выключений (shutdown) и авторизации (требуется пакет wtmpdb, который хранит данные в SQLite) |
history | Выводит историю выполняемых команд |
history -a | Добавить историю команд текущей сессии в файл ~/.bash_history, не дожидаясь завершения сессии |
history -c | Очистить текущую историю в оперативной памяти |
history -r | Перечитать файл истории заново |
Набор скриптов без установки, для быстрого получения информации о системе:
|
|
|
|
|
|
&&
Системные настройки
sysctl -a отобразить все настройки ядра Linux, где представленны все параметры в виде переменных, имена переменных соответствуют пути файла в директории /proc/sys (вместо слеша в переменной используется точка)
sysctl net.ipv6.conf.all отобразить сетевые настройки для протокола IPv6
sysctl -w net.ipv6.conf.all.disable_ipv6=1 отключить протокол IPv6 до перезагрузки системы (аналогично echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6)
sysctl -w net.ipv6.conf.ens33.disable_ipv6=1 для интерфейса ens33
sysctl --system обновление информации из файлов/вернуть значения переменных до состояния сохраненного в файлах (удалить временные изменения с помощью команды sysctl)
sysctl -p /etc/sysctl.d/system-custom-tuning.conf загрузить настройки из указанного файла
# Количество выделенных файловых дескрипторов (сколько файлов открыто в системе на текущий момент), неиспользуемых дескрипторов и максимальное количество (определяется в file-max)
# Количество открытых дескрипторов у процессора PID 1
|
# Текущее количество активных асинхронных операций ввода-вывода (I/O) к диску
Настройки в файле /etc/sysctl.d/system-custom-tuning.conf
.vsyscall32=1
.file-max=9223372036854775807
.nr_open=1073741816
.aio-max-nr=65536
.min_free_kbytes=45056
.swappiness=60
.vfs_cache_pressure=100
.dirty_background_ratio=10
.dirty_ratio=20
.dirty_expire_centisecs=3000
.dirty_writeback_centisecs=500
.ipv4.ip_default_ttl=64
.ipv4.ip_no_pmtu_disc=0
.ipv4.tcp_mem= 93579 124775 187158
.ipv4.icmp_echo_ignore_all=0
.ipv4.icmp_echo_ignore_broadcasts=1
.ipv4.icmp_ignore_bogus_error_responses=1
.ipv4.conf.all.accept_redirects=0
.ipv4.ip_forward=1
.ipv4.conf.default.forwarding=1
.ipv4.ip_local_port_range=32768 60999
.ipv4.tcp_max_tw_buckets=32768
.ipv4.tcp_max_orphans=32768
.ipv4.tcp_orphan_retries=0
.ipv4.tcp_fin_timeout=60
.ipv4.tcp_syncookies=1
.ipv4.tcp_fastopen=1
.ipv4.tcp_max_syn_backlog=512
.core.somaxconn=4096
.ipv4.tcp_syn_retries=6
.ipv4.tcp_synack_retries=5
.core.netdev_max_backlog=1000
Лимиты
Limits - это ограничения на использование системных ресурсов (процессорного времени, оперативной памяти, количества открытых файлов и т. д.), которые накладываются на процессы или пользователей.
cat /etc/security/limits.conf | grep -Ev "^$|^#"
<user/@group> <soft/hard> <core/rss/as/nproc/cpu> <value>
@zabbix soft nofile 65535@zabbix hard nofile 65535* soft nofile 2048* hard nofile 8192
soft as 100hard as 100
* soft msgqueue unlimited* hard msgqueue unlimited
* soft nproc unlimited* hard nproc unlimited
hard maxlogins 1* hard maxsyslogins 1ulimit -a отобразить список ограничений
file size (blocks, -c) 0
seg size (kbytes, -d) unlimited
priority (-e) 0
size (blocks, -f) unlimited
signals (-i) 15052
locked memory (kbytes, -l) 496180
memory size (kbytes, -m) unlimited
files (-n) 1024
size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
priority (-r) 0
size (kbytes, -s) 8192
time (seconds, -t) unlimited
user processes (-u) 15052
memory (kbytes, -v) unlimited
locks (-x) unlimited
ulimit -Sn отобразить значение текущего Soft (-S) ограничения для nofile (-n)
ulimit -Hn отобразить Hard (-H) ограничение
ulimit -n 3000 изменить ограничение количества открытых файлов для одного процесса (до перезагрузки)
ulimit -Sm 1500000 изменить soft (-S) ограничение оперативной памяти (-m) в 1500 Мб для пользователя
ulimit -u 5000 ограничение максимального количества запущенных пользовательских процессов (-u)
ulimit -s ограничение места для размера аргументов (stack size) команды/скрипта (bash: /usr/bin/diff: Argument list too long)
ulimit -m максимальный объем оперативной памяти
ulimit -v максимальный объем виртуальной памяти
ulimit -f максимальный размер создаваемых файлов
ulimit -t максимальное количество процессорного времени
systemctl edit rsyslog ограничения на уровне Unit для конкретного сервиса
[Service]
1617596
1617596
systemctl restart rsyslog
pid=$(ps -A | grep rsyslogd | awk '{print $1}') получить pid процесса
cat /proc/$pid/limits проверить применение ограничений после перезапуска сервиса
Квоты
Quotas - это ограничения на использование дискового пространства.
nano /etc/fstab примонтировать раздел на который необходимо установить квоту с указанными опциями
/dev/sda / ext4 defaults,usrquota,grpquota 0 0
mount -o remount,rw / перемонтировать файловую систему в режиме чтения (read) и записи (write)
mount | grep quota вывести список примонтированных устройств с фильтрацией по настройкам квот
quotacheck -favugm выполнить проверку наличия служебных файлов aquota.user и aquota.group (если их нет, команда создаст файлы автоматически)
quotaon -avug включить квоту
edquota -u lifailon создать квоту для пользователя или для группы (-g) на размер данных и кол-во файлов
quotas for user lifailon (uid 1000):
blocks soft hard inodes soft hard
/dev/mapper/ubuntu--vg-ubuntu--lv 397112 400M 500M 3004 0 0
edquota -p lifailon user скопировать квоту на другого пользователя
edquota -t изменить период отсрочки soft квоты до момента, когда она станет hard (по умолчанию 7 дней)
quota lifailon -s отобразить квоты для пользователя
repquota -us / просканировать файловую систему и увидеть, кто из пользователей (-u) или групп (-g) потребляет больше всего места
# Space limits File limits
# used soft hard used soft hard
# +- достигнут space limits
# -+ достигнут file limits
# Создать файл размером 400MB
)
Systemd
Hostnamed
systemctl status systemd-hostnamed статус работы сервиса управления сетевым именем
hostnamectl выводит краткую сводку о системе
hostnamectl set-hostname srv-01.docker.local изменить имя сервера с сохранением в файле /etc/hostname при перезагрузке системы
Resolved
systemd-resolved - это локальный DNS-резолвер (заглушка stub resolver на локальном адресе 127.0.0.53), которая кеширует DNS-запросы и обеспечивает шифрование (DoT). Она перезаписывает файл /etc/resolv.conf при каждой загрузки системы и является символической ссылкой на файл-заглушку /run/systemd/resolve/stub-resolv.conf.
systemctl status systemd-resolved статус работы сервиса
journalctl -u systemd-resolved логи работы и кеша DNS
resolvectl status вывести список DNS-настроек для всех интерфейсов
resolvectl status | grep "Current DNS"
resolvectl dns wlan0 1.1.1.1 временно сменить DNS адрес на адаптере
resolvectl query google.com проверить резолвинг (покажет, через какой протокол UDP или TCP и какой сервер прошел запрос)
resolvectl monitor выводит статистику запросов на сервере в реальном времени
resolvectl statistics отобразить статистику кеша и количество транзакций (внешние запросы для резолвинга имени)
resolvectl show-cache вывести содержимое кеша
resolvectl flush-caches очистить локальный кеш DNS
Настройка конфигурации в файле /etc/systemd/resolved.conf
[Resolve]
DNS=
yes
/etc/resolv.conf - главный конфигурационный файл в системе, для настройки внешних DNS-резолверов.
Чтобы изменения в файле не перезатирались после перезагрузки системы, нужно отключить службу systemd-resolved и удалить симлинк rm /etc/resolv.conf && touch /etc/resolv.conf.
Timedated
timedatectl - это клиент системной службы systemd-timedated.service, предназначенный для управления системным временем и даты.
timedatectl текущее время
timedatectl list-timezones список часовых поясов
timedatectl set-timezone 'Europe/Moscow' изменить временную зону на MSK, +0300 (изменится Local time)
timedatectl set-ntp no отключить NTP-синхронизацию
timedatectl set-time "13:00:00" указать время вручную, после отключения NTP
timedatectl set-ntp yes включить NTP service
Настройка синхронизации в файле /etc/systemd/timesyncd.conf
[Time]
NTP=ntp.msk-ix.ru 0.ru.pool.ntp.org
ntp.ubuntu.com
Применить настройки и отобразить статус:
Analyze
systemd-analyze отображает статистику времени загрузки ядра и userspace (пользовательского пространства)
systemd-analyze time суммарное время на запуск системы
systemd-analyze blame --no-pager отобразить все процессы и отсортировать по времени загрузки
systemd-analyze plot > systemd-analyze.svg создать векторный отчет в формате Scalable Vector Graphics
Cgroups
systemd-cgtop аналог top для cgroups (Control Groups), который выводит, сколько ресурсов (CPU и RAM) потребляет конкретный сервис, а не просто процесс
systemd-cgtop -d 5 -m обновлять вывод каждые 5 секунд и сортировать по памяти (--order=memory)
systemd-cgtop -n 1 -P вывести 1 раз и cчитать только процессы пользователей (игнорировать потоки ядра)
systemd-cgls (Control Group List) - выводит дерево всех запущенных процессов, сгруппированных по их принадлежности к конкретным сервисам в cgroups.
systemd-path выводит стандартные пути в системе (где лежат конфиги, логи и т.д.)
systemd-delta находит различия между дефолтными конфигами и правками в /etc
systemd-sysusers декларативный процесс создания УЗ (ищет файлы .conf в директориях /usr/lib/sysusers.d/ и /etc/sysusers.d/). Если в конфиге указан пользователь, которого еще нет в /etc/passwd, создаст его.
echo "password" | sudo systemd-creds encrypt - pass.cred сохранить пароль в файл с использованием TPM2 (Trusted Platform Module), который использует ключ внутри микросхемы на материнской плате для шифрования
systemd-creds decrypt pass.cred при переносе диска на другую систему, расшифровать файл будет невозможно, потому что на новой плате другой TPM чип с другим ключом
Systemctl
systemctl reload ssh отправка сигнала SIGHUP (-1) для обновления конфигурации сервиса из /etc/ssh/sshd_config без разрыва текущих соединений (если у юнита поддерживается эта функция)
systemctl status ssh отображает путь к юниту, статус его работы, автозагрузки, потребление ресурсов, CGroup и лог
systemctl restart ssh/systemctl start ssh запуск или перезапуск юнита (до перезагрузки)
systemctl stop ssh остановка юнита (до перезагрузки)
При остановки процесса используется сигнал SIGTERM (-15) или любой другой, который будет указан в параметре KillSignal (например, прерывание KillSignal=SIGINT, который используется при нажатии Ctrl+C) для процесса, который указан параметр KillMode. По умолчанию используется KillMode=control-group, который завершает главный и все созданные им дочерние процессы (одновременно всей группе), или только родительский процесс (Main PID), используя KillMode=process, что бы сохранить установленные соединения, созданные дочерними процессами.
По умолчанию systemd ждет 90 секунд (указывается в параметре юнита TimeoutStopSec или глобально с помощью DefaultTimeoutStopSec в файле /etc/systemd/system.conf), если сервис за это время не ответит, systemd посылает сигнал SIGKILL (-9), при котором ядро сразу убивает процесс.
systemctl enable ssh добавить в автозагрузку, на основе группы в секции [Install] создает симлинк на реальный файл сервиса в системе (Created symlink '/etc/systemd/system/multi-user.target.wants/ssh.service' → '/usr/lib/systemd/system/ssh.service')
systemctl disable ssh удалить из автозагрузки
systemctl mask ssh выключить юнит, который нельзя будет запустить вручную или разбудить другим сервисом как зависимость (создает симлинк на /dev/null)
systemctl unmask ssh включить юнит (удалить симлинк)
systemctl cat ssh отобразить путь и содержимое unit-файла
systemctl edit --full ssh открыть юнит-файл для редактирования
systemctl daemon-reload перечитать все файлы юнитов с диска и перестроить дерево зависимостей
systemctl list-dependencies ssh отобразить дерево зависимостей для запуска указанного юнита (например, сначала должен быть запущен ssh.socket)
systemctl list-dependencies ssh --reverse отобращить сервисы, зависящие от указанного юнита
systemctl list-units --all --no-pager --type service отображение статуса всех сервисов
systemctl list-units --all --no-pager --type service --state=active вывести список только работающих сервисов
systemctl list-units --all --no-pager --user --type service список пользовательских сервисов (--user)
systemctl list-unit-files список всех юнит-файлов на диске с их текущим статусом работы при загрузке системы (STATE) и по умолчанию (PRESET) сразу после установки пакета
systemctl list-unit-files --all --no-pager --type=service,timer отфильтровать по сервисам и таймерам
systemctl list-unit-files --all --no-pager --type=service --state=enabled вывести список сервисов, которые добавлены в автозагрузку
systemctl preset ssh.service привести STATE к состоянию, указанному в PRESET
Scope
systemd-run превращает скрипт в временный изолированном сервис (scope) для ограничения ресурсов
systemd-run --scope -p MemoryMax=500M bash ./script.sh запустит скрипт с выводов в терминал
systemd-run --scope -p CPUQuota=20% stress --cpu 4 лимит на процессорное время в процентах
systemd-run --unit=backup bash ./backup.sh запускает сервис в фоне с возможность просмотра логов и будет удален после его завершения
journalctl -u backup
Unit
cat /etc/systemd/system.conf глобальные настройки юнитов, которые будут использоваться по умолчанию
/etc/systemd/system- юниты системного администратора (наивысший приоритет) и симлинки, созданные черезsystemctl enable/run/systemd/system- временные юниты вruntime(средний приоритет), например, созданные с помощьюsystemd-run/lib/systemd/system/или/usr/lib/systemd/system/- юниты поставляемые вместе с системой и при установки с помощью менеджера пакетов, например,apt(низкий приоритет, их содержимое будет обновлено при вызове командыapt upgrade)
Разбор юнита ssh.service:
[Unit]
OpenBSD Secure Shell server
man:8) man:5)
network.target nss-user-lookup.target auditd.service
!/etc/ssh/sshd_not_to_be_run
[Service]
-/etc/default/ssh
/usr/sbin/sshd -t
/usr/sbin/sshd -D $SSHD_OPTS
/usr/sbin/sshd -t
/bin/kill -HUP $MAINPID
process
on-failure
255
notify
sshd
0755
[Install]
multi-user.target
sshd.service
Создание юнита для проверки интернета: /root/scripts/icmp-check.sh
#!/bin/bash
ADDRESS=""
TIMEOUT=""
|| { ; ; }
while ; do
date=
loss=
if [; then
else
fi
done
Создание сервиса для скрипта: /etc/systemd/system/icmp-check.service
[Unit]
ICMP/ping checker
network.target
[Service]
/root/scripts/icmp-check.sh google.com 5
/bin/kill -HUP $MAINPID
process
on-failure
notify
10
[Install]
multi-user.target
icmpd.service
Запуск сервиса:
Timer
Timer - это современная замена cron, которая отправляет по расписанию команду start сервисам.
Создаем юнит для обновления пакетов: /etc/systemd/system/apt-upgrade-daily.service
[Unit]
Update and upgrade system packages
network-online.target
network-online.target
network-online.target
[Service]
oneshot
/usr/bin/apt-get update
-/usr/bin/apt-get upgrade -y
/bin/sh -c 'echo "System packages updated successfully" | systemd-cat -t apt-upgrade-daily -p info'
10min
root
root
/tmp
no
1G
50%
[Install]
multi-user.target
Создаем таймер для автоматизации запуска: /etc/systemd/system/apt-upgrade-daily.timer
[Unit]
Update and upgrade system packages by daily timer
[Timer]
*-*-* 06:00:00
true
[Install]
timers.target
systemctl list-timers --all отображает расписание всех таймеров
NEXT- дата и время следующего запланированного запускаLEFT- сколько времени осталось до следующего запускаLAST- время, когда таймер срабатывал в последний разPASSED- сколько времени прошло с момента последнего запускаUNIT- название файла таймераACTIVATES- название сервиса, которую этот таймер запускает
# Добавить таймер в автозагрузку (добавляет в расписание) и сразу включить его (--now как systemctl start)
# Запустить сервис вручную (не дожидаясь срабатывания таймера)
# Вывести лог запуска самого таймера
# Вывести лог работы сервиса (срабатывания и stdout приложений)
# Вывести лог приложения из ExecStartPost по тегу
# Отключить таймер (удалить из списка расписания)
# systemctl disable apt-upgrade-daily.timer
Path
Path следит за изменениями в указанном файле и запускает указанный юнит на выполнение, после чего засыпает до следующего изменения.
Создаем юнит для бэкапов: /etc/systemd/system/homepage-backup.service
[Unit]
Backup homepage config
[Service]
oneshot
/usr/bin/cp -r /home/lifailon/docker/homepage/homepage_config /tmp/homepage_backup
[Install]
multi-user.target
Создаем юнит для отслеживания изменений: /etc/systemd/system/homepage-monitor.path
[Unit]
Monitor homepage config and backup files
[Path]
/home/lifailon/docker/homepage/homepage_config/services.yaml
homepage-backup.service
[Install]
multi-user.target
Включаем:
Mount
systemd-mount /dev/sdb1 /mnt/data монтирование дисков через systemd (создает временный .mount юнит)
systemctl status mnt-data.mount
systemd-umount /mnt/data
У юнитов монтирования есть жесткое правило именования, которое должно в точности повторять путь до директории монтирования, заменяя / на -.
/etc/systemd/system/mnt-backup.mount
[Unit]
Mount remote SMB share
network-online.target
network-online.target
[Mount]
///Backup
/mnt/backup
cifs
credentials=/etc/samba/creds,iocharset=utf8,rw,file_mode=0777,dir_mode=0777
[Install]
multi-user.target
systemctl enable --now mnt-backup.mount
Если в момент загрузки системы SMB-сервер недоступен или потеряно соединение, монтирование не произойдет или директория будет отмантирована и необходимо будет монтировать вручную systemctl start mnt-backup.mount.
Используя automount, монтирование производится в момент обращения к папке.
/etc/systemd/system/mnt-backup.automount
[Unit]
Mount remote SMB share
[Automount]
/mnt/backup
300
[Install]
multi-user.target
systemctl enable --now mnt-backup.automount
journald
journald - это служба, которая собирает и хранит логи в бинарном формате, которые можно читать и фильтровать с помощью утилиты journalctl.
Запись
systemd-cat - перехватывает STDOUT и отправляет его демону systemd-journald
# Определить tag и уровень логирования
|
Фильтрация
journalctl --system отобразить системный журнал
journalctl --user отобразить пользовательский журнал для текущего пользователя
journalctl -em отобразить записи из всех доступных журналов (--merge) с конци (--pager-end)
journalctl -ek отобразить только сообщения ядра (--dmesg) для текущей загрузки
journalctl -et systemd фильтрация по тегу
journalctl -ep 3 фильтрация по уровню логирования - 0 (emerg), 1 (alert), 2 (crit), 3 (err), 4 (warning), 5 (notice), 6 (info), 7 (debug)
journalctl -S "2023-09-01 12:00:00" -U "2023-09-01 15:00:00" фильтрация по времени с (--since) 1 сентября 12:00:00 по (--until) 15:00:00
journalctl --since today отобразить сообщения за сегодня
journalctl --list-boots вывести список сохраненных загрузок системы
journalctl -b отобразить сообщения с момента последней загрузки системы (--boot)
journalctl -b ba6b2292a0e84d83a81cedfaa221926f показать сообщения с момента конкретной загрузки системы
systemctl --type=help вывести список доступных типов юнитов
systemctl list-units --all --no-legend --no-pager --type=service,timer --output=json | jq -r .[].unit вывести список имет всех юнитов с фильтрацией по типу юнитов
journalctl -eu ssh фильтрация журнала по названию юнита (--unit)
Ротация
journalctl -n 1 --no-pager --output=json-pretty вывод всех доступных полей для последнего значения в формате JSON
journalctl --fields вывести список всех используемых полей по которым возможна фильтрация вывода в системе (SYSLOG_IDENTIFIER, UNIT, USER_UNIT, _UID, _PID, _COMM, _EXE, _CMDLINE и т.д.)
journalctl --field SYSLOG_IDENTIFIER вывести список доступных значений для фильтрации
journalctl SYSLOG_IDENTIFIER=dockerd фильтрация вывода по полю
journalctl -e _PID=3972315 фильтраци по PID процесса
journalctl -e _EXE=/usr/sbin/cron фильтраци по исполняемому файлу
journalctl --disk-usage вывести общее использование диска всеми файлами журнала (Archived and active journals take up 2.8G in the file system)
journalctl --flush сбросить логи из оперативной памяти (/run) на диск (/var)
journalctl --relinquish-var прекратить запись в /var/log/journal и переключиться обратно на хранение в оперативной памяти (/run/log/journal), например, при выключение системы
journalctl --verify проверить целостность файла журнала
journalctl --vacuum-time=1month удалить файлы журнала, старше указанного времени (1-го месяца)
journalctl --vacuum-size=100M очистить логи, чтобы размер хранилища соответствовал указанному размеру
journalctl --vacuum-files=100 оставить только указанное количество файлов журнала
journalctl --rotate запустить немедленную ротацию файлов журнала
journalctl --sync синхронизировать незаписанные сообщения журнала на диск
journalctl --header вывести список журналов на диске
- File path - путь к файлу журнала на диске
- Boot ID - уникальный ID загрузки, к которой относится файл
- State - состояние файла (
ONLINE- открыт для записи,ARCHIVED- закрыт) - Rotate suggested - применяется ли ротация к журналу
- Tail sequential number - последовательный номер для конца журнала
- Head realtime timestamp - время первого события в журнале
- Tail realtime timestamp - время последнего события в журнале
- Objects - общее количество всех структур (записей, данных, индексов) в файле
- Entry objects - количество фактических строк лога
- Data objects - количество уникальных значений данных.
- Field objects - количество уникальных типов полей
- Disk usage - используемое пространство на диске для этого журнала
Конфигурация
Настройка логирования в файле /etc/systemd/journald.conf
[Journal]
auto
yes
yes
uid
5m
30s
10000
3G
1G
15%
100
100
1month
1month
yes
no
no
yes
/dev/console
debug
debug
notice
info
emerg
debug
48K
yes
yes
sudo systemctl restart systemd-journald
journalctl _TRANSPORT=audit просмотр журнала аудита после включения в конфигурации (из файла /var/log/audit/audit.log)
auditd
auditd (Linux Audit Daemon) - нативный инструмент мониторинга событий операционной системы и записи их в журналы событий от компании RedHat, который наблюдает за системными вызовами и может записывать события чтения, записи, выполнения и изменение прав.
apt install auditd
sudo auditctl -w /etc/hosts -p rwa -k hosts_access создаем правило мониторинга для файла /etc/hosts
sudo auditctl -a always,exit -F path=/etc/hosts -F perm=rwa -k hosts_access отслеживать системные вызовы (syscall) относящиеся к файлу (работает быстрее)
r read Чтение файла
w write Запись / изменение содержимого
x execute Исполнение файла (программы)
a attribute Изменение атрибутов (chmod, chown и т.п.)
auditctl -l вывести список всех правил
auditctl -D удаляет все активные правила аудита
ausearch -k hosts_access --format text вывести лог событий
At 19:03:07 04/01/26 system, acting as root, successfully opened-file /etc/hosts using /usr/bin/ping
ausearch -k hosts_access --format interpret подробный вывод лога
type=PROCTITLE msg=audit()
type=PATH msg=audit()
type=CWD msg=audit()
type=SYSCALL msg=audit()|) ses=unset comm=ping exe=/usr/bin/ping subj=unconfined key=hosts_access
type=PROCTITLE msg=audit()
type=PATH msg=audit()
type=CWD msg=audit()
type=SYSCALL msg=audit()
syscall=openat- название вызоваsuccess=yes- операция прошла успешноexit=5- ядро вернуло дескриптор файла №5a2=O_RDONLY|O_CLOEXEC- файл открыт только для чтения (O_RDONLY)ppid=4018 / pid=4019- ID родительского процесса и дочернего процесса вызоваauid=unset- Audit User ID (unsetзначит действие совершил системный процесс или демон, а не пользователь поssh)tty=(none)- команда выполнена не в интерактивном терминале (фоновым скриптом или системной службой)
aureport вывести отчет
# Мониторинг отказа доступа (permission denied) к файлам во всей систем
# Ошибки типа operation not permitted
# Мониторинг использования sudo (x)
# Мониторинг добавления/изменения/удаления пользователей
# Мониторинг изменений (wa) системных настроек (файлы конфигурации)
dmesg
dmesg -Tx прочитать логи буфера сообщений ядра из /var/log/dmesg (используется для записи во время загрузки системы пока сервис Syslog еще не запущен)
dmesg -Tx -l crit,err отфильтровать вывод
dmesg -E включить логирование ядра в консоль (--console-on)
dmesg -D отключить (--console-off)
dmesg -n 1 изменить уровень логирования для печати в консоль
dmesg -u отображать вывод из программ окружения пользователя
dmesg -w выводить журнал в реальном времени
rsyslog
systemctl status rsyslog
Настройка сервера (listener) в файле /etc/rsyslog.conf
load="imudp")
type="imudp" port="514")
$RepeatedMsgReduction off
$template RemoteLogs,"/var/log/remote/%fromhost-ip%/syslog.log"
*.* ?RemoteLogs
systemctl restart rsyslog
Настройка клиента в файле /etc/rsyslog.d/all.conf
*.* @192.168.3.101:514
logrotate
systemctl status logrotate.timer
Настройка глобальных параметров ротации в файле /etc/logrotate.conf
weekly
root adm
4
create
dateext
compress
include /etc/logrotate.d
Ротация файлов в конфигурации /etc/logrotate.d/logrotate_remote.conf
/var/log/remote/*/*.log {
root root
daily
copytruncate
10M
3
compress
dateext
}
Условия запуска:
size 10M- размер лога для срабатывания ротацииhourly- запускать каждый часdaily- запускать каждый деньweekly- запускать каждую неделюmonthly- запускать каждый месяцyearly- запускать каждый год
Условия хранения:
maxage 30- количество последних дней для хранения файлов (остальные удалять), самостоятельно не ининициирует ротациюrotate 3- хранить указанное количество последних ротированных лог-файлов (остальные удалять)create- создать пустой лог файл на месте старогоcopytruncate- копирует содержимое основного файлаapp.logв новый файлapp.log.1, а затем обрезает оригинальный файлapp.logдо нулевого размера, сохраняя дескрипторcompress- сжимать ротированный лог с помощьgzipdelaycompress- не сжимать последний журналapp.log.1olddir /tmp/log- перемещать логи в отдельную папку при срабатывании условияdateext- добавляет дату ротации в конце названия файловmissingok- не выдавать ошибки, если лог-файла не существуетprerotate script.sh endscript- скрипт, который необходимо выполнить перед чисткой логаpostrotate script.sh endscript- скрипт, который необходимо выполнить после чистки лога
logrotate -d /etc/logrotate.d/logrotate_remote.conf проверить ротацию (--debug)
logrotate -fv /etc/logrotate.d/logrotate_remote.conf запустить ротацию сейчас (--force) с подробным выводом (--verbose)
cat /etc/cron.daily/logrotate задание запуска создается автоматически, который читает конфигурационный файл ротации /etc/logrotate.conf (в нем указана директрия: include /etc/logrotate.d в которой лежат файлы ротации)
Менеджеры пакетов
apt
ls -l /var/lib/apt/periodic/update-success-stamp дата последнего выполнения apt update
ls -lh /var/cache/apt местоположение кеша пакетов apt
history | grep "apt update" история запуска команды обновления
apt list --installed список установленных пакетов
apt-mark showauto список автоматически установленных пакетов
apt-mark showmanual список пакетов, установленных вручную
echo $(($(apt-mark showauto | wc -l) + $(apt-mark showmanual | wc -l))) количество всех установленных пакетов
apt update обновить список всех установленных пакетов из источников, указанных в файле конфигурации /etc/apt/sources.list
apt list --upgradable отобразить список, для каких пакетов доступны обновления
apt install --only-upgrade powershell обновить один выбранный пакет
apt --fix-broken install исправить проблемы и ошибки с зависимостями
apt full-upgrade обновляет все пакеты, которые уже установлены в системе (доставляет новые пакеты зависимости и удаляет пакеты, которые устанавливались в систему и уже не используются)
apt install net-tools установить пакет
apt download net-tools скачать пакет без установки
apt install net-tools --reinstall переустановить пакет
apt remove net-tools удалить пакет (конфигурационные файлы, которые были изменены в системе удалены не будут)
apt purge net-tools полностью удалить пакет, вместе со всеми его конфигурационными файлами
apt policy net-tools отобразить какая версия установленна и какие доступны
apt install net-tools=number ver установить конкретную версию
apt autoremove очистить ненужные пакеты, которые система не использует
apt autoclean очистить кеш пакетов
dpkg
dpkg -i spark.deb установить указанный пакет
dpkg -l отобразить список установленных deb-пакетов
dpkg -l | wc -l количество установленных пакетов
dpkg -l spark проверить, установлен ли пакет в системе и его версию
dpkg -s spark проверить статус пакета
dpkg -r spark удалить deb-пакет
dpkg -P spark удалить пакет вместе с фаилами конфигурации
dpkg -L spark отобразить путь, куда установлен пакет
snap
ls /snap директория пакетов
ls /var/lib/snapd/snaps расположение загруженных пакетов в формате snap
snap install snap-store установка магазина приложений
snap find nmap поиск приложения в магазине snap
snap info nmap информация о пакете (его наличии, версия, дата релиза и размер)
snap list список установленных в системе пакетов
snap list --all nmap отобразить все доступные версии для указанного пакета
snap install nmap --stable установить конкретную версию пакета
snap refresh nmap обновить пакет до последней версии
snap revert nmap откатить версию до предыдущей
snap connections nmap посмотреть доступность приложения к интерфейсам системы
snap remove nmap удалить пакет
Учетные записи
Авторизация
sudo -u www-data выполнить команду от имени другого пользователя
su root войти под пользователем root
sudo su переключиться на root (используется .bashrc текущего пользователя)
sudo -i переключиться в консоль от имени root (будет выполнен его .bashrc и .profile)
/etc/passwd - содержит список всех пользователей зарегистрированных в системе
/etc/group содержит список всех групп пользователей
/etc/shadow хранит пароли пользователей в зашифрованном виде (если * или !, пользователь не сможет войти в систему с использованием аутентификации по паролю, другие методы входа, например, на основе ssh-ключей или переключение на пользователя разрешены).
Синтаксис shadow: логин:пароль:дата последней смены пароля:минимальный срок действия пароля:максимальный срок действия пароля:период предупреждения:период бездействия:срок хранения.
/etc/login.defs" - настройка поведения утилиты управления пользователями и параметрами входа в систему (настройки минимального и максимального id для выдачи новому пользователю и группе, количество попыток входа, таймау, что делать с директорий пользователя при создании или удалении и т.п.)
cat /etc/login.defs | grep -Pv "^$|^#"
PASS_MAX_DAYS- максимальное кол-во дней действия пароляPASS_MIN_DAYS- минимальное количество дней допустимое между сменами пароляPASS_WARN_AGE- количество дней, предупреждающих об истечении срока действия пароляPASS_MIN_LEN/PASS_MAX_LEN- ограничения длины паролейLOGIN_RETRIES- максимальное кол-во попыток входа при вводе неправильного пароляLOGIN_TIMEOUT- время на входLOG_OK_LOGINS- включить логирование успешных входо в системуLOG_UNKFAIL_ENAB- включить логирование неизветных имен для системы пользователей при неудачных попытках входа
Управление паролями
passwd - используется пользователями для изменения своего пароля и администраторами для блокировки или разблокировки.
passwd lifailon смена пароля для указанного пользователя
passwd -S lifailon статус пароля для указанной УЗ
passwd -d lifailon удалить пароль
passwd -l lifailon заблокировать УЗ
passwd -u lifailon разблокировать УЗ
passwd -x 90 lifailon максимальный срок жизни пароя в днях
passwd -n 30 lifailon смена пароля разрешена не чаще 1 раза в 30 дней
passwd -w 5 lifailon установить количество дней предупреждения об истечении срока действия пароля до его окончания
chage (change age) - инструмент для настройки политик безопасности.
Получить информацию о последней смене пароля и срок его действия:
# Последняя смена пароля: 15 апреля 2025 г.
# Срок действия пароля истекает: никогда
# Пароль неактивен: никогда
# Срок действия учетной записи истекает: никогда
# Минимальное количество дней между сменами пароля: 0
# Максимальное количество дней между сменами пароля: 99999
# Количество дней предупреждения до истечения срока действия пароля: 7
chage -E lifailon установить дату истечения срока действия пользовательской учетной записи
chage lifailon -M 30 установки минимального (-m) и максимального (-M) срока действия пароля
Создание УЗ (useradd)
adduser username интерактивное создание пользователя, по умолчанию будет создан домашний каталог (/home/username), можно указать данные о пользователе и задать пароль
deluser username удалить пользователя (каталог не удаляется)
useradd -D отобразить параметры, которые будут применены для пользователя по умолчанию
useradd -o -u 0 -g 0 -s /bin/bash root2 создать нового пользователя с правами root
userdel -r root2 удалить пользователя и его домашний каталог (-r)
useradd -G adm,wheel -p password -s /bin/bash logger разрешить пользователю читать логи и пользоваться sudo
-o разрешить создание пользователя с неуникальными идентификаторами
-u указать идентификатор для пользователя
-g указать идентификатор группы
-p задать пароль пользователя
-G добавить пользователя в дополнительные группы
-N не создавать группу с именем пользователя
-s указать командную оболочку для пользователя (по умолчанию /bin/sh, можно указать /bin/bash)
-b указать базовый каталог для размещения домашнего каталога пользователя (по умолчанию в /home)
-d домашний каталог, в котором будут размещаться файлы пользователя
-m создавать домашний каталог пользователя, если он не существует
-c комментарий к учетной записи
-l не сохранять информацию о входах пользователя в lastlog и faillog
Управление УЗ (usermod)
id lifailon узнать UID и GID и в каких группах состоит пользователь
usermod -u 1022 kup изменить UID
groupmod -g 1022 kup изменить GID
- Блокировка/разблокировка:
usermod -L lifailon заблокировать вход по паролю (перед паролем пользователя в файле /etc/shadow добавляется !)
usermod --expiredate 1 -L lifailon заблокировать пользователя (не будет возможности авторизоваться через su - Authentication failure)
usermod --expiredate 2023-10-25 lifailon задать дату блокировки
usermod --expiredate "" -U lifailon разблокировать пользователя
- Изменить параметры УЗ:
usermod --password "NewPassword" lifailon изменить пароль
usermod -l lifailon failon изменить имя пользователя (-l)
usermod -d /root lifailon изменить домашнюю директорию пользователя (-d)
usermod -m -d /root lifailon переместить домашнюю директорию сохранив все содержимое (-m)
usermod -s /usr/bin/dash lifailon изменить оболочку по умолчанию (-s)
Управление группами
groups lifailon отобразить в каких группах находится указанный пользователь
usermod -g root lifailon изменить основную группу пользователя, изменяя GID (Primary Group ID)
usermod -aG plugdev lifailon добавить пользователя в дополнительную группу (-G) с доступом монтирования ФС без прав sudo (нужно использовать вместе с флагом -a, чтобы не перезатирать текущие группы)
gpasswd -a lifailon plugdev добавить пользователя в группу
gpasswd -d lifailon plugdev удалить пользователя из группы
gpasswd -A lifailon plugdev сделать пользователя администратором группы (позволяет управлять группой без использования sudo)
groupadd test создать группу
delgroup test удалить группу, если ошибка 'test' still has test as their primary group! предварительно исключить из группы всех пользователей
Смена владельца (chown)
chown lifailon tmp изменить владельца на пользователя lifailon для директории tmp
chown lifailon:lifailon tmp изменить владельца и группу
chown -R lifailon:lifailon tmp применить изменения ко всем подкаталогам (-R)
chown --from=root:root lifailon:lifailon -R ./ изменить владельца и группу только для тех каталогов и файлов, у которых владелец и группа root в текущем каталоге
Права доступа (chmod)
Формат в выводе команды ls -l:
- --- --- ---
| | | |
тип файла права доступа пользователя (владельца) группы всех остальных
Права:
r- чтениеw- записьx- выполнениеs- выполнение от имени суперпользователя (дополнительный)
Владельцы:
u- пользователь и владелец файлаg- группа-владельц файлаo- все остальные пользователи
Формат:
---нет прав--xразрешено только выполнение файла, но не изменение и не чтение-w-разрешена только запись и изменение файла-wxразрешено изменение и выполнение (в случае с каталогом нельзя посмотреть его содержимое)r--права только на чтениеr-xтолько чтение и выполнение, без права на записьrw-права на чтение и запись, без права на выполнениеrwxвсе права--sустановленSUIDилиSGIDбит, первый отображается в поле для владельца, второй для группы--tустановленsticky-bit, значит пользователи не могут удалить этот файл
Управление:
+включить-отключить-Rпоменять права на все подкаталоги и файлы указанной директории
chmod u+x filename разрешить выполнение (x) для владельца (u)
chmod ugo+x filename разрешить выполнение (x) для всех (ugo)
chmod ug+r filename разрешить чтение (r) для владельца (u) и группы (g)
chmod o-w filename запретить запись (w) для всех остальных пользователей (o)
chmod -R g+rwx dir дать полный доступ (rwx) группе (g) на директорию и всем файлам в ней (-R)
Права доступа в восьмеричной системе (полностью переписывают текущие права новыми):
0 никаких прав
1 только выполнение
2 только запись
3 выполнение и запись
4 только чтение
5 чтение и выполнение
6 чтение и запись
7 чтение, запись и выполнение
chmod 744 filename разрешить полные права для владельца, а остальным только чтение
chmod 664 filename чтение и запись для владельца и группы, только чтение для остальных
Суперпользователь (sudo)
sudoers - конфигурационный файл (/etc/sudoers) для настройки прав доступа утилиты sudo
visudo открыть sudoers для редариктория
Defaults env_reset, timestamp_timeout=10 задать ограничение времени для sudo на 10 минут
Создать конфигурацию пользователя для использования sudo без пароля:
# Разрешить перезапуск определенного сервиса, обновление списка пакетов и установку обновлений системы
# lifailon ALL=NOPASSWD: /usr/bin/service memcahched restart, /usr/bin/apt-get update, /usr/bin/apt-get upgrade
# Доступ для группы
# %powerusers ALL=NOPASSWD: /usr/bin/service memcahched restart
visudo --check проверка синтаксиса и всех прав доступа (0440)
sudo -l вывести список команд, которые текущий пользователь может выполнять с использованием sudo
Профили
.bashrcфайл переменных конкретного пользователя.bash_profileпеременные вступают в силу каждый раз когда пользователь подключается удаленно поssh. Если этот файл отсутствует система будет искать.bash_loginили.profile./etc/environmentфайл для создания, редактирования и удаления каких-либо переменных окружения на системном уровне. Переменные окружения, созданные в этом файле доступны для всей системы, для каждого пользователя, в т.ч. при удаленном подключении./etc/bash.bashrcфайл выполняется для каждого пользователя, каждый раз когда он создает новую терминальную сессию. Это работает только для локальных пользователей, при подключении черезssh, такие переменные не будут доступны./etc/profileсистемный файл profile, все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно (черезssh). Они не будут доступны, при создании локальной терминальной сессии.
Процессы
strace
strace (system call trace) - это инструмент трассировки системных вызово при работе процессов в Linux, которое выводит каждое обращение программы к ядру Linux, например, для чтение или запись в файлы.
strace -c top -n 1 > /dev/null показывает статистику (-c) всех используемых системных вызовов при запуске программы (% time - процент от общего времени выполнения)
strace -e trace=openat uptime > /dev/null вывести подробный вывод с путями к файлам и фильтрацией доступа по O_RDONLY (= 3 - это номер файлового дескриптора внутри процесса)
strace -f -p $(pgrep -o sshd) -o ~/passwd.txt -v -e trace=write -s 64 процесс сниффинга (перехвата паролей), который следим за всеми процессами sshd (-f), ищем все PID для sshd процессов (-p), триггер только на запись данных (-e) в указанный файл и ограничиваем вывод 64 байтами
lsof
lsof (list open files) - утилита для доступа к таблице файловых дескрипторов, которая выводит список всех открытых в данный момент файлов и процессов, которые их используют (файловые дискрипторы), включая сетевые сокеты (открытые порты и соединения), pipes, FIFO, символьные и блочные устройства (терминалы, диски, /dev/null).
| Ключ | Описание | Пример |
|---|---|---|
-i | Список активных сетевых соединений (LISTEN и ESTABLISHED для TCP) | lsof -i |
-n | Не преобразовывать IP в доменные имена | lsof -ni |
-P | Не преобразовывать порты в названия протоколов | lsof -nPi |
-i :n | Показать процессы, использующие конкретный порт | lsof -i :443 |
-i@ip | Показать соединения с определенным IP-адресом | lsof -i@1.1.1.1 |
-U | Список только UNIX-сокетов | lsof -U |
-p pid | Список файлов, открытых конкретным процессом по его PID | lsof -p 1 |
-c proc | Список файлов, открытые процессом по его имени (команде) | lsof -c ssh |
-u user | Список файлов, открытых конкретным пользователем | lsof -u root |
+D path | Рекурсивный поиск открытых файлов внутри директории | lsof +D /var/log |
-t | Выводит только PID процессов для kill | lsof -t -i :80 |
-a | Логическое И для объединения с другими ключами | lsof -a -c docker-pr -i |
+L | Показать открытые удаленные файлы (deleted), которые занимают место | lsof +L1 |
fincore
util-linux-extra - пакет, который содрежит дополнительные утилиты из состава util-linux, которые не включены в базовый пакет для экономии места.
sudo apt install util-linux-extra
fincore /var/log/* отобразить все файлы, которые находятся в кеше страниц оперативной памяти (page cache)
fincore /var/log/syslog отображает данные файла, хранящиеся в памяти, кол-во страниц хранящиеся в памяти page cache и размер самого файла
fincore /var/log/syslog -J вывод в формате json
Скрипт рекурсивно выводит список всех файлов, которые сейчас находится в оперативной памяти:
fc=
| |
vmstat
vmstat (virtual memory statistics) - утилита командной строки для мониторинга количества активных и ожидающих процессов, использование физической и виртуальной памяти, буферов и кеша, интенсивности обмена данными с диском (подкачка страниц), количество блоков считанных или записанных на диск.
| Ключ | Описание | Пример |
|---|---|---|
-a | Активная/неактивная память (вместо буферов/кэша) | vmstat -a |
-f | Показать количество форков (процессов) с момента загрузки системы | vmstat -f |
-m | Вывод использования динамической памяти ядра (Slab allocator) | vmstat -m |
-s | Вывести таблицу счетчиков событий и статистики памяти | vmstat -s |
-d | Вывести подробную статистику активности дисков | vmstat -d |
-p | Статистика конкретного раздела диска | vmstat -p /dev/sda1 |
-D | Суммарная статистика по дисковой подсистеме | vmstat -D |
-S unit | Eдиниц измерения (k, K, m, M) | vmstat -S M |
-t | Добавить timestamp к каждой и зациклить вывод | vmstat -t |
n m | Обновлять каждые n секунд, m раз | vmstat -t 1 5 |
r(running) - количество процессов, которые выполняются или ждут очереди на CPU (статусR). Еслиr = 10при 4 ядрах процессора, значит 6 процессов прямо сейчас ждут в очереди к CPU.b(blocked) - количество процессов в непрерываемом сне (статусD). Обычно они ждут ответа от диска. Еслиb > 0, система тормозит из-заI/O.swpd- объем памяти, вытесненный вSwap.free- объем свободной (пустой) памяти.buff- объем выделенной память под метаданные и промежуточные блоки диска (Buffers).cache- объем выделенной память под содержимое самих файлов (Page Cache).si(swap-in) - сколько данных перемещается изSwapвRAM.so(swap-out): сколько данных вытесняется изRAMвSwap.bi(blocks in) - скорость чтение данных с диска (блоков в секунду по умолчанию 1 КБ или МБ/с с флагом-S M).bo(blocks out) - скорость запись данных на диск.in(interrupts) - количество прерываний в секунду (работа железа/драйверов).cs(context switches) - количество переключений контекста.us(user) - работа пользовательских программ.sy(system) - работа ядра Linux.id(idle) - время простоя.wa(iowait) - ожидание диска. Если больше 0, значит CPU ждет медленный диск.st(steal) - время, заимствованное гипервизором.
ps
ps (process status) - это стандартная утилита командной строки, предназначенная для получения моментального снимка о текущих работающих процессах в системе.
| Ключ | Описание | Пример |
|---|---|---|
-e | Показать все процессы в системе | ps -e |
aux | Все процессы всех пользователей с %CPU и %MEM в стиле BSD | ps aux |
-f | Вывод с дополнительными полям (UID, PPID, C и STIME) | ps -ef |
-F | Добавляет к выводу поля памяти (SZ, RSS и PSR) | ps -eF |
-e | Фильтрация вывода по указанным полям | ps -eo pid,%cpu,rss,etime,args |
--sort | Сортировка по полю (префикс - для обратной сортировки) | ps -eo pid,%cpu --sort=-%cpu |
-u user | Список процессов конкретного пользователя (по имени или ID) | ps -Fu root |
-p pid | Показать процесс по его PID | ps -Fp 1 |
-C proc | Поиск процесса по имени исполняемого файла | ps -FC dockerd |
-L | Показать потоки (threads) процессов | ps -eFL |
-H | Отображает дерево процессов c отступами | ps -eFH |
axjf | Вывод в виде дерева с отображением связей (родитель/потомок) | ps axjf |
top
| Ключ | Описание | Пример |
|---|---|---|
-d n | Интервал обновления экрана в секундах | top -d 1 |
-n n | Завершить работу после указанного кол-ва циклов обновления | top -n 1 |
-b | Режим записи в файл для обработки скриптами (batch mode) | top -b -n 1 > top.log |
-c | Command. Показывает полный путь к исполняемому файлу и аргументы | top -c |
-i | Idle. Не показывать S (Sleeping) и Z (Zombie) процессы | top -i |
-H | Показывает все потоки (threads) процессов | top -H |
-u user | Показать процессы конкретного пользователя | top -u root |
-p pid | Мониторинг указанных PID через запятую | top -p 1,123 |
-o field | Сортировка по выбранному полю (например, %CPU или RES) | top -o %MEM |
htop
| Клавиша | Описание | Действие |
|---|---|---|
F1 | Help | Открыть справку по всем клавишам и функциям |
F2/S | Setup | Меню настроек (цвета, колонки, вид графиков в шапке) |
F3// | Search | Поиск процесса по названию (подсветка совпадений) |
F4/\ | Filter | Фильтрация списка (выводит только подходящие строки) |
F5 | Tree | Переключить режим отображения: список или дерево (аналогично ps -eFH или ps axjf) |
F6 | Sort | Открыть меню выбора поля для сортировки |
F7 | Nice - | Увеличить приоритет процесса (в диапазоне от -20 до 19, требует root при значение nice ниже 0) |
F8 | Nice + | Уменьшить приоритет процесса (увеличить значение nice) |
F9 | Kill | Открыть меню выбора все доступных системных сигналов для отправки процессу (например, 9 SIGKILL) |
SPACE | Select | Пометить (Tag) процесс для групповых действий (например, kill нескольких процессов) |
U | Untag | Снять теги выделения со всех процессов |
l | lsof | Вывести список файлов, которые используют процессы (файловые дискрипторы с номерами inode) |
s | strace | Трассировка системных вызовов (syscalls) процесса в реальном времени |
L | ltrace | Трассировка вызовов библиотечных функций процесса |
e | Environ | Показать переменные окружения процесса (аналогично команде cat /proc/<PID>/environ) |
u | user | Фильтр процессов из меню списка пользователей |
M | MEM sort | Сортировать по использованию оперативной памяти |
P | CPU sort | Сортировать по нагрузке на процессор |
T | Time sort | Сортировать по времени работы процесса |
I | Invert | Инвертировать текущий порядок сортировки |
i | IO Prior | Изменить приоритет ввода-вывода (ionice) для выбранного процесса |
K | Kernel | Скрыть/показать потоки ядра (kernel threads) |
H | Threads | Скрыть/показать пользовательские потоки (user threads) |
p | Paths | Показать полный путь к исполняемому файлу |
Z | Pause | Приостановить/возобновить обновление экрана |
iotop
iotop - это top для отображения операциий ввода-вывода (I/O) процессов к дисковой подсистеме.
apt install iotop
| Ключ | Описание | Пример |
|---|---|---|
-o | Показывает процессы, которые реально совершают ввод-вывод | iotop -o |
-a | Сохраняет и накапливает метрики I/O с момента запуска | iotop -ao |
-d n | Интервал обновления экрана в секундах n | iotop -d 5 |
-n n | Количество итераций перед выходом (используется с -b) | iotop -on 1 |
-b | Неинтерактивный режим для логирования в файл (batch mode) | iotop -obn 1 > io.log |
-t | Добавить метку времени (timestamp) для каждой строки | iotop -obt |
-q | Cкрыть заголовки и общую сводку для логирования | iotop -obtqqq |
-p pid | Мониторинг ввода-вывода только конкретных PID | iotop -p 123,456 |
-u user | Показать активность диска только для конкретного пользователя | iotop -u mysql |
-P | Показать только процессы и скрыть потоки (threads) | iotop -P |
sysstat
sysstat - это пакет инструментов для мониторинга ресурсов Linux.
apt install sysstat
Состав утилит:
sar(System Activity Reporter) - собирает, сохраняет и выводит отчеты по всей активности системы (CPU, RAM, сеть, диски) за текущий день или прошлые периоды.iostat- отчеты по загрузке процессора и статистике ввода-вывода (I/O) для дисковых устройств и разделов.mpstat- детальная статистика по каждому ядру процессора.pidstat- статистика для конкретных процессов (потреблениеCPU, памяти, стека, дисковый ввод-вывод процесса).tapestat- статистика по ленточным накопителям (стримерам).cifsiostat- отчеты о производительности сетевых файловых систем (CIFS/SMB).nfsiostat- статистика для сетевой файловой системыNFS.
iostat
| Ключ | Описание | Пример |
|---|---|---|
-h | Вывод в формате перевода байт в МБ и ГБ | iostat -h |
-c | Показать только отчет об использовании процессора (CPU) | iostat -c |
-d | Показать только отчет об использовании дисков (Device) | iostat -d |
-x | Показать расширенную статистику (util, await, svctm) | iostat -x |
-p | Показать статистику для конкретного устройства и его разделов | iostat -p sda |
-o | Вывод в формате JSON | iostat -p /dev/sda3 -o JSON |
-t | Добавить метку времени (timestamp) для каждого отчета | iostat -t |
-y | Пропустить первую строку (статистика с момента загрузки ОС) | iostat -y 1 5 |
-z | Скрыть устройства, у которых нет активности (нулевые значения) | iostat -z |
-N | Показать имена LVM групп вместо имен сопоставленных устройств | iostat -N |
n m | Обновлять каждые n секунд, m раз | iostat 1 10 |
mpstat
mpstat (multiprocessor statistics) - это утилита для мониторинга равномерного распредиления нагрузки на каждое ядро, для поиска, кто тормозит - пользовательское приложение (%usr), операционная система (%sys), ожидание диска (%iowait) или аппаратные прерывания (%irq или %soft), что может указывать на проблемы с сетевой картой или драйверами.
| Ключ | Описание | Пример |
|---|---|---|
-P ALL | Показать статистику по каждому ядру процессора отдельно | mpstat -P ALL |
-P n | Показать статистику только для конкретного ядра n | mpstat -P 0 |
-u | Показать только статистику использования (CPU utilization) | mpstat -u |
-I CPU | Показать количество прерываний на каждое ядро | mpstat -I CPU |
-I SUM | Показать общее количество прерываний на систему | mpstat -I SUM |
-A | Эквивалент -I ALL -u -P ALL | mpstat -A |
stress
stress - это утилита за утилизации основных системных ресурсов (процессора, оперативной память и дискового ввода-вывода) с целью проверки стабильности системы под нагрузкой.
sudo apt install stress
| Ключ | Описание | Пример |
|---|---|---|
-c n | CPU. Запустить n воркеров, загружающих процессор (sqrt) | stress -c 4 |
-i n | IO. Запустить n воркеров, нагружающих ввод-вывод (sync) | stress -i 2 |
-m n | MEM. Запустить n воркеров, выделяющих память (malloc) | stress -m 2 |
--vm-bytes | Объем памяти, выделяемый каждым воркером (по умолчанию 256M) | stress -m 1 --vm-bytes 1G |
-d n | Disk. Запустить n воркеров, активно пишущих файлы | stress -d 1 |
--hdd-bytes | Размер временных файлов для воркеров диска | stress -d 1 --hdd-bytes 5G |
-t n | Автоматически завершить работу через n секунд (--timeout) | stress -c 1 -t 60 |
-q | Quiet. Тихий режим (минимум вывода в консоль) | stress -q -c 2 |
-v | Verbose. Подробный вывод о работе каждого воркера | stress -v -c 1 |
stress-ng
stress-ng - современная версия утилиты stress, содержащая сотни специализированных тестов для глубокого стресс-тестирования практически каждого компонента системы (от кэша процессора и сетевых протоколов до специфических системных вызовов ядра).
apt-get install stress-ng
| Ключ | Описание | Пример |
|---|---|---|
-c n | CPU. Запустить n воркеров для нагрузки процессора | stress-ng -c 4 |
--cpu-method | Выбор алгоритма нагрузки (matrix, fft, jmp, all) | stress-ng -c 1 --cpu-method fft |
-m n | VM. Запустить n воркеров для нагрузки оперативной памяти | stress-ng -m 2 --vm-bytes 1G |
-d n | HDD. Запустить n воркеров для нагрузки на запись/чтение | stress-ng -d 2 --hdd-bytes 5G |
-i n | IO. Нагрузка на системные вызовы ввода-вывода | stress-ng -i 4 |
--net n | Network. Нагрузка на сетевой стек (отправка пакетов) | stress-ng --net 2 |
--matrix n | Matrix. Стресс-тест процессора через матричные вычисления | stress-ng --matrix 1 |
--switch n | Context Switch. Нагрузка на переключение контекста | stress-ng --switch 4 |
--timeout n | Автоматическая остановка теста через n секунд (или m, h) | stress-ng -c 4 -t 60s |
--temp-path | Указать путь для временных файлов (например, на RAM) | stress-ng -d 1 --temp-path /dev/shm |
--class c | Запустить все стрессоры для cpu, os или io | stress-ng --class cpu --sequential 4 |
--sequential n | Запускать стрессоры по очереди (вместо параллельного) | stress-ng --sequential 2 |
--metrics-brief | Вывести краткую статистику производительности (bogo-ops) | stress-ng -c 2 -t 10s --metrics-brief |
-v | Verbose. Подробный лог того, что делает утилита | stress-ng -v -c 1 |
smartmontools
Smartmontools - это набор из консольной утилиты smartctl и демона smartd для мониторинга состояния жестких дисков (HDD) и твердотельных накопителей (SSD) через технологию S.M.A.R.T..
apt install smartmontools
| Ключ | Описание | Пример |
|---|---|---|
-i | Info. Показать общую информацию о диске (модель, серийник, S.M.A.R.T. статус) | smartctl -i /dev/sda |
-H | Health. Быстрая проверка: прошел диск внутренний тест здоровья или нет | smartctl -H /dev/nvme0 |
-a | All. Вывести всю доступную информацию, атрибуты и результаты тестов | smartctl -a /dev/sda |
-x | eXtended. Максимально подробный отчет, включая лог ошибок и статистику | smartctl -x /dev/sdb |
-A | Attributes. Показать только таблицу S.M.A.R.T. атрибутов для HDD | smartctl -A /dev/sda |
-l error | Error log. Показать список последних зарегистрированных ошибок диска | smartctl -l error /dev/sda |
-l selftest | Test log. Показать результаты ранее запущенных тестов | smartctl -l selftest /dev/sda |
-t short | Short test. Запустить короткую проверку | smartctl -t short /dev/sda |
-t long | Long test. Запустить полное сканирование поверхности диска | smartctl -t long /dev/sda |
-X | Abort. Прервать выполнение запущенного теста | smartctl -X /dev/sda |
-c | Capabilities. Показать возможности S.M.A.R.T. и примерное время тестов | smartctl -c /dev/sda |
-d type | Device type. Указать тип контроллера (ata, scsi, nvme, sat) | smartctl -d sat -a /dev/sda |
-s on | Enable. Включить поддержку S.M.A.R.T. на диске, если она выключена | smartctl -s on /dev/sda |
lm-sensors
lm-sensors (Linux monitoring sensors) - это пакет для систем на базе Linux, который позволяет считывать данные с аппаратных датчиков материнской платы и процессора.
apt install lm-sensors
sensors-detect сканировать датчики температуры
sensors отобразить датчики
Файловая система
find
find - утилита командной строки для поиска файлов и каталогов в файловой системе по различным критериям (имени, размеру, времени изменения, правам доступа, владельцу и другим параметрам).
Описание ключей:
| Ключ | Описание | Пример |
|---|---|---|
-name | Поиск по имени (с учетом регистра) | find . -name "file.txt" |
-iname | Поиск по имени (без учета регистра) | find . -iname "FILE.txt" |
-type | Тип объекта: f (файл), d (папка), l (ссылка) | find /etc -type f |
-size | Поиск по размеру (+ больше, - меньше, k, M, G) | find . -size +100M |
-mtime | Изменен n дней назад (- меньше или + больше) | find /var/log -mtime -2 |
-atime | Время последнего доступа (в днях) | find . -atime +30 |
-user | Поиск файлов, принадлежащих пользователю | find /home -user root |
-perm | Поиск по правам доступа | find . -perm 644 |
-maxdepth | Ограничить глубину поиска по директориям | find . -maxdepth 2 |
-empty | Найти только пустые файлы или директории | find . -type d -empty |
-not | Инвертировать условие (или использовать !) | find . -not -name "*.log" |
-exec | Выполнить команду для каждого файла (конец {} \;) | find . -name "*.sh" -exec chmod +x {} \; |
-delete | Удалить найденные объекты | find /tmp -mtime +7 -delete |
Примеры использования:
find / -name "*.sql" найти файлы, начать поиск с корня (/)
find / -iname "mysql" найти файлы не учитывая регистр (-i)
find ~ -name "test.*" -not -name "*.conf" найти все файлы с наименование test, которые имеют любое расширение, за исключением (-not) расширения .conf
find ~ -amin -10 поиск файлов по дате последнего чтения (-amin) которые просматривались за последние 10 минут (например, с помощью cat)
find ~ -type f -mmin -10 искать только файлы (-type f), которые были модифицированны за последние 10 минут (-nmin)
find ~ -type f -mtime +1 -mtime -7 найти все файлы, измененные в промежутке от 1 до 7 дней назад
find ~ -size +50M -size -100M поиск файлов по их размеру (от 50 до 100 Мбайт)
find / -perm 444 поиск файлов по режиму доступа (только чтение для всех)
find /home/lifailon/ -user root поиск файлов по владельцу
find /home/lifailon/ -group root поиск по группе
find /root/ -empty поиск пустых файлов или директорий
touch -t 202306222200.15 /tmp/test.txt создать файл с указанной датой создания
find /tmp -type f -mtime +30 -exec rm -f {} \; удалить все файлы, котоыре не изменялись больше 30 дней
find /tmp -type f -name "*.txt" -exec rm -f {} \; удалить все текстовые файлы в директории tmp
dd if=/dev/zero of=/var/log/test.log count=11 bs=1M создать файл заполненный нулями указанного размера (11 Мбайт)
find /var/log -type f -name "*.log" -size +10M -exec rm -f {} \; удалить все лог-файлы, объемом больше 10 Мбайт
fd
fd - быстрая альтернатива find на Rust
apt install fd-find установить
Описание ключей:
| Ключ fd | Ключ find | Описание | Пример |
|---|---|---|---|
-e | -name "*.ext" | Поиск по расширению файла (extension) | fdfind -e jpg |
-H | - | Включить в поиск скрытые файлы и папки (hidden) | fdfind -H config |
-I | - | Игнорировать правила .gitignore | fdfind -I secret |
-t | -type | Тип объекта: f (файл), d (дир), l (ссылка), x (исп) | fdfind -t d backup |
-x | -exec {} \; | Выполнить команду для каждого результата (exec) | fdfind -e txt -x rm или fd -e txt | xargs rm |
-X | -exec {} + | Выполнить команду один раз, передав все файлы как аргументы | fdfind -e txt -X tar -cvf texts.tar |
-g | -name | Использовать подстановочные знаки (glob) вместо регулярок | fdfind -g "*.log" |
-i | -iname | Игнорировать регистр | fdfind -i "Data" |
-p | -path | Искать совпадение во всем пути, а не только в имени файла | fdfind -p "src/main" |
-d | -maxdepth | Ограничить глубину поиска (max-depth) | fdfind -d 2 "node" |
-S | -size | Поиск по размеру файла (+ больше, - меньше) | fdfind -S +1G |
-c | - | Цветовой вывод (always, auto, never) | fdfind -c always |
-a | - | Показать абсолютный путь вместо относительного | fdfind -a "script.sh" |
-L | -L | Следовать по символическим ссылкам (follow) | fdfind -L "link_name" |
Поиск в интерфейсе fzf с помощью fd:
# fdfind over fzf
if ; then
# Alt+F for fd-fzf
# Alt+Shift+F for rga-fzf
if ; then
fi
fi
locate
plocate - альтернатива стандартного mlocate с более быстрым по скорости поиском файлов и меньшим по размеру базой данных для хранения индексов (как Everything в Windows).
apt install plocate
updatedb обновить индексы базы данных
ls -lh /var/lib/[mp]locate/*.db проверить размер базы данных
locate .torrent найти по частичному совпадению в имени или расширению
locate -c .torrent отображает количество найденных результатов
locate -n 10 .torrent вывести 10 результатов
locate -i Kinozal-Bot игнорировать регистр
locate -r "\.log$" использовать регулярные выражения при поиске
du/df/lsblk
du -h /home отображает общий размер указанной директории и подкаталогов внутри директории
du -ah /home отобразить общий размер всех дочерних директорий и файлов (-a) в директориях
du -sh /home отобразить общий размер только указанной директории (-s)
tree -h --du /home
df (disk free) - работает на уровне файловых систем и отображает общий объем (Size), занятого (Used) и свободно (Avail) пространства только для примонтированных разделов
df -h -T отобразить Type файловой системы (ext4/cifs)
lsblk (list block) - отображает список всех подключенных блочных устройств из директории /dev (devices), которые имеют файловую систему или могут ее содержать, а также их размер, тип (disk/part/lvm) и точку монтирования (MOUNTPOINTS) в системе.
lsblk -a вывести список всех блочных устройств
lsblk -f отображает используемую файловую систему (FSTYPE), версию, UUID, а также FSAVAIL - сколько свободно на диске и FSUSE - сколько занято на диске в процентах
lsblk -e7 вывод без loop устройств
lsblk -o NAME,SIZE --nodeps -e7 фильтровать вывод и вывести без структуры разделов (--nodeps)
lsblk -Jbe7 выводить SIZE в байтах (--bytes) и формате JSON (--json)
lsblk -S вывести информацию о SCSI-устройствах (--scsi)
lsblk -m вывести информацию о правах доступа
mount | grep /dev/ отобразить все примонтированные файловые системы
findmnt отобразить список смонтированных файловых систем в древовидном формате
e2label /dev/sda3 узнать метку диска
blkid отобразить список подключенных дисков, их UUID и TYPE
lsscsi отобразить параметры SCSI устройств подключенных к системе
dust
dust - альтернатива du на Rust для визуализации и анализа занятого пространства.
snap install dust
| gdu
gdu - анализатор использования диска, написанный на Go с поддержкой навигации по директориям.
|
&&
| | dd
dd if=/dev/sr0 of=/tmp/cd.iso bs=2048 сохранить образ диска (if=источник) в файл (of=назначение) с указанием кол-ва байт для чтения и записи за один раз (2 МБайт), по умолчанию используется размер блока 512 байт (2b блока = 1024 байт, 1k = 1 КБайт/1024 байт, 1kB = 1000 байт, 1M = 1024 КБайт/1 МБайт)
dd if=/dev/mem bs=2048 count=100 вывести содержимое оперативной памяти на экран (не использовать файл)
dd if=/dev/zero of=/tmp/md-01 bs=4M count=256 создать файл заполненный нулями (из /dev/zero) размером 1 ГБ с указанием кол-во копируемых блоков (bs*count) или очистить диск
dd if=/dev/random of=/tmp/md-02 bs=4M count=256 создать файл размером 1 ГБ заполненный рандомными цифрами
dd if=/dev/sda of=/tmp/mbr.img bs=1b count=1 скопировать в файл первые 512 байт диска содержащие таблицу разделов MBR
dd if=/dev/sda of=/tmp/sda.img создать образ жесткого диска, используетася для полного backup системы (копирование раздела на двоичном уровне,включая таблицу MBR и всю пустую область диска и разделов)
Backup системного диска:
- Смонтировать внешний носитель для создания образа:
mount /dev/sdb1 /mnt/disk_b - Создать образа диска (
.img):dd if=/dev/sda of=/mnt/disk_b/disk.img bs=5M - Подключить новый диск для записи образа на диск (записать образ на диск с
sdb1наsdc):dd if=/mnt/disk_b/disk.img of=/dev/sdc bs=5M - Извлечь физический диск или удалить виртуальный диск
sda(системный) иsdb(с записью образа). Дискsdcс копией системы автоматически инициализируется как дискsdaпосле перезагрузки системы. - Сжать образ:
gzip disk.img(все нули сожмутся полностью, что удобно для хранения backup, поддерживает только.img) - Создать сжатый образ системы:
dd if=/dev/sda conv=sync,noerror bs=5M | gzip -c > /mnt/disk_b/disk.img.gz - Развернуть образ на диск:
gunzip -c /mnt/disk_b/disk.img.gz | dd of=/dev/sdс
Backup через nc (netcat):
nc -lp 5000 | sudo dd of=/backup/sda.img.gz сохранение сжатого файла образа жесткого диска sdb на удаленном сервере (принимающая сторона)
dd if=/dev/sda | gzip -c | nc 192.168.21.121 5000 на узле, у которого установлен жесткий диск (передающая сторона)
nc -lp 5000 | gunzip -c | sudo dd of=/dev/sdb восстановление содержимого жесткого диска из сжатого образа (записывать не на системный диск), сохраненного на удаленном сервере на локальном узле (принимающая сторона)
cat /backup/sda.img.gz | nc my_local_host.com 5000 на удаленном сервере, на котором сохранен файл образа жесткого диска (передающая сторона)
Создание ISO образа:
dd if=/dev/sda3 status=progress of=/mnt/disk_b/disk.iso bs=5M создать iso-образ (сохранить образ раздел)
dd if=путь/к/образу.iso of=/dev/sdb1 записать ISO-образ ОС на внешнее устройство
sync завершить запись этой командой (чтобы при извлечении не потерять часть данных)
mount -o loop /mnt/disk_b/disk.iso /mnt/iso примонтировать файл образа только для чтения (iso - это директория, которую предварительно нужно создать), подключается как /dev/loop6
umount /mnt/iso отмонтировать
parted
parted (Partition Editor) - современный инструмент командной строки для управления таблицами разделов и самими разделами на жестких дисках, с поддержкой таблиц GPT (больше 2 ТБ) и динамическим изменением размера.
parted -l отобразить список всех разделов на дисках
parted -l | grep -i model
dd if=/dev/zero of=/tmp/disk.img count=1000 bs=1M создать образ диска заполненный нулями размером 1 Гб
parted /tmp/disk.img передать управление в parted созданный файл образа диска для управления ФС
parted /dev/sdc передать parted физический диск
mktable gpt создать таблицу разделов GPT
print отобразить тип таблицы (Partition Table: GPT) и список разделов на устройстве, если они были созданы
print free отобразить свободное место и все разделы
mkpart primary ext4 0 500M создать первичный (primary) /dev/sdc1 раздел с ФС ext4 размером 500 Мб.
mkpart primary ext4 500 1000M создать второй раздел /dev/sdc2 (указать начало и конец)
resizepart 2 600M уменьшить 2-й раздел на 100 МБ (указывается end-конец)
resizepart 2 100% увеличить до всего свободного размера
rm 2 удалить раздел
resize2fs /dev/sdc2 расширить файловую систему ext4 на всё доступное пространство раздела /dev/sdc2
fdisk
fdisk (fixed disk) - классическая утилита командной строки для работы с разделами диска.
fdisk -l отображает список всех подключенных устройств построчно с размером секторов для каждого раздела
fdisk -x подробный вывод (узнать UUID разделов)
fdisk /dev/sdc
m список команд
p отобразить размер диска и список разделов (/dev/sdc1)
n создать новый раздел (p), указать номер раздела partition number (от 4 до 128, по умолчанию 4), начало и конце сектора (enter - оставить по умолчанию)
i информация о выбранном разделе разделе (начало, конец, общий размер сектора и размер диска)
t задать тип раздела - 30/8E (Linux LVM) или 20/83 (Linux filesystem)
l отобразить список всех типов
w сохранить
q выход
partprobe /dev/sdc информирует ядро ОС об изменениях таблицы разделов, запрашивая у системы, чтобы она перечитала таблицу разделов
sfdisk
sfdisk (scriptable fdisk) - это инструмент, созданный специально для работы с fdisk внутри скриптов для автоматизации (без интерактивного режима).
sfdisk -d /dev/sdc > sdc.partition.table.txt создать backup для разметки таблицы GPT или MBR (аналогично dump cfdisk)
sfdisk -f /dev/sdc < sdc.partition.table.txt восстановить из backup
sfdisk -d /dev/sda | sfdisk -f /dev/sdd для восстановления RAID1 в MD при замене диска вышедшего из строя (sda в sdd)
mdadm --manage /dev/md1 --add /dev/sdd1 восстановление копирования в RAID-массиве
watch cat /proc/mdstat отображать прогресс синхронизации
- Процесс добавления нового диска для расширения
LVM:
ls /dev/sd* отобразить все диски в файловой системе
fdisk -l отобразить все диски через fdisk
cfdisk /dev/sda разметка диска на разделы (новый вариант)
cfdisk /dev/sdb инициализировать новый диск и выбрать таблицу разделов gpt
new - sda4 создать новый раздел sda4 или sdb1
Free space - Partition size: 100G
write - yes
pvcreate /dev/sda4 создать физический виртуальный том из раздела
vgextend ubuntu-vg /dev/sda4 добавить новый раздел в группу
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv добавить свободное место в группе для логического раздела ubuntu-lv
lsblk
df -h система будет видеть старый объем диска, необходимо выполнить команду по изменению размера файловой системы
df -T -h отобразить тип ФС
resize2fs -f /dev/ubuntu-vg/ubuntu-lv для ext*
btrfs filesystem resize +100g / для btrfs
- Процесс добавления нового диска для нового раздела:
cfdisk /dev/sdс создать раздел с помощь cfdisk или в fdisk/parted
mkfs.ext4 /dev/sdc1 форматировать раздел
mkdir /mnt/sdc1 && mount /dev/sdc1 /mnt/sdc1 примонтировать раздел
df -h && lsblk раздел нового диска должен быть в статусе Mounted on или MOUNTPOINTS
chmod 0777 /mnt/sdc1 разрешить всем пользователям доступ к диску
df -h -T отображает тип файловой системы примонтированных разделов
echo "/dev/sdc1 /mnt/sdc1 ext4 rw,relatime 0 0" >> /etc/fstab сохранить монтирование после перезагрузкиы (добавить по наименованию или UUID устройства)
umount /dev/sdc1 отмонтировать раздел
hdparm
hdparm (Hard disk parameters) - это утилита командной строки для просмотра и настройки низкоуровневых параметров жестких дисков (ATA/SATA/SAS) и SSD.
| Ключ | Описание | Пример |
|---|---|---|
-i | Показать краткую информацию о диске из ядра | hdparm -i /dev/sda |
-I | Показать детальную информацию напрямую от диска (идентификация) | hdparm -I /dev/sda |
-t | Тест скорости чтения из буферизованного диска (дисковый ввод) | hdparm -t /dev/sda |
-T | Тест скорости чтения из кэша системы (производительность RAM) | hdparm -T /dev/sda |
-g | Показать геометрию диска (цилиндры, головки, сектора) | hdparm -g /dev/sda |
-W n | Управление кэшированием записи (0 - выкл, 1 - вкл) | hdparm -W 1 /dev/sda |
-S n | Установка тайм-аута ожидания перед сном (spindown) | hdparm -S 120 /dev/sda |
-y | Немедленно перевести диск в режим ожидания (Standby) | hdparm -y /dev/sda |
-Y | Перевести диск в режим глубокого сна (Sleep) | hdparm -Y /dev/sda |
-C | Проверить текущий статус питания (active/idle/standby) | hdparm -C /dev/sda |
-B n | Установка APM (Advanced Power Management) от 1 до 255 | hdparm -B 127 /dev/sda |
-M n | Управление шумом (AAM) от 128 (тихо) до 254 (быстро) | hdparm -M 128 /dev/sda |
-r n | Установить флаг read only (1 - вкл, 0 - выкл) | hdparm -r 1 /dev/sda |
-z | Заставить ядро перечитать таблицу разделов диска | hdparm -z /dev/sda |
SWAP
fallocate -l 4G /swapfile.img создать файл-образ для swap
dd if=/dev/zero of=/swapfile.img count=1024 bs=1M создать файл для swap указанного размера
chmod 600 /swapfile.img дать права
mkswap /swapfile.img создать swap-пространство из файла или использовать весь объем раздела (mkswap /dev/sda4)
swapon /swapfile.img активировать swap-пространство
echo "/swapfile.img none swap sw 0 0" | sudo tee -a /etc/fstab примонтировать
free -m отобразить объем
swapoff -a отключить
rm /swapfile.img удалить файл
LVM
LVM (Logical Volume Management) - это система для управления логическими томами, которая создает дополнительный слой абстракции от железа, позволяющий собрать несколько разных дисков в один, и затем разбить его на группы и разделы. Позволяет использовать программный RAID 0 и 1 (зеркалирование) с управляемым пространством, снапшотами и импортированием томов в другую систему.
PV(Physical Volume) - физические тома.
pvs отображает список всех PV в системе
pvdisplay подробная информация
pvcreate /dev/sdb инициализировать физический диск в LVM как физический том
VG(Volume Group) - группы томов, для объединения физических томовPVи создания общего логического диска.
vgs отображает список всех VG
vgdisplay подробная информация
vgcreate vg21 /dev/sdb создать группу томов с добавлением физического тома на диске sdb
vgextend vg21 /dev/sdc добавить новый PV в VG
LV(Logical Volume) - логические разделы, для разделения общего пространстваVG.
lvs отображает список LV и их объем
lvdisplay подробная информация
lvcreate -n boot -L 1G vg21 создать первый логический раздел с наименованием boot размером 1 Gb в группе vg21
lvcreate -n home -L 9G vg21 создать второй логический раздел с наименованием home размером 9 Gb в группе vg21
lvcreate -n lv21 -l+100%FREE vg21 создать один логический раздел lv21 для группы томов vg21 и назначить ему весь объем диска
mkfs -t ext4 /dev/vg21/lv21 назначить файловую систем ext4
mkdir /mnt/lv21 создать директорию для монтирования
mount /dev/vg21/lv21 /mnt/lv21 примонтировать раздел к созданной директории
echo "/dev/vg21/lv21 /mnt/lv21 ext4 defaults 0 0" >> /etc/fstab добавить монтирование в автозагруку
- Увеличение размера
LV:
Расширение физического раздела можно сделать за счет добавление нового диска путем добавления в группу или увеличением имеющегося виртуального диска.
pvcreate /dev/sdc добавляем новый диск и инициализируем (минус: если один из дисков выходит из строя, данные будут не доступны, аналогично работе RAID 0)
pvresize /dev/sdb увеличиваем объем дискового пространства виртуального диска PV (resize измекняет размер физического тома)
vgextend vg21 /dev/sdc рашширяем группу vg21 за счет добавленного диска sdc
vgs отобразит у какой из групп всего памяти VSize и сколько доступно памяти VFree для распредиления логическим разделам LV
lvextend -l +100%FREE /dev/vg21/lv21 добавить все свободное простраство логическому разделу LV
vgs VFree будет 0 а в lsblk объем раздела увеличится
lvextend -L+1G /dev/vg21/lv21 добавить 1 Гб от группы томов vg21 разделу lv21
lvextend -L500G /dev/vg21/lv21 добавить да указанного размера диска 500Гб
lvs проверить
df -T отобразить используемую ФС
resize2fs /dev/vg01/lv01 изменить размер для файловой системы ext4
- Уменьшение размера
LV:
e2fsck -fy /dev/vg21/lv21 проверка диска
resize2fs /dev/vg21/lv21 500M уменьшить размер ФС на 500 Мбайт
lvreduce -L-500 /dev/vg21/lv21 уменьшить размер логического тома на 500 Мбайт
vgs в VFree добавится 500m для распределения другой логической группе
resize2fs /dev/ubuntu-vg/ubuntu-lv 1G применить изменения в ФС (уменьшить размер на 500 Мбайт)
- Удаление
PV:
umount /dev/vg21/lv21 предварительно отмонтировать LV
lvremove /dev/vg21/lv21 удалить логический том LV
lvs нет групп
vgs для VSize и VFree объем будет совпадает
vgremove vg21 удалить группу томов VG
pvremove /dev/sdb удалить диск sdb из PV
- Настройка
RAID 1:
Новый диск sdc разбить на 2 раздела (основной sdc1, немного больше чем у целевого зеркалируемого раздела lv21 и sdc2 оставшийся объем для ведения файла журнала)
pvcreate /dev/sdc1 /dev/sdc2 добавить оба раздела в LVM
vgextend vg21 /dev/sdc1 /dev/sdc2 добавить в имеющиюся группу vg21 (расширить группу vg21)
vgs у группы vg21 VFree увеличится объем добавленных томов-разделов
lvconvert -m1 /dev/vg21/lv21 /dev/sdb /dev/sdc1 /dev/sdc2 конвертируем логический том lv21, входящий в состав группы vg21 в зеркалируемый том (-m1), зеркалируется /dev/sdb (где находится lv21) на sdс1, а /dev/sdс2 используется для ведения файла журнала.
lvs -a -o +devices раздел lv21 пишет на 2 устройства:
) # основной том
) # зеркало
lsblk
Извлекаем (удаляем) sdb (оригинальный диск) и lsblk отображает только два раздела (part) sdc1 и sdc2 зеркального диска без LVM, т.к. группа не активна
Командой lvs выводим состояние группы vg21 и ошибки:
WARNING: Couldn't find device with uuid stBI99-6Qs3-B8lr-Ekaw-ahnD-oxPc-LsayLR.
WARNING: VG vg21 is missing PV stBI99-6Qs3-B8lr-Ekaw-ahnD-oxPc-LsayLR (last written to /dev/sdb).
vgchange -ay vg21 активировать группу
mount /dev/vg21/lv21 /mnt/lv21 примонтировать группу lv21
- Настройка snapshot:
lvs
lvcreate -L 1G -s -n snap-1 /dev/ubuntu-vg/ubuntu-lv предварительно нужно добавить VFree в Volume Group (Logical volume “snap-1” created)
lvcreate -L 1G -s -n snap-1 /dev/vg21/lv21 параметр -s помечает, что 1Гб дискового пространства из группы vg21 будет использоваться для snapshot lv21
lvs Origin - к какому логическому тому (lv) относиться snapshot, Data% - процент исползованного объема от выделенного
lsblk отображает изменения в томах разделов
mount /dev/vg21/snap-1 /mnt/snap содержимое снапшота можно смонтировать как обычный раздел, если отредактивароть снапшот и откатиться к нему, мы получим те данные, которые отредактировали
lvconvert --merge /dev/vg21/snap-1 откатиться к снапшоту snap-1, понадобится перезагрузка ОС (даже если это не основной диск)
- Экспорт и импорт:
umount /dev/vg21/lv21 отмонтировать
vgchange -an vg21 деактивировать группу томов (0 logical volume в volume group “vg21”)
vgexport vg21 экспортировать группу (successfully exported)
pvdisplay список групп (VG Name vg21 (exported)) \
Переносим диск на новый компьютер:
pvscan сканировать группы на новой системе (PV /dev/sdb is in exported VG vg21)
vgimport vg21 импортировать в систему (successfully imported)
vgs и lvs проверить группы
vgchange -ay vg21 активировать группу (1+ lg в vg “vg21”)
lsblk проверить подключение LVM
RAID
MD (Multiple Devices) - это SOFT RAID, который позволяет объединять несколько отдельных дисков (или разделов) в одно виртуальное устройство (RAID-массив).
mdadm --zero-superblock --force /dev/sd{b,c} занулить все суперблоки на дисках, которые будут добавлены в RAID-массив, т.к. диски могут содержать служебную информацию о других RAID (вывод: unrecognised md component device - ни один из дисков ранее не был добавлен в массив)
mdadm --create --verbose /dev/md0 -l 1 -n 2 /dev/sd{b,c} создать зеркальный RAID1 (-l/--leve 1) и указать кол-во дисков (-n/--raid-devices)
mkfs.ext4 /dev/md0 форматировать в ext4
mkdir /md0-sdb-sdc-raid1 создать директорию для монтирования
mount /dev/md0 /md0-sdb-sdc-raid1 примонтировать вручную
lsblk -o NAME,UUID | grep md* отобразить UUID устройства
echo "UUID=20482c47-fa11-462d-b7b8-93a342a7edf8 /md0-sdb-sdc-raid1 ext4 defaults 1 2" >> /etc/fstab добавить в автозагрузку по UUID, т.к. после перезагрузки ОС номер может измениться (например, на md127)
mount -a примонтировать все файловые системы из fstab
cat /proc/mdstat проверить состояние всех доступных RAID-массивов: md127 : active raid1 sdc[1] sdb[0]
mdadm -D /dev/md127 подробное (--detail) состояние массива. State: cleane - проблем нет, degraded - диск неисправен/поврежден, Active/Working/Failed/Spare Devices - количество активных (в работе), рабочих, нерабочих или запасных дисков в массиве. Consistency Policy - тип синхронизации после сбоя в массиве (resync - полная синхронизация после восстановления массива)
mdadm /dev/md127 --add /dev/sdd добавить запасной диск (в Spare Device) для горчей замены (Hot-Spare), в статусе списка дисков будет указан какой диск (spare /dev/sdd)
mdadm -G /dev/md127 -raid-devices=3 расширить массив до трех дисков (добавится из запасных дисков в активный в массив)
mdadm /dev/md127 --fail /dev/sdb пометить рабочий диск как нерабочий (перевести диск в Failed Device) для замены на запасной из Spare Device, который начнет автоматическую синхронизацию для ввода в массив (Rebuild Status : 50% complete)
mdadm /dev/md127 --remove /dev/sdb удалить нерабочий диск из массива
mdadm --stop /dev/md127 остановить/разобрать массив (предварительно umount /md0-sdb-sdc-raid1). В случае, если один из двух дисков был извлечен и не было запасных дисков, массив будет остановлен автоматически (State: inactive)
mdadm --assemble --scan --verbose команда просканирует все диски на наличие разобранного/развалившегося RAID-массива и самостоятельно (автоматически) попытается восстановить из них массив с изначальным именем (mdadm -D /dev/md0)
mdadm --stop /dev/md127 && mdadm --assemble --scan && mount -a && mdadm -D /dev/md0 если в системе остался один диск (второй извлечен), RAID-массив будет востановлен (пересобран) автоматически из одного диска с статусом: clean, degraded, можно сразу добавить новый диск для автоматической синхронизации данных
mdadm --assemble /dev/md127 /dev/sdb /dev/sdc указать вручную из каких дисков пересобрать массив
echo 'check' > /sys/block/md127/md/sync_action проверять целостность данных в массиве (mdadm -D /dev/md0 - Check Status : 80% complete)
cat /sys/block/md127/md/mismatch_cnt вывод файла (0 - все впорядке)
echo 'idle' > /sys/block/md127/md/sync_action остановить проверку
iSCSI
iSCSI (Internet Small Computer System Interface) - это протокол, который позволяет передавать команды для работы с дисками SCSI через сеть Ethernet/IP.
Портал (серверная часть) содержит цели (Target), каждая из которых предоставляет инициатору (клиенту) доступ к своим блочным устройствам.
apt install tgt
dd if=/dev/zero of=/storage/disk1.img bs=1 count=0 seek=200G создание динамического диска (разреженный файл) с максимальным размером 200 ГБ, где вместо последовательности нулей на диске хранят информацию об этих последовательностях в специальной таблице
dd if=/dev/zero of=/storage/disk1.img bs=1M count=2048 создание фиксированного размера диск
cp --sparse=always filename newfilename преобразование обычного файла в разреженный
Файлы конфигурации таргета: /etc/tgt/targets.conf или /etc/tgt/conf.d/disk-1.conf
<target iqn.2023-10.local.domain:ubuntu-target>
backing-store /storage/disk1.img
initiator-address 192.168.3.101
incominguser admin PasswordAdmin
</target>
systemctl restart tgt
tgtadm --mode target --op show отобразит все подключенные цели и предоставляемые ими блочные устройства
apt install open-iscsi установка клиентской части
# Опросить сервер, какие имеются диски (сервер должен вернуть строку подключения IQN)
# Авторизация
# Подключение
SMB Server
Samba - пакет, которые позволяют обращаться к удаленным сетевым дискам по протоколу SMB/CIFS.
/etc/samba/smb.conf
[global]
WORKGROUP
[share1]
/public/share
yes
yes
only = no
ok = yes
mask = 0777
mask = 0777
create mode = 0777
directory mode = 0777
users = smb1
list = smb1
objects = recycle
repository = .recycle/%U
keeptree = Yes
touch = Yes
versions = Yes
maxsize = 0
exclude = *.tmp
exclude_dir = /tmp
systemctl restart smbd применить настройки
workgroup- рабочая группа или доменное имя (должно быть одинаково на всех машинах)[dir_name]- имя общей папки, которое увидят пользователи при подключениеpath- путь на сервере, где будут храниться данныеpublic- для общего доступа, чтобы все могли работать с ресурсомwritable- разрешает запись в сетевую папкуread only = yes- только для чтения (no- для полного доступа управлением ФС)guest ok- разрешает доступ к шаре с помощью гостевой учетной записи (без авторизации)valid users- список пользователей с доступом на чтениеwrite list- список пользователей с полным доступомhosts allow = hostname- список разрешенных хостов или подсетейhosts deny = 192.168.160.0/255.255.252.0- список запрещенных хостов или подсетейrecycle:repository- удаленные файлы попадут в скрытый каталог.recycle(создастся каталог с именем пользователя, удалившего файл или папку)recycle:keeptreeудалять объекты с сохранением дерева каталоговrecycle:touchизменить дату изменения файла при его перемещении в корзинуrecycle:versionsпри удалении файлов с совпадающими именами, добавлять номер версииrecycle:maxsizeне помещать в корзину файлы, размер которых больше заданного параметра (в байтах)recycle:excludeисключить файлыrecycle:exclude_dirисключить каталог
SMB Client
apt install cifs-utils
mkdir -p /mnt/backup
echo "//192.168.3.100/Backup /smb/backup cifs user,rw,credentials=/root/.smbclient 0 0" >> /etc/fstab
mount -a
df -h
&&
BACKUP_DIR="/backup/homepage"
SMB_PATH=//192.168.3.100/Backup
SMB_USER=Lifailon
SMB_PASS=password
NFS Server
apt install nfs-kernel-server установить сервер, с помощью которого будет выполнено открытие шары. Сервис NFS слушает соединения для TCP и UDP на порту 2049
rpcbind - это демон в системах, который преобразует номера программ RPC (Remote Procedure Call) в универсальные сетевые адреса (порт 111), позволяя клиентам находить порты, на которых работают эти службы. Без него удаленные вызовы процедур не функционируют (замена portmap), по этому он необходим для работы сетевых файловых систем (NFS v2 и v3), так как они зависят от RPC.
apt install rpcbind
rpcinfo -p | grep nfs проверить, слушается ли порт NFS-сервер
cat /proc/filesystems | grep nfs проверить, поддерживается ли NFS на уровне ядра (вывод: nodev nfsd)
modprobe nfs вручную загрузить модуль ядра nfs
systemctl status nfs-server служба сервера
ufw allow 111,2049 && ufw reload
mkdir /nfs/share создать папку для шары
adduser nfs-user создать пользователя для подключения
chown nfs-user:nfs-user /nfs/share изменить владельца шары
chmod 775 /nfs/share дать полный доступ владульцу и группе
echo "/nfs/share 192.168.3.0/24(rw,sync,no_subtree_check)" >> /etc/exports шарим директорию в подсети
exportfs -a применить настройки (обновить таблицу экспорта для NFS-сервера)
Опции:
rw- разрешить чтение и запись в этой папкеro- разрешить только чтениеsync- отвечать на следующие запросы только тогда, когда данные будут сохранены на диск (по умолчанию)async- не блокировать подключения пока данные записываются на дискsecure- использовать для соединения только порты ниже1024insecure- использовать любые портыnohide- не скрывать дочернии директории, при открытии доступа к нескольким директориямroot_squash- подменять запросы отrootна анонимные (используется по умолчанию)no_root_squashне подменять запросы отrootна анонимныеall_squashпревращать все запросы в анонимныеsubtree_checkпроверять не пытается ли пользователь выйти за пределы экспортированной папкиno_subtree_checkотключить проверку обращения к экспортированной папке (улучшает производительность)anonuid и anongidуказываетuidиgidдля анонимного пользователя
Работает стандартная система доступа UNIX, поэтому, если нужно чтобы пользователь подключивший шару мог получить доступ к дочерним директориям, то на клиентской стороне должен существовать пользователь с таким же UID (именем и ID), а на сервере для расшаренной директории должна принадлежать такому же пользователю или группе в которой он состоит (GID). Или дать полный доступ для всех пользователей (chmod 777), тогда все созданные файлы будут от имени: nobody nogroup
# Изменить UID
# Изменить GID
# Проверяем ID
# Предоставить полный доступ ко всем файлам расшаренной директории
# Анонимному пользователю присваивается UID 1020
NFS Client
NFS-common - это пакет, который используется для подключения к NFS-серверу например, nfs-kernel-server. В пакет включены программы: lockd, statd, showmount, nfsstat, gssd и idmapd.
apt install nfs-common
# Отобразить список всех доступных ресурсов
# Монтируем директорию
# 192.168.3.104:/nfs-folder 48G 20G 27G 43% /mnt/nfs-folder)
FTP Server
vsftpd (Very Secure File Transfer Protocol Daemon) - это FTP-сервер для Linux/UNIX-систем, распространяемый под лицензией GPL и является стандартом для многих дистрибутивов (Ubuntu, CentOS, RHEL) благодаря высокой производительности, поддержке SSL/TLS для шифрования и возможности настройки виртуальных пользователей.
apt install vsftpd
systemctl status vsftpd
ufw allow 20:21/tcp
ufw allow 30000:31000/tcp
cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
/etc/vsftpd.conf
YES
NO
NO
YES
YES
NO
YES
/etc/vsftpd.chroot_list
$USER
/home/$USER/ftp
YES
/etc/vsftpd.user_list
NO
YES
YES
systemctl restart vsftpd
ss -ln | grep -w "21" проверить, что 21 порт слушает (LISTEN)
ss -tn | grep -w "21" проверить установленные соединения на 21 порту (ESTAB)
cat /var/log/vsftpd.log лог работы (CONNECT/LOGIN/UPLOAD/DOWNLOAD/RENAME/DELETE)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/certs/vsftpd.crt сгенерировать самозаверяющий SSL-сертификат и закрытый ключ
/etc/vsftpd.conf
YES
/etc/ssl/certs/vsftpd.crt
/etc/ssl/private/vsftpd.key
NO
YES
YES
YES
NO
NO
NO
HIGH
useradd -m -s /bin/bash ftpuser пользователь с домашним именным каталогом и оболочкой bash
passwd ftpuser задать пароль пользователю
echo "ftpuser" | tee -a /etc/vsftpd.chroot_list добавить пользователя в список ограниченных домашним каталогом
echo "ftpuser" | tee -a /etc/vsftpd.user_list добавить пользователя в список разрешенных для подключения
mkdir /home/ftpuser/ftp создать домашнию директорию
chown ftpuser:ftpuser ftp назначить владельца и группу для директории
chmod 555 ftp ограничить доступ только на чтение и выполнение
mkdir /home/ftpuser/ftp/upload создать директорию для загруки (с возможностью записи)
chown ftpuser:ftpuser upload
chmod 775 upload полный доступ для владельца и группы
FTP Client
ftp 192.168.3.101 доступен только без использования SSL
230 Login successful вход в систему успешен
ls отобразить все файлы в текущей директории на удаленном компьютере
get test.json скачать файл на локальный компьютер
put out.txt загрузить файл на удаленный сервер
bye закрыть соединение
Rsync
rsync -options SRC DST
-a режим архивирования, когда сохраняются все исходные атрибуты оригинальных файлов (дата изменения и создания)
-b создание резервной копии
-c проверка контрольных сумм для файлов
-e использовать другой транспорт (например ssh)
-h выводит цифры в формате, нормальном для чтения
-l копировать символьные ссылки
-L копировать содержимое ссылок
-p сохранять права для файлов
-q минимум информации
-u не перезаписывать более новые файлы
-v выводить подробную информацию о процессе копирования
-w выполнить полное копирование без синхронизации
-z сжимать файлы перед передачей
--delete удалять остальные файлы у получателя, которых нет в источнике отправителя
--progress выводить прогресс передачи файла (в %)
--stat показать статистику передачи
rsync -zvh /home/lifailon /backup копирование и синхронизация только файлов (skipping directory) указанной директории (в пределах одной локальной машины, например на внешний носитель). При редактировании файлов в исходной папке и повторном копирование заменит все содержимое (без синхронизации).
Конфигурация сервера в /etc/rsyncd.conf:
file = /var/run/rsyncd.pid
file = /var/run/rsync.lock
file = /var/log/rsync.log
[share]
/backup/
allow =
deny = *
true
lifailon
lifailon
only = false
chown kup:kup backup сменить владельца и группу директории
chmod ug+rwx backup выдать им полные права (для удаленного пользователя)
systemctl start rsync запустить сервер
Синхронизация на удаленной машине (192.168.3.105) авторизованным под пользователем, указанным в конфигурации:
rsync -avzh /backup/ kup@192.168.3.105:/tmp/backup/ скопировать содержимое локальной папки backup (включая директории) на удаленный сервер. По умолчанию Rsync использует транспорт SSH (шифрованный) с запросом пароля (если не используется ключ).
rsync -avzhe "ssh -p 2121" /tmp/backup/ kup@192.168.21.121:/tmp/backup/ указать нестандартный порт для ssh (можно добавить в планировщик Cron)
rsync -avzh /tmp/backup/ rsync://192.168.21.121:/share явно задать использование транспорта Rsync
rsync -avzh kup@192.168.3.105:/tmp/backup /tmp/backup/ скопировать данные с удаленного сервера на локальный компьютер
GPG
GPG (GNU Privacy Guard) - это инструмент, который используется алгоритм RSA или Ed25519 для шифрования и цифровой подписи.
gpg -c filename зашифровать данные
gpg filename.gpg расшифровать данные
gpg --gen-key создавать пару ключей (публичный и приватный ключи)
gpg --export -a 'User Name' > publickey.asc экспорт публичного ключа
gpg --import publickey.asc импорт на второй стороне
gpg --encrypt --recipient 'Recipient Name' filename зашифровать данные с использованием публичного ключа получателя (только владелец приватного ключа сможет расшифровать)
gpg --decrypt encryptedfile.gpg расшифровать данные с помощью приватного ключа
gpg --sign filename подписывать данные с использованием приватного ключа для подтверждения их подлинности и целостности (без шифрования)
gpg --verify signedfile.gpg проверка подписи с использованием публичного ключа отправителя
Сети
SSH
w отобразить все активные сессии (TTY с экраном, FROM с ip)
who отобразить активные сессии, время/дата входа и ip с которого подключен пользователь
last -a история всех последних входов пользователей в систему
lastlog дата последнего входа каждого пользователя в систему
last reboot история перезагрузки
id -G получить список id крупп в которых состоит текущий пользователь
Конфигурация /etc/ssh/sshd_config
2121
no
yes
yes
2m
6
yes
10:30:100
no
60
3
systemctl restart sshd
systemctl status sshd
ssh-keygen -t rsa -b 4096 сгенерировать пару ключей
id_rsa приватный (закрытый) ключ хранится на клиенте (от кого происходит подключение) для подключения без ввода пароля
~/.ssh/id_rsa.pub публичный (открытый) ключ используется для передачи на сервер, куда будем подключаться
sshpass - это утилита командной строки, предназначенная для автоматизации SSH-подключений путем неинтерактивной передачи пароля.
sudo apt install sshpass
hosts=(192.168.3.101 192.168.3.102 192.168.3.103 192.168.3.104)
username="lifailon"
port=2121
for; do
done
SCP
ssh-copy-id root@192.168.3.105 -p 2121 скопировать публичный ключ на удаленный сервер (добавить новой строкой), утилита будет искать в директории текущего локального пользователя файл публичного ключа и скопирует его содержимое (~/.ssh/id_rsa.pub) указанному при подключение пользователю на удаленный компьютер в файл ~/.ssh/authorized_keys
scp -P 2121 /home/lifailon/files/* lifailon@192.168.3.105:/home/lifailon/downaload/ скопировать содержимое каталога files на удаленный компьютер в директорию downaload
scp -P 2121 -r kup@192.168.3.105:/home/lifailon/downaload /home/lifailon/files/ скачать (-r) данные с удаленного сервера на локальный
Wi-Fi Tools
iw - системная утилита для управления и настройки Wi-Fi в Linux (замена устаревшего пакета wireless-tools, в который входила команда iwconfig).
sudo apt install iw
iw dev wlan0 info общая информация об интерфейсе
iw dev wlan0 scan поиск доступных Wi-Fi сетей
iw dev wlan0 link информация о текущем Wi-Fi подключение
iw dev wlan0 station dump статистика передачи данных для текущего подключения (количество переданных байт, ошибки, текущий битрейт)
sudo ip link set wlan0 down выключить интерфейс
sudo iw wlan0 set monitor control переводит карту в режим захвата пакетов из обычного режима type managed
ip link set wlan0 up включить интерфейс
Получить подробную информацию о Wi-Fi адаптера с помощью команды iw list. Если присутствует AP (Access Point) в списке Supported interface modes, значит поддерживается режим точки доступа.
wavemon - TUI интерфейс для мониторинга беспроводных устройств, позволяющее отслеживать уровни сигнала и шума, статистику пакетов и конфигурацию устройства.
impala - TUI интерфейс для управления подключениями к Wi-Fi сетям.
linux-wifi-hotspot - позволяет поднять точку доступа, используя одновременно Wi-Fi подключение к основной точки доступа на роутере, с поддержкой подключения к VPN-тунелю.
Network Manager
Network Manager - это системна для автоматического обнаружения и настройки сетевых соединений, обеспечивая автоматическое переключение на наиболее быстрое или доступное соединение с поддержкой управления с помощью графического интерфейса.
apt install network-manager
systemctl status NetworkManager
nmcli device status состояние интерфейсов - название адаптера, тип (wifi/ethernet), состоянием подключения и названием сети
nmcli general status подробное состояние интерфейсов с текущими настройками
sudo nmcli device wifi hotspot ssid failon.vpn password 12345678 создать точку доступа
sudo nmcli connection modify failon.vpn 802-11-wireless.band a изменить диапазон частоты работы на 5 ГГц
sudo nmcli connection up failon.vpn включить или отключить (down) точку доступа
echo "127.0.1.1 $(hostname)" | sudo tee -a /etc/hosts добавить имя хоста в файл /etc/hosts
nmcli device wifi rescan пересканировать все доступные поблизости Wi-Fi сети
nmcli device wifi list вывести список всех доступных Wi-Fi сетей
nmcli device wifi connect "TP-Link" password 12345678 name "TP-Link Wifi" подключиться к Wi-Fi сети
nmcli radio wifi текущее состояние работы Wi-Fi интерфейса
nmcli radio wifi on включить или выключить (off) Wi-Fi интерфейс
nmcli connection show список уже настроенных и сохраненных соединений (ethernet, vpn или wifi)
nmcli connection show failon.net подробная информация с настройками указанного подключения по его SSID
nmcli -f ipv4 connection show failon.net отфильтровать вывод настроек
nmcli connection up failon.net подключиться
nmcli connection down failon.net отключиться
nmcli connection add con-name "eth-dhcp" type ethernet ifname ens33 создать проводное подключение (ethernet) для сетевого интерфейса ens33
nmcli connection modify "eth-dhcp" ipv4.dns 8.8.8.8 изменить настройки подключения
nmcli connection up eth-dhcp применить настройки
nmcli connection show eth-dhcp вывести все настройки указанного соединения
nmcli connection modify "eth-dhcp" ipv4.method manual ipv4.addresses 192.168.3.106/24 ipv4.gateway 192.168.3.1 настроить статический IP-адрес
Networkd
systemd-networkd - это современный системный сервис и серверный стандарт, который управляет сетевыми конфигурациями, пришедший на смену старым скриптам /etc/network/interfaces (networking) и тяжелому Network Manager.
systemctl status systemd-networkd статус работы сервиса
journalctl -u systemd-networkd отобразить лог сервиса
networkctl list список всех адаптеров (configured используемый активный профиль)
networkctl status статус службы, Address и Gateway адаптера, DNS-адреса и лог systemd-networkd
networkctl status ens33 характеристики адаптера (Network File, Driver, Vendor, Model, MTU, Speed)
Netplan
netplan - это универсальный менеджер управления сетью для NetworkManager или networkd, который определяет настройки с помощью yaml файлов и создает конфигурации в директории /run/systemd/network/.
netplan status получить статус по всем интерфейсам
netplan get прочитать конфигурацию
netplan --debug generate проверка конфигурации на ошибки
netplan try применить изменения на 120 секунд с выводов лога (полезно для отладки)
netplan apply применить изменения (перезапускает сеть)
nano /etc/netplan/*.yaml
- Динамический адрес (использовать два сетевых интерфейса):
network:
version: 2
ethernets:
ens33:
dhcp4: yes
ens36:
dhcp4: yes
- Статический адрес:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
routes:
- to: default
via: 192.168.3.1
nameservers:
addresses:
search:
renderer указывает, кому передать управление сетью - networkd или NetworkManager (в средах с графическим интерфейсом)
- Определить настройки
MACиMTU:
network:
ethernets:
ens33:
dhcp4: no
match:
macaddress: 54:43:32:21:10:09
mtu: 1500
- Подключение к
Wi-Fi:
network:
version: 2
wifis:
wlp33:
dhcp4: yes
dhcp6: no
nameservers:
addresses:
access-points:
"wifi-ssid":
password: "12345678"
Bonding- используется для объединения физических сетевых интерфейсов в один логический:
network:
version: 2
ethernets:
ens33:
ens36:
bonds:
bond0:
dhcp4: no
interfaces:
- ens33
- ens36
parameters:
mode: active-backup # используется только один интерфейс, второй активируется в случае неработоспособности первого
mode: broadcast # используется оба интерфейса одновременно, пакеты передают все интерфейсы
mode: balance-rr # используется оба интерфейса по очереди с распределением пакетов
mode: balance-tlb # используется оба интерфейса по очереди, пакеты распределяются в соответствии с текущей нагрузкой
mode: balance-xor # используется оба интерфейса по очереди, распределение пакетов на основе политики хеширования
addresses:
- 192.168.1.150/24
gateway4: 192.168.1.1
mtu: 1500
nameservers:
addresses:
- 8.8.8.8
Realmd
realmd - это системная служба, которая упрощает процесс настройки аутентификации в сетевых доменах (например, Active Directory или FreeIPA), где нужно выполнять процедуру join (создание учетной записи на компьютере в домене и обмен ключами Kerberos)
apt -y install realmd libnss-sss libpam-sss sssd sssd-tools adcli samba-common-bin oddjob oddjob-mkhomedir packagekit установка зависимостей
Настроить атрибуты хоста в файле /etc/realmd.conf, которые будут сохранены в учетной записи компьютера в AD (атрибуты operatingSystem и operatingSystemVersion)
[active-directory]
Ubuntu Server
20.04
realm discover docker.local --verbose возвращает полную конфигурацию домена и список пакетов, которые должны быть установлены для регистрации системы в домене
realm join --help | grep pass
realm join -U lifailon docker.local --one-time-password добавить УЗ lifailon в домен
realm list проверить статус после подключения (server-software: active-directory)
id lifailon@docker.local получить сведения о УЗ домена (список групп из Active Directory)
SSSD
SSSD (System Security Services Daemon) - это связующее звено между системой под управлением Linux и удаленным сервером аутентификации (Active Directory, FreeIPA или LDAP для сопоставления прав доступа и других параметров), с поддержкой Kerberos для проверки пароля и кешированием (на случай, если доступ к контроллеру домена будет потерян).
# Запретить доступ всем остальным пользователям (очищает список simple_allow_* в файле sssd.conf)
# Добавит доменную группу в систему
# echo "simple_allow_groups = ssh-connect-domain" >> /etc/sssd/sssd.conf
# Добавит доменного пользователя для авторизации в системе
# echo "simple_allow_users = lifailon" >> /etc/sssd/sssd.conf
Создавать домашний каталог для нового доменного пользователя в файле /usr/share/pam-configs/mkhomedir
activate mkhomedir
yes
900
Additional
pam_mkhomedir.so umask=0022 skel=/etc/skel
pam-auth-update обновить конфигурацию и выбрать созданную activate mkhomedir
Предоставить права sudo в файле /etc/sudoers.d/domain_admins
@docker.local ALL=(ALL) ALL
%ssh-connect-domain@docker.local ALL=(ALL) ALL
ssh lifailon@docker.local@hostname
nmap
nmap (Network Mapper) - это утилита командной строки для обнаружения активных хостов, открытых портов и определения запущенных сервисов.
snap install nmap
| Ключ | Описание | Пример |
|---|---|---|
-sS | scan TCP SYN. Не завершает соединение (SYN - SYN-ACK - RST) | nmap -sS 192.168.3.101 |
-sT | scan TCP Connect. Полное TCP-соединение (SYN - SYN-ACK - ACK) | nmap -sT 192.168.3.101 |
-sA | scan TCP ACK. Обнаружить фильтрацию пакетов (ACK - RST или drop = filtered) | nmap -sA 192.168.3.101 |
-sU | scan UDP. Поиск открытых UDP-портов (DNS, DHCP, SNMP) | nmap -sU 192.168.3.101 |
-sn | scan ICMP. Определение активных хостов с помощью ARP запросов | nmap -sn 192.168.1.0/24 |
-Pn | No ICMP. Пропускает стадию обнаружения с помощью ping (если хост блокирует ICMP) | nmap -Pn 192.168.1.0/24 |
-n | No DNS. Отключает обратное разрешение имен для ускорения | nmap -n 192.168.3.101 |
-S | Spoofing. Подмена исходящего адреса без ping (т.к. ответ уйдет на поддельный IP) | nmap -S 192.168.3.1 -e eth0 -Pn 192.168.3.191 |
-v | Verbose. Увеличивает детализацию вывода в консоли | nmap -v 192.168.3.101 |
-p | Ports. Сканирование конкретных портов или их диапазонов | nmap -p 22,80,443 или nmap -p 0-1023 |
-p- | All ports. Сканирует все 65535 возможных TCP-портов | nmap -p- 192.168.3.101 |
-F | Fast scan. Сканирует только 100 наиболее распространенных портов | nmap -F 192.168.3.101 |
-O | OS detection. Попытка определить операционную систему хоста | nmap -O 192.168.3.101 |
-sV | Service detection. Определение версий ПО на открытых портах | nmap -sV 192.168.3.101 |
-A | Aggressive. Включает -O, -sV, скрипты -sC и traceroute | nmap -A 192.168.3.101 |
-sC | Default scripts. Использование стандартного набора Lua-скриптов NSE | nmap -sC 192.168.3.101 |
-T<0-5> | Timing. Установка скорости (0 - скрытный, 5 - агрессивный) | nmap -T5 1.1.1.1 |
-oN | Normal output. Сохранение результата в текстовый файл | nmap -oN scan.txt |
-iL | Input list. Чтение списка целевых IP-адресов из файла | nmap -iL list.txt |
tcpdump
tcpdump - это встроенный сниффер для перехвата и анализа сетевого трафика в режиме реального времени, позволяя просматривать заголовки пакетов, фильтровать содержимое по протоколам или хостам, а также сохранять данные для последующего анализа.
Описание ключей:
| Ключ | Описание | Пример |
|---|---|---|
-D | Показать список доступных интерфейсов | tcpdump -D |
-i | Выбор сетевого интерфейса (например, eth0 или ens33) | tcpdump -i eth0 |
-n | Не преобразовывать IP-адреса в доменные имена | tcpdump -n |
-nn | Не преобразовывать порты в названия протоколов (80 -> http) | tcpdump -nn |
-v | Подробный вывод ( -vv или -vvv для максимума) | tcpdump -v |
-q | Краткий вывод (меньше протокольной информации) | tcpdump -q |
-A | Выводить содержимое пакета в формате ASCII (текст) | tcpdump -A |
-X | Выводить содержимое пакета в HEX и ASCII | tcpdump -X |
-c n | Захватить только n пакетов и завершить работу | tcpdump -c 100 |
-w | Записать сырой трафик в файл формата .pcap | tcpdump -w file.pcap |
-r | Прочитать пакеты из сохраненного .pcap файла | tcpdump -r file.pcap |
-s 0 | Захват пакета целиком (0 = без ограничений) | tcpdump -s 0 |
-e | Выводить заголовки канального уровня (MAC-адреса) | tcpdump -e |
-l | Использовать буферизацию строк (удобно в pipe) | tcpdump -l | grep "GET" |
-F | Читать фильтры (BPF) из указанного файла | tcpdump -F filter.txt |
Примеры фильтров:
| Фильтр | Описание | Пример |
|---|---|---|
host | Фильтр по IP-адресу (источник или назначение) | tcpdump host 8.8.8.8 |
src | Фильтр только по IP отправителя (source) | tcpdump src 192.168.3.100 |
dst | Фильтр только по IP получателя (destination) | tcpdump dst 192.168.3.101 |
net | Фильтр по подсети (CIDR) | tcpdump net 192.168.3.0/24 |
port | Фильтр по номеру порта (TCP или UDP) | tcpdump port 80 |
src port | Фильтр по номеру порта отправителя | tcpdump src port 53 |
dst port | Фильтр по номеру порта получателя | tcpdump src port 80 |
portrange | Фильтр по диапазону портов | tcpdump portrange 1-1024 |
proto | Фильтр по протоколу (tcp, udp, icmp, arp) | tcpdump icmp |
and | Логическое И (объединение условий) | tcpdump "host 1.1.1.1 and port 80" |
or | Логическое ИЛИ (одно из условий) | tcpdump "port 80 or port 443" |
not | Логическое НЕ (исключение) | tcpdump "not port 22" |
less | Пакеты длиной меньше или равной N байт | tcpdump less 64 |
greater | Пакеты длиной больше или равной N байт | tcpdump greater 1024 |
broadcast | Захват только широковещательных пакетов | tcpdump broadcast |
multicast | Захват только мультикаст-трафика | tcpdump multicast |
tcp[] | Фильтр по флагам TCP (syn, ack, psh, rst, fin) | tcpdump "tcp[tcpflags] & tcp-syn != 0" |
Разбор пакета: 12:43:35.049609 IP 192.168.3.101.22 > 192.168.3.100.24527: Flags [P.], seq 18468:19808, ack 793, win 592, length 1340
12:43:35.049609- точное время захвата пакета (часы:минуты:секунды.микросекунды)IP- сетевой протокол192.168.3.101.22- адрес отправителя и его порт>- направление передачи данных192.168.3.100.24527- адрес получателя и его портFlags- TCP-флаги (статус соединения)[.](ACK) - подтверждение соединения
[S](SYN) - запрос на начало соединения
[P](PUSH) - запрос сразу передать данные приложению, не дожидаясь заполнения буфера до максимума
[F](FIN) - нормальное завершение соединения
[R](RST) - принудительный разрыв соединения (ошибка или отказ, например, закрыт порт)
[W](CWR) - окно уменьшено (Congestion Window Reduced)
[E](ECE) - эхо-сигнал о перегрузке (ECN-Echo)
[U](URG) - наличие срочных данных
seq(Sequence) - порядковые номера байтов отправки (отправитель уже передал 18467 байт до этого, а сейчас пришел кусок с 18468-го по 19808-й)ack(Acknowledgment) - порядковые номер байтов приема (последний успешно принятый байт с номером 792 отправителем от получателя, теперь ожидает данные с номера 793)win(Window) - размер окна (сколько осталось места в байтах у получателя для приема данных)length- длина полезной нагрузки в пакете (1.3 КБ данных, чаще предел одного пакета -MTUсоставляет1500байт, если 0, значит пакет не несет в себе текста или файлов, это просто служебное сообщение, подтверждающее прием предыдущих данных)
tshark
tshark - это консольный анализатор сетевых протоколов (сниффер), работает на движке Wireshark без графического интерфейса, который позволяет захватывать, фильтровать и анализировать трафик в реальном времени или читать дампы в формате .pcap. Как и tcpdump использует библиотеку захвата трафика libpcap, поэтому базовые ключи и синтаксис фильтров захвата у них идентичны.
apt install tshark
| Ключ | Описание | Пример |
|---|---|---|
-D | Показать список доступных интерфейсов | tshark -D |
-i | Выбор интерфейса (номер из списка или название) | tshark -i eth0 |
-n | Отключить разрешение имен (IP/порты/MAC) | tshark -n |
-f | Фильтр захвата (BPF синтаксис, как в tcpdump) | tshark -f "tcp port 80" |
-Y | Фильтр отображения (Display Filter, синтаксис Wireshark) | tshark -Y "http.request" |
-w | Запись трафика в файл .pcapng | tshark -w capture.pcap |
-r | Чтение и анализ готового файла захвата | tshark -r file.pcap |
-V | Detailed. Полный разбор всех протоколов (дерево пакета) | tshark -V -r file.pcap |
-O | Вывести детали только для конкретного протокола | tshark -O http |
-T | Формат вывода (fields, json, text, pdml, psml) | tshark -T json |
-e | Вывод конкретного поля (используется только с -T fields) | tshark -T fields -e ip.src |
-E | Настройка формата вывода (header=y, separator=,) | tshark -E header=y |
-c n | Остановить захват после n пакетов | tshark -c 100 |
-a | Условие автостопа (duration:сек, filesize:КБ, files:кол-во) | tshark -a duration:60 |
-b | Ring buffer. Создание нескольких файлов по кругу | tshark -b filesize:1024 |
-z | Статистика (подсчет пакетов, HTTP запросов, экспертный лог) | tshark -z http,tree |
-p | Не использовать «промискуитетный» режим | tshark -p |
-s | Snaplen. Размер захватываемой части пакета (байты) | tshark -s 64 |
-x | Добавить HEX и ASCII дамп к выводу | tshark -x |
tshark -D список интерфейсов
tshark -i 1
disown
tshark -i 1 -Y "syslog" захват пакетов syslog (udp.port == 514)
tshark -i 1 host 192.168.3.104 захват пакетов для конкретного IP-адреса
tshark -i 1 net 192.168.3.0/24 захват пакетов указанной подсети
tshark -i 1 src host 192.168.3.104 захват исходящих пакетов
tshark -i 1 dst host 192.168.3.104 захват входящих пакетов
tshark -i 1 dst host 192.168.3.104 and port 8086 отфильтровать по входящему хосту и порту
tshark -i 1 dst host 192.168.3.104 and port 8086 and src host 192.168.3.99 отфильтровать по исходящему хосту
tshark -i 1 -x dst host 192.168.3.104 and port 8086 and src host 192.168.3.101 прочитать пакеты в шестнадцатеричном формате (-x)
tshark -i 1 -O TCP dst host 192.168.3.104 and port 8086 and src host 192.168.3.101 прочитать TCP-заголовки
tshark -i 1 -a duration:10 -w ~/192.168.3.0.pcap сохранить захват в файл
tshark -Y 'ip.addr == 192.168.3.106' -r ~/192.168.3.0.pcap прочитать файл захвата с использованием фильтра
tshark -Y "(ip.addr == 192.168.3.106) or (ip.addr == 192.168.3.107)" -r ~/192.168.3.0.pcap отфильтровать по двум адресам (или)
tshark -Y "(ip.addr == 192.168.3.104) and (tcp.port == 8086)" -r ~/192.168.3.0.pcap отфильтровать по двум параметрам (и)
tshark -Y "!(ip.addr == 192.168.3.104)" -r ~/192.168.3.0.pcap исключить
tshark -Y "not arp and not (udp.port == 53)" -r ~/192.168.3.0.pcap отобразить весь udp-трафик, исключив ping и dns пакеты
Termshark - терминальный пользовательский интерфейс (TUI) для tshark, созданный по образцу Wireshark.
apt install termshark
ufw
ufw (Uncomplicated Firewall) - это простой и удобный инструмент командной строки для управления брандмауэром в Linux, используемый по умолчанию в Debian и Ubuntu (является стандартом с версии 8.04 LTS). Он упрощает настройку сложных правил iptables или nftables, обеспечивая базовую защиту от атак, ограничение доступа к портам и управление входящим/исходящим трафиком.
systemctl status ufw
ufw status статус работы (включена или отключена фильтрация)
ufw enable включить ufw
ufw disable отключить
ufw reload перезапустить/применить настройки
ufw reset сбросить настройки (отключить ufw и удалить все правила)
ufw show listening список всех портов, которые в данный момент слушают входящие соединения, и сопоставляет их с действующими правилами фаервола
ufw default deny incoming отклонять все входящие пакеты (политика по умолчанию, какие действия будут применяться к пакетам, если они не подпадают под созданные правила)
ufw default allow outgoing все исходящие разрешать
ufw allow in 22 разрешить входящий трафик на порт 22
ufw allow out 22 разрешить исходящий трафик на порт 22
ufw deny in 80/tcp запретить входящий TCP-трафик на 80 порт
ufw delete deny in 80/tcp удалить правило
ufw allow 161,10050,10051/tcp открыть несколько портов
ufw allow 25/tcp открыть для всех направлений 25 порт
ufw limit ssh лимт подключений к определенному порту с одного IP-адреса (для защиты от перебора), по умолчанию подключения блокируются, если пользователь пытается создать шесть и больше подключений за 30 секунд (настроить время и количество запросов можно только через iptables)
ufw logging on включить логирование
ufw logging medium выбрать уровень логирования (low/medium/high)
cat /var/log/ufw директория хранения логов.
Синтаксис лога: [UFW ALLOW/BLOCK/AUDIT] IN=интерфейс OUT=итерфейс SRC=ip_источника DST=ip_назначения LEN=размер_пакета TOS=0x10 PREC=0x00 TTL=64 ID=728 DF PROTO=протокол SPT=порт_источника DPT=порт назначения LEN=размер_пакета
ufw show raw все активные правила в формате iptables
ufw show added недавно добавленные правила
ufw show builtins правила, добавленные по умолчанию
ufw show user-rules правила, добавленные пользователем
ufw show before-rules правила, которые выполняются перед принятием пакета
ufw show after-rules правила, которые выполняются после принятия пакета
ufw show logging-rules правила логгирования пакетов
firewalld
Firewalld - . Изначально он создавался как более мощная и гибкая альтернатива старым скриптам настройки фаервола. Firewalld - это динамический менеджер брандмауэра (файрвола) для Linux, который работает как удобный интерфейс для системы фильтрации пакетов nftables.
Firewalld - это динамический менеджер брандмауэра для Linux, который служит современным интерфейсом (фронтендом) для подсистем ядра nftables или iptables, разработаный сообществом Fedora при поддержке Red Hat.
apt install firewalld
systemctl status firewalld статус работы
firewall-cmd --state статус работы
firewall-cmd --reload применить настройки (перечитать)
firewall-cmd --list-all список созданных правил (для services и ports)
firewall-cmd --list-port вывести список только открытых портов
firewall-cmd --list-service вывести список открытых сервисов
firewall-cmd --list-all-zones отобразить список всех зон
firewall-cmd --get-active-zones список используемых зон
firewall-cmd --list-rich-rules список правил с условиями
firewall-cmd --list-all --zone=public информация о конкретной зоне
firewall-cmd --permanent --add-port=22/tcp открыть 22 порт
firewall-cmd --permanent --add-port=8000-8080/udp открыть диапазон портов
firewall-cmd --permanent --add-service=ssh разрешить порты для сервиса ssh
firewall-cmd --permanent --new-service=speedtest добавить службу
firewall-cmd --permanent --service=speedtest --add-port=80/tcp добавить порт к службе
firewall-cmd --info-service=speedtest информация о службе
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.3.0/24" service name="speedtest" accept' открыть доступ для подсети
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.3.0/24" port port="22" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.21.0/24' reject" закрыть доступ для подсети
firewall-cmd --permanent --remove-port=22/tcp удалить правило
nftables
nftables - это современная подсистема ядра Linux, которая отвечает за фильтрацию пакетов, классификацию трафика и NAT, пришедший за смену iptables.
nft -a list ruleset вывести список существующих правил
nft flush ruleset очистить все правила
nft list tables вывести список существующих таблиц
nft add table inet filter создать таблицу filter
nft add chain inet filter input { type filter hook input priority 0\; } добавить цепочку input (будут проверять каждый входящий пакет из сети до того, как он попадет в систему)
nft add rule inet filter input ct state related,established counter accept разрешает ответы на все новые открываемые клиентом и уже открытые соединения
nft add rule inet filter input iifname "lo" counter accept разрешает программам внутри системы общаться друг с другом через локальную петлю (localhost)
nft add rule inet filter input ip protocol icmp counter accept разрешить icmp
nft add rule inet filter input tcp dport {80, 443} counter accept открыть порты
nft add rule inet filter input ip saddr { 192.168.100.0/24, 1.1.1.1/32 } tcp dport 22 counter accept открыть 22 порт для подсетей
nft chain inet filter input { policy drop \; } остальное блокировать
nft delete rule inet filter input handle 5 удалить правило по номеру в # handle NUMBER
nft add rule inet filter input position 5 tcp dport 22 counter accept добавить правило в конкретное место с номером в списке
fail2ban
Fail2Ban - демон для блокировки хостов, вызывающие множественные ошибки аутентификации.
Создаем базовую конфигурацию для shh в файле /etc/fail2ban/jail.local
[sshd]
true
2121
/var/log/auth.log
3
10m
6h
Применяем настройки и проверяем статус:
|
| || ||
| | Создаем фильтр поиска событий для блокировки попыток доступа к панели управления 3x-ui в файле /etc/fail2ban/filter.d/3x-ui.conf
[Definition]
^.*wrong username:.*IP: "<HOST>".*$
Добавляем новое правило:
[3x-ui]
true
20533
3x-ui
systemd
SYSLOG_IDENTIFIER=3x
3
10m
1h
Фильтр для доступа mixed proxy:
[Definition]
^.*from (?:tcp|udp):<HOST>:\d+ rejected.*proxy/socks.*invalid username or password.*$
Добавляем новое правило:
[3x-proxy]
true
12537
3x-proxy
/root/docker/3x/3x_logs/access.log
3
10m
1h
iptables-allports[name=3x-proxy, chain=DOCKER-USER]
Apache
|
CGI(Common Gateway Interface) - это стандарт взаимодействия веб-сервера с внешними программами (скриптами) для генерации динамического контента. Когда пользователь запрашивает страницу, Apache запускает скрипт, например, на Bash, который обрабатывает данные и возвращает результат обратно.
Создаем скрипт для API сервера: /var/www/api/api.sh
#!/bin/bash
if [; then
elif [; then
else
fi
Создаем VirtualHost для обработки запросов сервера в файле /etc/apache2/sites-available/api.conf
<VirtualHost *:8443>
/var/www/html
/api /var/www/api/api.sh
<Directory "/var/www/api">
+ExecCGI
cgi-script .sh
None
all granted
</Directory>
<Location "/api">
Basic
"Restricted Area"
/etc/apache2/.htpasswd
valid-user
cgi-script
+ExecCGI
</Location>
${APACHE_LOG_DIR}/error.log
${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Настраиваем модули:
# Активируем модули для базовой аутентификации
# Создать пользователя rest с паролем api
# Активируем модуль CGI
# Выдаем права скрипту на выполнение
# Активируем конфигурацию сервера (VirtualHost)
Примеры отправки запросов:
|
|
Доступные переменные внутри скрипта:
REQUEST_METHOD- метод HTTP-запроса (GET,POST,HEADи т.д.)REQUEST_URI- оригинальныйURIзапросаQUERY_STRING- строка запросаURLCONTENT_TYPE- тип содержимого запроса в заголовке клиента (например,application/text)CONTENT_LENGTH- длина тела запроса в байтах (чаще, дляPOSTзапросов и отсутствует вGETзапросах)read -n $CONTENT_LENGTH POST_DATA- прочитать содержимоеBodyиз стандартного ввода (stdin).HTTP_STATUS- читаем содержимое переданного заголовка (например,Status: text), которое определяется заранее и регламентируется в дальнейшемHTTP_USER_AGENT- название агента клиента из заголовка (например,curl/8.4.0)REMOTE_ADDR- адрес клиентаREMOTE_PORT- порт клиентаSERVER_NAME- адрес сервераSERVER_PORT- порт сервераSCRIPT_NAME- путь и имя CGI-скриптаSERVER_SOFTWARE- имя и версия сервераSERVER_PROTOCOL- версия протокола, например,HTTP/1.1HTTPS- если установлено, то запрос был сделан с использованиемHTTPSAUTH_TYPE- тип аутентификации, если он был предоставленREMOTE_USER- имя пользователя, если была использована аутентификацияDOCUMENT_ROOT- корневой каталог веб-сервера
Server-status- это модуль mod_status, предоставляющий HTML-страницу с подробной статистикой работы веб-сервера в реальном времени.
Настройка статистики в файле /etc/apache2/mods-available/status.conf
# Проверить, что подключен модуль статистики
|
# Проверить синтаксис
# Активировать модуль (Module status already enabled)
|
WebDAV(Web Distributed Authoring and Versioning) - это расширение протоколаHTTP, который включает возможность использовать веб-сервер как файловое хранилище для совместного использования.
/etc/apache2/ports.conf
8443
2024
Создаем каталог, к которому будет доступ через WebDAV и предоставить доступ к нему для www-data:
Создаем конфигурацию в файле /etc/apache2/sites-available/webdav.conf
<VirtualHost *:2024>
webmaster@localhost
/var/www/webdav
/webdav /var/www/webdav
<Directory /var/www/webdav>
Indexes FollowSymLinks
None
all granted
On
Basic
"WebDAV"
/etc/apache2/.htpasswd
valid-user
</Directory>
${APACHE_LOG_DIR}/webdav_error.log
${APACHE_LOG_DIR}/webdav_access.log combined
</VirtualHost>
Настраиваем модули:
# Создать пользователя admin
# Активировать конфигурацию сайта (VirtualHost)
