Осмотреться на сервере
| Задача | Команда | Пояснение |
|---|
| кто я и в каких группах | id | UID, основная и дополнительные группы текущего пользователя |
| что лежит в каталоге, со скрытыми | ls -la путь | права, владелец, группа, размер, дата |
| всё дерево каталога | ls -lR путь | рекурсивный список с правами |
| права каждого каталога на пути | namei -l /путь/к/файлу | показывает, на каком каталоге доступ обрывается |
| права числом и буквами | stat -c "%a %A %U:%G %n" путь | права, владелец и группа одной строкой |
| прочитать файл постранично | less файл | поиск — /, выход — q |
| какой это файл | file путь | скрипт, программа, текст, ссылка |
Найти файлы
| Задача | Команда | Пояснение |
|---|
| файлы старше N дней | find каталог -type f -mtime +N | -mtime считает полные сутки |
| файлы по маске имени | find каталог -name 'маска*' | маску берут в кавычки |
| файлы пользователя по всей системе | sudo find / -xdev -user имя 2>/dev/null | -xdev — не заходить в другие файловые системы |
| исключить путь из поиска | find / -xdev -user имя -not -path '/home/имя*' | |
| программы с битом setuid | sudo find / -xdev -perm -4000 -type f 2>/dev/null | |
| файлы, доступные всем на запись | find каталог -perm -o+w -type f | |
| к какому пакету относится файл | dpkg -S /usr/bin/passwd | «no path found» — файл не из пакета |
| подробный список найденного | find … -ls | как ls -l для каждого найденного файла |
Место на диске
| Задача | Команда | Пояснение |
|---|
| заполнение файловых систем | df -h | Use% — процент заполнения; df -h путь — файловая система этого пути |
| сколько занимает каталог | sudo du -sh каталог | |
| что занимает место внутри | sudo du -sh каталог/* | sort -h | самые большие — внизу |
| куда подключён раздел | findmnt путь | источник, тип файловой системы, параметры |
| растёт ли файл | ls -l файл; sleep 10; ls -l файл | сравнить размер |
| следить за концом файла | tail -f файл | выход — Ctrl+C |
Файлы: копировать, перенести, проверить
| Задача | Команда | Пояснение |
|---|
| скопировать с правами и владельцем | sudo cp -a откуда куда | -a сохраняет права, владельца и даты |
| скопировать и сразу задать права | sudo install -o владелец -g группа -m ПРАВА файл каталог/ | man install |
| перенести | sudo mv откуда куда | root при переносе сохраняет владельца |
| контрольная сумма | sha256sum файл | до и после переноса суммы должны совпасть |
| создать путь целиком | mkdir -p /путь/к/каталогу | не ошибается, если каталог уже есть |
| резервная копия файла перед правкой | sudo cp -a файл файл.bak | |
| заменить строку в файле | sudo sed -i 's/^КЛЮЧ=.*/КЛЮЧ=значение/' файл | или открыть в sudo nano файл |
Пользователи и группы
| Задача | Команда | Пояснение |
|---|
| сведения об учётной записи | getent passwd имя | семь полей: имя, x, UID, GID, описание, домашний каталог, оболочка |
| создать пользователя | sudo useradd -m -s /bin/bash -G группа имя | man useradd: -r — системная запись, -M — без домашнего каталога, -d — путь |
| задать пароль | sudo passwd имя | |
| добавить в группу | sudo usermod -aG группа имя | без -a список групп заменяется целиком |
| убрать из группы | sudo gpasswd -d имя группа | |
| кто в группе | getent group группа | |
| состояние пароля | sudo passwd -S имя | L — заблокирован, P — задан |
| срок действия записи | sudo chage -l имя | |
| изменить учётную запись | man usermod | группы, оболочка, блокировка, срок действия |
sudo
| Задача | Команда | Пояснение |
|---|
| мои права | sudo -l | |
| права другого пользователя | sudo -l -U имя | |
| создать правило отдельным файлом | sudo visudo -f /etc/sudoers.d/имя | visudo не сохранит файл с ошибкой |
| проверить файл правил | sudo visudo -cf /etc/sudoers.d/имя | |
| выполнить от имени пользователя | sudo -u имя команда | так проверяют доступ каждой роли |
| проверить запрет без пароля | sudo -u имя sudo -n команда | -n — не спрашивать пароль, сразу отказ |
| где упоминается пользователь | sudo grep -r имя /etc/sudoers /etc/sudoers.d /etc/group | |
Права и владельцы
| Задача | Команда | Пояснение |
|---|
| права числом | chmod 640 файл | r = 4, w = 2, x = 1 для владельца, группы, остальных |
| права буквами | chmod g+w,o= файл | |
| особые биты | chmod 2770 каталог | четвёртая цифра: 4 — setuid, 2 — setgid, 1 — sticky |
| сменить владельца и группу | sudo chown владелец:группа путь | -R — со всем содержимым |
| маска оболочки | umask | снимает биты с прав 666 у файлов и 777 у каталогов |
| маска процесса | grep Umask /proc/PID/status | |
| проверить чтение от чужого имени | sudo -u имя test -r файл && echo читает | -w — запись, -x — запуск |
Процессы
| Задача | Команда | Пояснение |
|---|
| процессы пользователя | ps -u имя -o pid,ppid,stat,%cpu,etime,cmd | |
| найти по командной строке | pgrep -af образец | |
| дерево процессов | pstree -p PID | |
| предки процесса | pstree -s -p PID | |
| когда запущен | ps -o lstart,etime -p PID | |
| рабочий каталог процесса | sudo ls -l /proc/PID/cwd | |
| открытые файлы процесса | sudo ls -l /proc/PID/fd | видно, в какой журнал процесс пишет |
| какой процесс слушает порт | sudo ss -ltnp | столбец Process |
| попросить завершиться | kill PID | TERM; процесс может его перехватить |
| завершить принудительно | kill -9 PID | KILL; после него проверить, что осталось за процессом |
| сигнал всем процессам пользователя | sudo pkill -u имя | затем проверить pgrep -u имя |
Нагрузка
| Задача | Команда | Пояснение |
|---|
| нагрузка и число ядер | uptime; nproc | |
| самые загруженные | ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu | head | |
| самые большие по памяти | ps -eo pid,user,rss,cmd --sort=-rss | head | |
| снимок top | top -b -n 1 | head -20 | |
| изменить приоритет | sudo renice -n N -p PID | nice от −20 до 19 |
| память | free -h | смотреть на available |
Скрипты bash
Скрипт — команды, записанные в файл по порядку. Запуск: sudo bash script.sh. Скрипт эксплуатации должен выдерживать повторный запуск: шаг, который уже выполнен, не ломает работу.
| Конструкция | Пример | Что делает |
|---|
| первая строка | #!/bin/bash | каким интерпретатором выполнять файл |
| строгий режим | set -eu | остановиться на первой ошибке и на неизвестной переменной |
| переменная | DIR=/srv/app; ls "$DIR" | имя без пробелов вокруг =; при использовании — в кавычках |
| аргумент скрипта | U=${1:-} | первый аргумент или пусто, если его нет |
| вывод команды в переменную | P=$(pgrep -f образец) | |
| условие | if [ -d "$DIR" ]; then echo есть; else echo нет; fi | -d — каталог, -f — файл, -e — существует, -z — пустая строка |
| выполнить, если первое не удалось | mkdir /srv/app 2>/dev/null || echo "каталог уже есть" | так шаг не падает при повторном запуске |
| цикл | for f in a.txt b.txt; do echo "$f"; done | |
| функция | step() { echo "== $*"; } | вызов: step "Шаг 1" |
| проверить синтаксис без запуска | bash -n script.sh | |
| запуск с печатью каждой команды | bash -x script.sh | удобно искать, на каком шаге ошибка |