Задача → рецепт
Рецептов: 522. Задача и команды, которые её решают.
Базовые команды
- Примеры
- Команды
- Форматы времени Доступ регулируется /etc/at.allow / /etc/at.deny (кто может ставить задания).
- Узнать, что будет выполнено {#resolve-command} Посмотри все определения имени.
- Проверить режим редактирования {#interactive} Список set -o показывает состояния режимов, включая emacs и vi.
- Править командную строку клавишами {#line-editing} В режиме emacs (он включён по умолчанию) строку до Enter правят сочетаниями:
- Разобраться с файлами запуска {#startup} Интерактивная non-login оболочка читает ~/.bashrc.
- Условия и циклы Проверки [ -f ], [ -z ], -eq — в test-conditions.
- Значение по умолчанию и части пути
- Проверить синтаксис, не запуская Глубже проверяет shellcheck:
- Файлы с пробелами в именах Цикл по выводу ls или find в $( ) делит имена по пробелам.
- Примеры cd - — самый частый трюк:
- Хитрости В bash можно включить shopt -s autocd — тогда ввод одного пути без cd сам перейдёт в каталог.
- Форматы Спецификаторы:
- Метки и арифметика
- Запись в файл
- Когда printf echo ведёт себя по-разному в разных оболочках (особенно -e/-n).
- Строка crontab без наложений Запуск, который пришёлся на работающий прошлый, тихо пропускается.
- Блокировка внутри скрипта exec 9>файл открывает дескриптор 9 для всего скрипта, flock -n 9 берёт на него блокировку.
- Служба systemd Второй экземпляр того же юнита systemd и сам не запустит:
- Подождать, но не вечно
- Кто держит блокировку lsof показывает и процесс-потомок:
- Узнать имя перед работой на сервере {#identify} Сопоставь имя узла с пользователем.
- Проверить разрешение текущего имени {#resolution} getent обращается к системным источникам имён.
- Сравнить адреса по имени и на интерфейсах {#addresses} Различие результатов ожидаемо при разных настройках имён и интерфейсов.
- Навигация Tab — переключиться между левой и правой панелью.
- F-клавиши Клавиша Действие F3 просмотр файла (mcview) F4 редактировать (mcedit) F5 копировать отмеченное в другую панель F6 переместить / переименовать F7 создать…
- Редактор и SFTP Доступ к удалённой машине прямо из панели (Shell-link по SSH):
- Горячие клавиши ^O = Ctrl+O, M-W = Alt+W.
- Формат Спецификатор Значение %s %d %f строка / целое / дробное %-Ns %Nd ширина N (- = по левому краю) %.Nf N знаков после точки %05d ведущие нули %x %o hex / oct %b…
- Рецепты
- Проверить место перед работой с файлами {#locate} Посмотри путь и содержимое отдельно:
- Узнать путь без символических ссылок {#resolve} Сравни оба результата после перехода через существующий симлинк.
- Выяснить, какая pwd запущена {#implementation} Bash может выбрать встроенную команду, функцию или псевдоним.
- Горячие клавиши Префикс — Ctrl+a, затем клавиша:
- Полезное ~/.screenrc (частое):
- Проверка перед запуском или в CI С -S warning замечания уровней info и style не печатаются и не влияют на код:
- Отключить замечание в одном месте Комментарий действует на следующую команду.
- Отключить замечание для всего каталога Файл .shellcheckrc в каталоге скрипта или выше:
- Скрипт подключает другой файл Без -x shellcheck пишет SC1091 … Not following и функции из подключённого файла не видит.
- Посмотреть готовые правки Готовую правку дают простые замечания:
- Проверить аргумент скрипта $# — число аргументов.
- Сравнить число из вывода команды -ge ждёт голое число.
- Шаблон и регулярное выражение Для day=2026-10-20 второе условие напечатает год 2026, месяц 10:
- Несколько условий сразу
- Горячие клавиши
- Сообщить выпуск ядра при диагностике {#kernel-release} Запиши фактический результат; не подставляй пример из инструкции.
- Отделить ядро от дистрибутива {#distribution} Сравни независимые источники.
- Проверить архитектуру и имя узла {#machine} Архитектура и имя машины — разные значения; ни одно не является именем пользователя.
- Load average uptime показывает три числа — средняя длина очереди готовых к выполнению задач за 1, 5, 15 минут:
- Кто и откуда
- Выход и сохранение
- Навигация и правка
- Полезное
- Примеры Кавычь команду с конвейером/шаблоном (watch 'ss | grep x'), иначе | и * применятся к самому watch, а не к команде.
- Примеры Проверка «есть ли команда» в скрипте (надёжно):
- Проверить полномочия своей сессии {#current-user} Сопоставь имя с числовым идентификатором.
- Проверить контекст sudo {#sudo-context} На учебной ВМ sudo разрешён.
- Посмотреть другую учётную запись {#other-account} Для сведений о student используй id, а не аргумент whoami.
- Безопасно с именами файлов Пробелы и переводы строк в именах ломают наивный xargs.
- Имя файла с пробелом или спецсимволом Проще всего — набрать начало имени и нажать Tab:
- Аргумент, который начинается с минуса
- Несколько команд в одной строке
- Длинная команда на нескольких строках \ в конце строки переносит команду на следующую.
- Проверить команду в if {#if-command} if сам смотрит на код команды, $?
- Сохранить код, пока его не затёрли {#save-code} $?
- Выйти с сообщением об ошибке Сообщение — в поток ошибок (>&2), код — не ноль:
- Код curl и ответ HTTP {#curl-http-code} Код curl отвечает на вопрос, состоялся ли обмен с сервером.
- Свои коды для разных сбоев Принято:
- Код каждого звена конвейера
- Где сохранять (login vs non-login) Файл Когда читается ~/.bashrc интерактивные не-login оболочки (новый терминал/таб) ~/.profile / ~/.bash_profile login-оболочки (вход по SSH/в консоль)…
- Вывод и ошибки — в разные файлы
- Порядок 2>&1 имеет значение Оболочка читает перенаправления слева направо.
- Обработать вывод цепочкой команд Каждое звено делает одну вещь:
- Записать в файл, которому нужен root sudo cmd > /etc/файл не сработает:
- Многострочный ввод прямо в команду
- Очистить журнал, не удаляя файл Если процесс держит журнал открытым, rm не вернёт место, а обнуление вернёт.
- Узнать, какое звено конвейера упало
- man Разделы man:
- Где ещё искать
- Шаблоны Шаблон Значение * любая строка (включая пустую), кроме / ?
- Glob vs regex glob — для имён файлов в оболочке; * = «что угодно».
Файлы и каталоги
- Резервная копия конфига перед правкой -a сохраняет владельца и права, поэтому копию можно вернуть на место как есть.
- Каталог в существующий каталог и «внутрь» Одна и та же команда даёт разный результат в зависимости от того, существует ли dst.
- Скопировать много файлов в один каталог
- Копия с запасом: оставить прежнюю версию
- Между машинами cp работает только в пределах одной машины.
- Примеры
- Условия
- Действия {} + группирует аргументы (быстрее), {} \; — по одному.
- История: log -p, show, blame {#history} Репозиторий /etc/demo с тремя коммитами двух авторов:
- Отменить правку и коммит: restore, revert, reset {#revert} Что отменить Команда История незакоммиченную правку файла git restore site.conf не меняется один коммит git revert --no-edit <коммит> новый коммит поверх…
- Репозиторий root'а: sudo git {#sudo-git} Файлы в /etc принадлежат root, и репозиторий в /etc/nginx — тоже.
- Удалённый репозиторий: fetch, pull, push {#remote} Bare-репозиторий — только история, без рабочих файлов:
- Отложить правку: stash {#stash} git stash убирает незакоммиченные правки в отдельное хранилище и возвращает файлы к последнему коммиту — так можно забрать чужие коммиты, когда pull…
- Конфликт {#conflict} Конфликт — обе стороны поменяли одни и те же строки, и git не знает, какую версию оставить.
- Ветки
- Примеры Порядок аргументов как у cp:
- Симлинк vs хард Симлинк (-s) Жёсткая ссылка На каталог да нет Между ФС да нет Если удалить цель «битый» симлинк данные живы, пока есть имена Видно в ls -l -> target как…
- Найти последний изменённый файл
- Посмотреть права на каталог, а не на файлы в нём Без -d команда покажет содержимое каталога, а права самого каталога останутся за кадром.
- Только каталоги или только файлы
- Числовые UID и GID вместо имён Помогает, когда файл остался от удалённого пользователя:
- Короткие псевдонимы Ubuntu В ~/.bashrc Ubuntu уже есть alias ll='ls -alF', alias la='ls -A' и alias l='ls -CF'.
- rmdir rmdir намеренно удаляет только пустое — это страховка.
- Переименовать файл в другом каталоге, не переходя туда
- Перенести все файлы по шаблону Шаблон *.log раскрывает оболочка (см.
- Переименовать много файлов: .txt → .md ${f%.txt} отрезает расширение, кавычки сохраняют имена с пробелами.
- Безопасно заменить рабочий файл Внутри одного раздела mv меняет файл атомарно:
- Бэкап и восстановление
- Обслуживание и расписание В cron/systemd-таймере — backup + forget --prune по расписанию.
- Проверить шаблон до удаления Шаблон раскрывает оболочка (см.
- Удалить старые файлы по возрасту rm не умеет выбирать по дате и размеру — это работа find.
-
Защита от
rm -rfс пустой переменной ${VAR:?} останавливает команду, если переменная пуста или не задана. - Удалить файл со странным именем
- Хвостовой слэш — важно! Слэш у источника = «содержимое».
- Команды
- Примеры Частые форматные поля для -c:
- Три времени atime (%x) — последний доступ (чтение).
- Команды
- Навигация Пути:
- Файлы и каталоги У rm нет корзины.
- Просмотр текста Конвейеры и перенаправление:
- Терминал и копипаст
- В скриптах Классика — узнать каталог самого скрипта, чтобы пути не зависели от того, откуда его запустили:
- Команды -sfn при замене симлинка-на-каталог критичен:
- Symlink vs hard Symlink (-s) Жёсткая На каталог да нет Между ФС да нет Удалили цель «битый» данные живы, пока есть имена Видно в ls -l -> target как обычный файл Свой inode…
Текст и поиск
- Записать короткий файл без редактора Кавычки вокруг EOF отключают подстановку:
- Найти невидимые символы ^M$ в конце строк — переводы строк Windows (\r\n).
- Склеить части и проверить результат
- Искать в файле без cat cat file | grep error работает, но лишний процесс не нужен:
- Имена пользователей и их оболочки
- Адреса из журнала веб-сервера Первое слово строки журнала nginx — адрес клиента.
- Колонка из CSV Если в значениях CSV встречаются запятые в кавычках, cut их не поймёт:
- Всё, кроме одной колонки
- Пропустить строки без разделителя Без -s строка без разделителя печатается целиком.
- Команды
- Примеры
- Примеры
- Проверить устаревшее разрешение команды {#stale-path} Сравни результаты.
- Удалить только одну запись {#one-entry} Первый вызов просит запомнить найденный путь, второй показывает его, третий удаляет запись.
- Проверить контекст исправления {#current-shell} Выполняй очистку в оболочке, где воспроизводится проблема.
- Пять самых больших файлов в каталоге
- Процессы, которые едят больше всего памяти
- Посмотреть, что за файл, не открывая его целиком
- Строки с N-й по M-ю
- Фильтры
- Примеры и сборка
- Найти ошибку в длинном журнале Поиск учитывает регистр.
- Оставить в окне только нужные строки Внутри less набери &Failed и Enter:
- Таблица с длинными строками
- Цветной вывод
- Открыть в редакторе то, что читаешь Клавиша v открывает текущий файл в редакторе по умолчанию — в Ubuntu обычно это nano.
- Проверить замену, потом править {#preview} diff покажет каждую изменённую строку до и после:
- Удалить строки
- Заменить строку целиком или добавить рядом
- Одна правка во многих файлах Сначала список файлов, потом правка:
- Фильтр и подсчёт в awk
- Какие строки встречаются чаще всего Первый sort собирает одинаковые адреса подряд, uniq -c считает их, второй sort -rn ставит большие счётчики наверх, head оставляет десять.
- Таблица по числовой колонке
- Размеры с буквами K, M, G -n прочитает 512M как 512, а 1G как 1 — порядок выйдет неверный.
- Несколько ключей
- Версии и имена файлов с номерами
- Записать результат в тот же файл sort names.txt > names.txt оставит пустой файл, а -o пишет только после чтения.
- Проверить, отсортирован ли файл
- sort / uniq
- cut / tr / wc / прочее
- Разбор логов и таблиц
- Следить за журналом и видеть только ошибки --line-buffered нужен, чтобы grep печатал совпадения сразу, а не пачками.
- Пропустить строку заголовка
- Последние строки нескольких журналов сразу
- Остановить слежение вместе с процессом
- Примеры
- Зачем sudo tee Это главная причина знать tee.
- Топ адресов в журнале веб-сервера Ответ на вопрос «кто чаще всего обращался»:
- Сколько разных значений
- Найти дубли в списке
- Сравнивать не всю строку -f N пропускает N колонок, разделённых пробелами, -w N сравнивает первые N символов.
- Сколько строк с ошибкой
- Сколько файлов в каталоге ls | wc -l тоже считает, но не видит скрытые файлы, а ls -l | wc -l добавит строку total.
- Сколько разных значений
- Размер нескольких файлов сразу
- Самая длинная строка
- Слово в любом регистре и написании
- Адрес IP
- Конфиг без комментариев и пустых строк
- Переставить части строки Группы ( ) запоминают части совпадения, \1 и \2 вставляют их в замену.
Пользователи и права
- Разделить наблюдение и изменение {#inspect-first} Сначала убедись, что имя указывает на нужного пользователя.
- Задать прошедшую дату в учебной лабе {#expire-training-account} Только после подготовки labpaused и по условию упражнения:
- Проверить фактический путь доступа {#check-access-path} Отчёт chage показывает локальные параметры.
- chmod Два синтаксиса:
- chown
- chgrp chgrp — то же самое, что chown :group, но короче и явнее по смыслу:
- umask umask — маска:
- Найти, где служба теряет доступ Запуск от имени службы останавливается ровно на той части, куда ей нет прохода:
- Сравнить права частей пути вручную ls с -d и stat покажут то же по отдельности — удобно, когда частей мало.
- Куда на самом деле ведёт путь Без -l namei показывает только типы и раскрывает каждую ссылку с отступом:
- Назначить оболочку учебной записи {#set-training-shell} Только для заранее подготовленной labsvc, если изменение входит в задание:
- Проверить отказ самой программы {#demonstrate-refusal} Сообщение может зависеть от локали и настройки системы.
- Проверить границу ограничения {#uid-still-usable} При разрешённой политике sudo:
- Временный пароль для нового сотрудника
- Заблокировать вход, не удаляя учётку passwd -l закрывает только вход по паролю:
- Пароли для нескольких пользователей сразу chpasswd читает пары имя:пароль.
- Поменять маску навсегда для себя
- Общий каталог команды Чтобы файлы ещё и получали группу каталога, а не твою, каталогу нужен setgid-бит.
- Маска службы Строка в юните или в drop-in (sudo systemctl edit app) — см.
- Создать один файл с нужными правами
- Пользователь, которому можно администрировать Группа sudo в Ubuntu даёт право выполнять команды от root.
- Системная учётка для службы -r берёт UID ниже 1000, -M не создаёт домашний каталог, nologin запрещает интерактивный вход.
- Пользователь с ключом SSH вместо пароля Пароль не задан, поэтому вход по паролю закрыт, а по ключу работает — см.
- Что окажется в новом домашнем каталоге При -m в каталог копируется содержимое /etc/skel:
- Добавить в группу и проверить, что ничего не пропало
- Убрать из одной группы То же без gpasswd:
- Новая группа не действует в открытой сессии Группы процесс получает при запуске.
- Временно закрыть вход -L закрывает только вход по паролю:
- Каталог команды Проверка:
- Перевести уже лежащие файлы setgid действует на новые файлы.
- Найти программы с setuid и setgid На чистой системе это десяток с небольшим программ:
- Управление Частая ошибка.
- Пароли, блокировка, su Системные пользователи (демоны) — обычно uid < 1000, nologin, без пароля (useradd -r).
- Числа и символы Восьмерич.
- Спецбиты Подробно о трёх особых битах и общем каталоге команды — в статье Особые биты прав.
- Команды
- mask В getfacl строка mask::
Процессы
- Что это за процесс {#identify} Имя, родитель, пользователь, полная команда, рабочий каталог, файл программы и служба — этого хватает, чтобы понять, откуда процесс взялся.
- Найти и вернуть удалённый, но открытый файл {#deleted} find печатает ссылки вида /proc/956/fd/3:
- Окружение службы {#service-env}
- namespaces Типы:
- cgroups (v2) CPUQuota=50% — половина одного ядра; MemoryMax= — жёсткий потолок:
- Срезы и деление процессора {#cpu-weight} systemd раскладывает процессы по дереву групп.
- Найти процесс, который грузит диск {#find-io-hog} Порядок общий для всех ресурсов — в system-monitoring.
- Понизить приоритет диска процессу {#lower-io} nice снижает долю процессора, ionice — долю диска; для резервной копии на рабочем сервере нужны обе.
- Один процесс под наблюдением {#watch-pid}
- Завершить процесс правильно TERM даёт программе закрыть файлы и удалить временные.
- Завершить по имени pkill сравнивает часть имени:
- Службу — через systemctl systemd перезапустит убитую через kill службу, если у неё Restart= — см.
- Процесс завис в терминале Ctrl+C посылает INT, Ctrl+Z — TSTP (останавливает и возвращает приглашение).
- Load выше числа процессоров: кто в очереди {#who-is-running} Две задачи R по 48.8 % делят один процессор.
- Найти, на чём ждут процессы в D {#find-d} Стек читается снизу вверх:
- Следить за load в динамике В vmstat столбец r — задачи в R (работают и ждут процессор), b — задачи, которые ждут диск.
- Частые задачи
- Столбец FD и блокировки {#fd-column} FD — номер дескриптора, затем режим:
- Удалённые файлы: +L1 и DEL {#deleted} Файл, который удалили или заменили новым, живёт, пока его держит процесс — это удалённый открытый файл.
- Найти, кого и когда убил OOM {#find} Время из журнала сверь с журналом службы (journalctl -u <служба>) — станет видно, что служба делала перед гибелью.
- Лимит памяти службы {#memorymax} Лимит ставят в drop-in — файле дополнения рядом с юнитом (см.
- Беречь важный процесс {#protect} Отрицательную поправку ставит только root.
- Воспроизвести OOM безопасно {#reproduce} tail ждёт перевода строки и копит весь ввод в памяти, пока не упрётся в 64 МиБ своей группы.
- Проверить, запущена ли программа -x требует совпадения имени целиком:
- Найти скрипт, а не интерпретатор У всех Python-скриптов имя процесса одно — python3; различаются они командной строкой.
- Посмотреть подробности найденного -d, склеивает PID через запятую — в таком виде их принимает ps -p, см.
- Перед pkill — список pkill принимает те же ключи отбора, что pgrep, но посылает сигнал — см.
- Что значат буквы в STAT Буква Состояние R работает или ждёт процессор S спит, ждёт события D ждёт диск или сеть, сигналы не прерывают T остановлен (Ctrl+Z или сигнал STOP) Z зомби:
- Найти процесс по имени без самого grep ps aux | grep nginx находит и строку самого grep nginx — отсюда «лишний» процесс в выводе.
- Свои колонки и родитель etime — сколько процесс работает, ppid — PID родителя:
- Дерево процессов службы
- Отделить два наблюдения {#two-observations} Это удобная пауза между ручными измерениями.
- Запустить короткую задачу в фоне {#background-delay} Выполни весь пример в одной оболочке:
- Прервать ручное ожидание {#interrupt-delay} Запусти sleep 30 на переднем плане и нажми Ctrl+C.
- Программа молча завершается с кодом 1 {#silent-exit} -o пишет трассу в файл, вывод программы остаётся на экране.
- Запускай от пользователя службы {#as-service-user} root читает любой файл, и под sudo strace отказа в правах не видно.
- Какие файлы читает программа {#which-files}
- Куда подключается {#network} Адрес и порт — в аргументах connect.
- На чём висит процесс {#stuck} Одна незаконченная строка — процесс ждёт в этом вызове:
- Сводка: какие вызовы и сколько {#summary} calls — сколько раз, errors — сколько с отказом, % time — доля времени в ядре.
- Нагрузка, которая не мешает соседям {#safe} С nice -n 19 процесс берёт весь свободный процессор (97.4 %) и уступает его любому процессу с обычным приоритетом nice.
- Поднять load average {#raise-load} Три рабочих процесса на одном процессоре поднимают load к 3.
- Получить OOM в cgroup {#memory-oom} systemd остановил службу целиком при первом же OOM (OOMPolicy=stop).
- Фоном и под присмотром {#background} Задание оболочки умрёт вместе с сессией.
- Найти, что грузит процессор Открой top, нажми P (сортировка по CPU) и c (полная командная строка).
- Найти, что съело память Нажми M:
- Остановить процесс прямо из top Нажми k, введи PID (по умолчанию предложен верхний процесс) и сигнал:
- Снимок для отчёта или тикета -b (batch) печатает обычный текст без перерисовки экрана, -n 1 — один снимок.
- htop htop — та же идея с цветом, мышью и прокруткой.
- Сколько файлов открыто и сколько можно {#count-fds} Число дескрипторов близко к мягкому лимиту — служба вот-вот получит Too many open files.
- Поднять лимит в своей оболочке {#raise-shell} Действует на эту оболочку и всё, что из неё запущено.
- Кто слушает сокет u_str — потоковый сокет (как TCP), u_dgr — датаграммы (как UDP).
- Проверить сокет руками curl шлёт HTTP-запрос в сокет, имя в адресе идёт только в заголовок Host.
- Дать доступ nginx Такая правка живёт до перезапуска приложения:
- Сокет PostgreSQL Каталог в -h — подключение через сокет, как без -h вовсе.
- Сохранить статус до следующей команды {#save-status} Выполни в одной оболочке:
- Не путать паузу и завершение {#termination-only} Для своего сохранённого PID используй wait -f "$child_pid", если при управлении заданиями требуется дождаться окончания.
- Разделить запуск и проверку {#same-parent} Запускай задачу и выполняй ожидание в той же оболочке.
- Кто ест процессор и память ps даёт снимок, а %CPU в нём — среднее за всю жизнь процесса.
- Снимок для отчёта Один файл с временем, нагрузкой, памятью и списком процессов — его можно приложить к заявке или сравнить с таким же снимком позже.
- Добавить swap-файл {#swap-file} Чтобы swap включался при загрузке, нужна строка в /etc/fstab:
- Выключить swap {#swapoff} Затем убери строку из /etc/fstab и удали файл.
- Сбросить кэш перед замером {#drop-caches} Нужно только для опыта:
- Просмотр
- Сигналы Сигнал № Смысл TERM 15 мягкое завершение (по умолчанию), процесс может прибраться KILL 9 убить немедленно, нельзя перехватить (данные могут потеряться) HUP 1…
- Приоритет и состояния {#priority} Колонка STAT в ps:
- Команды оболочки
- Пережить выход из сессии Для служб используй systemd-юнит:
- Параллельный запуск Для серьёзной параллельности — xargs -P N (см.
Службы и systemd
- Проверка
- Клиент своего сервера {#client} iburst — первые четыре опроса подряд, синхронизация за секунды вместо минут.
- Сервер для своих машин {#server} На node2:
- Проверить синхронизацию из скрипта {#check-script} waitsync <попыток> <смещение> ждёт, пока часы синхронизированы и поправка меньше заданной (здесь 0.5 с), опрос — раз в 10 секунд.
- Подвести часы сразу {#step-now} makestep без свежего измерения ничего не меняет:
- cron Формат строки crontab — пять полей времени + команда:
- Чужие crontab {#user-crontabs} Личные crontab лежат в /var/spool/cron/crontabs/, по файлу на пользователя.
- Расписание и часовой пояс {#timezone} cron считает расписание по часовому поясу машины:
- systemd timers Пара файлов:
- Аренды и диагностика
- Provisioning (как код) Источники, дашборды и алерты задаются файлами — воспроизводимо, в git, а не кликами:
- Балансировка и маршрутизация balance Когда roundrobin равномерно по очереди (дефолт) leastconn на наименее загруженный (долгие сессии, БД) source sticky по IP клиента Маршрут по пути/хосту…
- Три вида имени systemd различает три имени хоста:
- Проверка сервиса Чтобы VIP уезжал при падении приложения (а не только всего узла):
- Управление ВМ
- Сети и хранилища Снимки:
- Кто ответит на имя Первая команда — ответ глазами клиента, вторая — какие listen и server_name nginx на самом деле прочитал, в порядке файлов.
- Найти, где сломан прокси Строка error.log называет upstream — куда nginx шёл.
- Релей через смартхост Типовой кейс «сервер шлёт уведомления через внешний SMTP» (main.cf):
- Роль и база для приложения Новый пароль — ALTER ROLE appuser PASSWORD '…';, список ролей — \du в psql, баз — \l.
- Пароль без ввода: ~/.pgpass {#pgpass} Строка — адрес:порт:база:роль:пароль, * подходит к любому значению.
- Дамп: форматы {#dump-formats} Логический дамп снимает pg_dump — команды и данные, из которых база создаётся заново.
- Восстановить в новую базу {#restore-new-db} Новая пустая база — без конфликтов:
- Сверить копию с источником {#verify-copy} Одинаковые число строк, сумма выборки и значение счётчика в источнике и копии — данные совпадают.
- PromQL и проверка Веб-интерфейс на :9090.
- redis-cli
- Сервер
- Клиент (Linux)
- Управление reload vs restart:
- Просмотр и юниты edit создаёт drop-in в /etc/systemd/system/<unit>.d/override.conf — пакетный юнит не трогается, апдейты его не затрут.
- Цели (targets) Цель — группа юнитов, до которой systemd доводит загрузку:
- Команды
- Часовой пояс {#timezone} Пояс меняет только показ времени:
- chrony вместо timesyncd {#chrony} Установка chrony удаляет systemd-timesyncd.
- Проверить, работает ли служба
- Запустить, остановить, включить автозапуск
- Посмотреть, что писала служба
- Перевести задачу из cron в таймер Служба:
- Выполнить задачу сейчас и проверить итог Для oneshot команда systemctl start ждёт конца скрипта и возвращает 0 или 1.
- Через час после прошлого запуска
- Временный таймер без файлов Такой таймер живёт до перезагрузки, остановить его — systemctl stop tick.timer.
- Проверить скрипт в окружении службы Скрипт выполнится временной службой:
Сеть
- Команды
- Код ответа для проверки Первая команда печатает код; 000 — ответа HTTP не было.
- Сайт по имени без DNS -H 'Host:
- HTTPS со своим CA --cacert добавляет доверенный корень для одного запроса.
- Запрос в unix-сокет Соединение идёт в файл сокета, имя localhost попадает только в Host.
- Данные и заголовки С -d curl сам выбирает POST, -X POST можно не писать.
- dig / host / nslookup
- Команды Имя интерфейса — из ip -br l.
- Только код ответа -o /dev/null выбрасывает тело, -w печатает код.
- Сайт по имени, когда DNS его не знает Первая команда меняет только заголовок Host.
- Запрос руками Видно, что HTTP — просто текст:
- Кто ответил: nginx или приложение Строка access.log — адрес клиента, время, строка запроса, код и размер ответа:
- Объекты ip Объект О чём Частое ip address (a) IP-адреса на интерфейсах ip -br a ip link (l) сами интерфейсы (up/down, MTU, MAC) ip -br l ip route (r) таблица маршрутов ip…
- Команды Изменения ip ...
- Адрес, префикс и подсеть Запись 192.0.2.10/24 — адрес и префикс:
- Диагностика сети Естественная лесенка:
- Проверка портов Различай ответы:
- Данные и передача
- Что машина показывает наружу {#audit} Порт, который слушает на 0.0.0.0 и виден снаружи как open, — часть поверхности атаки.
- Вывод для скрипта {#grepable} Каждый порт — номер/состояние/протокол//имя///:
- Проверить один порт {#one-port}
- Отличить «нет пути» от «нет ответа» Network is unreachable печатается сразу:
- Destination Host Unreachable Узел в твоей подсети не отозвался на ARP — его нет или он выключен.
- Проверка в скрипте
- Внутри учебной сети У учебной машины нет сети, кроме lo:
- Команды
- Состояния и фильтры Фильтр по состоянию TCP — state <имя> (или state connected/listening):
- Копирование и туннели
- Наполнить known_hosts для нового сервера -H хеширует имя хоста в файле — так же, как это делает сам ssh при первом подключении (см.
- Несколько хостов из списка Удобно перед разворачиванием группы ВМ или в cloud-init/Ansible-плейбуке, когда known_hosts собирают одним шагом для всего парка.
- Сверить полученный ключ с отпечатком
- Генерация Установка на сервер:
- Права на файлы sshd включает StrictModes по умолчанию:
- ssh-agent Агент держит расшифрованный ключ в памяти, чтобы не вводить пароль к ключу каждый раз:
- Фильтры Синтаксис BPF:
- netplan: VLAN и bond
- Проверка
- Команды
- Частые задачи Связка с DNS:
- Разбор атаки Типичный путь «откуда ломятся» (в связке с логами fail2ban/journalctl):
- ping В выводе смотри:
- traceroute / mtr mtr — главный инструмент:
- Собрать сеть из двух узлов Адреса концов — из одной подсети, иначе нужен маршрут (см.
- Найти второй конец пары
- Убрать учебную сеть Пара veth не живёт поодиночке:
- Применение изменений По SSH на удалённой машине конфигурацию сети меняет netplan try:
- Несколько файлов в /etc/netplan Файлы применяются все вместе, в порядке имён (01-..., 50-...); поздний файл может переопределить настройки раннего для того же интерфейса.
- Постоянный маршрут к сети через соседа {#static-route} Маршрут из ip route add живёт до перезагрузки.
Хранилище и ФС
- Строка для fstab
- Сверить строку fstab с устройством Не совпадает — правят fstab.
- Найти устройство по метке или UUID
- Что на диске без файловой системы
- Разметить пустой диск одной командой Раздел начинают с 1 MiB:
- Два раздела на одном диске
- Добавить раздел в свободное место mklabel здесь не нужен:
- То же в fdisk по шагам Размер можно задать в конце раздела:
- Таблица MBR для старой системы В MBR у mkpart первым идёт тип раздела (primary), а не имя.
- Ядро не видит новые разделы
- Учебный диск с разделом
- Образ ФС без разделов
- Убрать за собой
- Подключать образ при загрузке Строка /etc/fstab с опцией loop — mount подключит файл при загрузке.
- Найти новый диск перед разметкой
- Точки монтирования и UUID для fstab
- Свои колонки для скриптов
- Новый раздел под данные
- Найти раздел по метке
- Меньше места под root на большом диске ext4 по умолчанию оставляет 5% места только для root.
- Много мелких файлов Число inode задаётся при создании.
- Файловая система в файле Подробнее — в статье Loop-устройство.
- Overlay и конвертация
- Снимки (internal) Для живых ВМ снимки делают через virsh snapshot-* (см.
- ext4: resize2fs
- xfs: xfs_growfs
- Обе команды одним шагом
- Лимиты и отчёты
- xfs-квоты На xfs механизм иной — квоты включаются опцией монтирования, не quotacheck:
- Команды по слоям Слой Создать Показать Расширить PV pvcreate /dev/sdb pvs — VG vgcreate data /dev/sdb vgs vgextend data /dev/sdc LV lvcreate -L 10G -n vol1 data lvs lvextend -r…
- Создание и расширение
- Снапшоты и перенос
- df / du / ncdu -x/-xdev — ключ к чистому результату:
- Что чистить
- Монтирование Частые опции -o:
- bind и tmpfs
- Новый диск в fstab: UUID и nofail {#nofail} nofail — для дисков с данными.
- Создание
- Замена диска и рост
- Мониторинг
- Сервер /etc/exports (по строке на экспорт):
- Клиент
- Создание и метки Монтировать в /etc/fstab лучше по UUID (имена /dev/sdX «плавают»).
- Тюнинг и инфо (ext4)
- Проверка (fsck) Никогда не запускай fsck на смонтированной ФС — повредишь данные.
Логи и аудит
- Команды
- Свои строки в журнале: logger и -t {#logger} logger -t метка пишет строку в журнал от имени метки, journalctl -t метка показывает только её.
- Централизация и rate-limit Приёмник (central log server) — включить модуль приёма:
- Команды
Загрузка
- Отладка
- Ошибки ядра за эту загрузку {#errors-this-boot}
- Следить за сообщениями {#follow} -w сначала печатает весь буфер — сотни строк загрузки, — а потом ждёт.
- Падение программы: segfault {#segfault} Программа обратилась к памяти, которая ей не принадлежит.
- Ошибка файловой системы ext4 {#ext4-error} ext4 нашла повреждение:
- OOM: процесс завершён из-за памяти {#oom} Строки Out of memory:
- Задача зависла в D {#hung-task} Процесс провёл в состоянии D дольше kernel.hung_task_timeout_secs (120 секунд в Ubuntu; здесь порог уменьшили до 20).
- Найти параметр {#find} 2>/dev/null прячет строки permission denied on key; с sudo видны все параметры.
- Проверить, что значение переживёт перезагрузку {#check-persistent} Если sysctl --system вернул нужное значение, при загрузке будет то же:
- Кто задал значение {#who-set} sysctl --system сначала печатает все строки * Applying … по порядку, потом — все значения.
- Вернуть значение по умолчанию {#revert} Удали свой файл из /etc/sysctl.d/ и задай значение руками (sudo sysctl -w vm.swappiness=60) или перезагрузи машину — sysctl --system старых значений не…
- Найти, что задерживает загрузку {#slow-boot} systemd-analyze — сколько шла загрузка и до какой цели.
- Проверить юнит до запуска {#check-unit} Последняя строка годится для скрипта:
- Поднялась ли служба при загрузке сама {#started-at-boot} ActiveEnterTimestampMonotonic — микросекунды от старта ядра до момента, когда служба стала active:
- GRUB Конфиг — /etc/default/grub (не редактируй сгенерированный grub.cfg напрямую):
- Цели и тайминги Цель Что multi-user.target сервер без графики (норма) graphical.target + GUI rescue.target single-user, корень смонтирован, минимум служб emergency.target…
- Команды
- Автозагрузка и запрет
- dmesg / сообщения ядра Здесь ищут проблемы с драйверами и железом.
- Сменить цель по умолчанию {#set-default} Цель сменится при следующей загрузке.
- Кто запускает юнит при загрузке {#who-wants}
- Загрузиться в rescue или emergency {#boot-into-rescue} В меню GRUB выбери пункт и нажми e.
- Починить из emergency и загрузиться дальше {#fix-from-emergency} mount -a без ошибок — fstab в порядке, и systemctl default доведёт загрузку до цели по умолчанию.
- Узнать версию и происхождение
- Параметры, с которыми ядро загрузилось
- Сообщения ядра при старте и в работе
Пакеты
Безопасность
- Режимы и команды {#modes} Профили — в /etc/apparmor.d/.
- Профили и обкатка Структура профиля (упрощённо):
- Правила: watch и syscall
- Поиск событий
- Разбор события {#event} На учебной машине служба auditd выключена:
- Постоянные правила: rules.d {#rules-d} augenrules собирает /etc/audit/audit.rules из всех файлов rules.d/*.rules и загружает в ядро; при старте auditd делает то же.
- Порт ниже 1024 без root {#low-port} Службе — часть через юнит, программе вне systemd — через файл:
- Найти файлы с capabilities {#find} На чистой машине — три файла из блока выше.
- Какие части у службы {#service-caps}
- Управление
- Шифрование и подпись
- Политика паролей {#password-policy} Проверяй действием:
- Блокировка после трёх неудач {#lockout} Файл заменяется целиком — сверь его прежний стек с этим (grep -v '^#' /etc/pam.d/common-auth | grep .):
- Править PAM и не запереться {#safe-edit} Открой второй терминал с sudo -i и не закрывай до конца проверки.
- Хардненинг Параметр Зачем PermitRootLogin no не пускать root напрямую PasswordAuthentication no только ключи (главное против брутфорса) MaxAuthTries 3 меньше попыток за…
- Команды
- Что отдаёт сервер {#server-certificate} Первый сертификат в выводе — сертификат сайта.
- Проверить цепочку локально Первая команда без промежуточного — error 20 at 0 depth lookup:
- Собрать файл полной цепочки {#fullchain} Порядок — сертификат сайта первым, за ним промежуточный.
- Ключ и сертификат — пара? Суммы совпали — пара.
- Выпустить сертификат с прежним ключом {#renew-same-key} -copy_extensions copy переносит SAN из запроса в сертификат.
- Сколько осталось до конца срока -checkend N — истечёт ли сертификат за N секунд (2592000 — 30 дней):
- Свой CA в доверие системы {#trust-own-ca} Файл должен называться *.crt.
- Let's Encrypt (certbot) Публичный CA для сайтов в интернете:
- Включено ли и когда сработает {#check} Оба значения "1" и оба таймера enabled — обновления идут раз в сутки.
- Отложить пакет {#blacklist} Имена — регулярные выражения:
- Найти службы со старыми файлами {#find-stale}
- Выдать одну команду отдельным файлом Отдельный файл видно сразу, его легко убрать, основной /etc/sudoers не меняется.
- Проверить правило до установки Сначала проверь грамматику, потом смысл:
- Проверить от имени того, кому выдано -n запрещает вопрос о пароле:
- Чтение и правила Правила iptables не сохраняются сами.
- Ограничить службу drop-in'ом {#drop-in} Каждый ключ проверяй работой службы:
- Примерить ключ на одной команде {#systemd-run} systemd-run запускает команду временной службой с теми же ключами:
- ufw
- Постоянный набор nftables {#nftables-persistent} Правила из nft add живут до перезагрузки.
Автоматизация
- Проверить плейбук до прогона {#before-run} --syntax-check на исправном плейбуке печатает только playbook:
- На другую машину по SSH {#remote} Инвентарь node2.ini:
- Часть плейбука {#partial} С -t page выполнились сбор фактов, задача с тегом и её обработчик — ok=3 changed=2.
- Переменная из командной строки {#extra-vars} -e site_title=Новый перекрывает vars:
- Инвентарь {#inventory} Что Где Значит имя машины node2 так машина называется в выводе; по нему же Ansible подключается, если нет ansible_host ansible_host строка машины адрес или имя…
- Разовые команды {#adhoc} ansible <машины> -m <модуль> -a '<параметры>' — один модуль на всех машинах группы.
- become: через sudo {#become} Модули выполняются от того, под кем Ansible вошёл.
- Плейбуки и роли Переменные — group_vars/, host_vars/; секреты — ansible-vault (ansible-vault encrypt secrets.yml, запуск с --ask-vault-pass).
Контейнеры
- Проверить файл перед запуском
- Состояние стека для скрипта --format json печатает объект JSON на строку для каждого контейнера — jq разбирает их по одному.
- Остановить один сервис
- Логи всех сервисов сразу Перед строкой — имя сервиса.
- Почему контейнер остановился Код 0 — команда просто закончилась:
- Пересоздать контейнер с новыми ключами Данные в томе переживут пересоздание, данные в слое контейнера — нет.
- Найти контейнер среди процессов хоста
- Команда в контейнере из скрипта docker exec -it нужен терминал.
- Сайт на nginx:alpine CMD наследуется от основы:
- Процесс не от root adduser -D — busybox-версия:
- Проверить образ до запуска службы
- Пересобрать и подменить контейнер Новый образ сам в работающий контейнер не попадает — контейнер нужно пересоздать.
- Какой образ у контейнера Первое поле inspect — имя, с которым контейнер создан, второе — ID образа.
- Сверить digest вручную index.json указывает на манифест по digest, файл манифеста назван тем же digest, и sha256sum от него даёт то же число.
- Перенести образ на машину без сети
- Список образов для скрипта
- Освободить место
Ничего не найдено. Попробуй запрос короче.