Основы Linux

Справочник основных команд и работы со штатными компонентами

Основные команды

Файлы и каталоги

ls - просмотр содержимого каталога

Показывает список файлов и папок в текущем или указанном каталоге.

ls -lah /var/www/html

Ключи: -l (детальный вывод), -a (включить скрытые файлы), -h (человеко-читаемые размеры)

cd - смена каталога

Переход в другой каталог.

cd /var/www/html

Полезно: cd .. (на уровень вверх), cd ~ или просто cd (домашний каталог)

mkdir - создание каталогов

Создает новые каталоги.

mkdir /var/www/new_site
mkdir -p /var/www/new_site/assets

Ключи: -p — создать промежуточные каталоги, если их нет

rm - удаление файлов и каталогов

Удаляет файлы и каталоги.

rm file.txt
rm -rf /var/www/old_site

Ключи: -r — рекурсивно (для каталогов), -f — без подтверждения

Внимание: Используйте sudo с осторожностью при удалении системных файлов!

Управление пользователями

adduser / useradd - добавление пользователя

Создает нового пользователя в системе.

sudo adduser newuser

Пример с явным указанием домашнего каталога и оболочки:

sudo useradd -m -d /home/newuser -s /bin/bash newuser

passwd - назначение пароля пользователю

Назначает или меняет пароль для пользователя.

sudo passwd newuser

deluser / userdel - удаление пользователя

Удаляет пользователя из системы.

sudo deluser newuser
sudo userdel -r newuser  # удалить пользователя и его домашний каталог

usermod - изменение параметров пользователя

Назначение пользователя в группы, смена оболочки и домашнего каталога.

sudo usermod -aG sudo newuser   # добавить в группу sudo
sudo usermod -d /home/newhome newuser  # смена домашнего каталога
sudo usermod -s /bin/zsh newuser      # смена оболочки

groups - просмотр групп пользователя

groups newuser

Поиск файлов

По имени

Ищет файлы по имени в указанном каталоге или во всей системе.

# поиск всех файлов с расширением .log в /var/log
find /var/log -name "*.log"

#поиск файлов с точным именем find /home/user -name "notes.txt"

По размеру

Ищет файлы определенного размера или диапазона размеров.

# найти файлы больше 100M в /var/www
find /var/www -type f -size +100M

#найти файлы меньше 1K find /home/user -type f -size -1k

#найти файлы размером от 10M до 100M find / -type f -size +10M -size -100M

Дополнительно

Некоторые полезные опции команды find:

Права и разрешения

chmod - изменение прав на файлы и каталоги

Устанавливает права доступа для владельца, группы и других пользователей.

Формат: три цифры XYZ — владельцу, группе, остальным. Каждая цифра — сумма прав: 4 (чтение), 2 (запись), 1 (выполнение).

Примеры:

chmod 755 /var/www/html        # rwxr-xr-x: владелец все, группа/остальные читать+выполнять
chmod 644 /var/www/html/index.html # rw-r--r--: владелец читать+писать, группа/остальные только читать
chmod 700 ~/private               # rwx------: только владелец

Когда использовать:

chown - смена владельца и группы

Назначает владельца и группу для файла или каталога.

sudo chown www-data:www-data /var/www/html -R

Ключи: -R — рекурсивно применить ко всем файлам и папкам

Примеры использования:

chgrp - смена группы

sudo chgrp www-data /var/www/html -R

Системные команды

hostname - смена имени хоста

Показывает или изменяет имя хоста системы.

hostname                # текущий хост
sudo hostname newhost    # временно изменить имя хоста
sudo nano /etc/hostname  # для постоянного изменения
sudo nano /etc/hosts     # исправить запись старого имени

reboot / shutdown - перезагрузка и выключение

sudo reboot
sudo shutdown -h now
sudo shutdown -r +10    # перезагрузка через 10 минут

free / df / du - использование памяти и дисков

free -h               # RAM и swap
df -h                 # свободное место на дисках
du -sh /var/log        # размер каталога

ps / kill - управление процессами

ps aux | grep nginx
kill 12345
kill -9 12345  # принудительное завершение

Полезно

Типичные ошибки

Управление дисками (fdisk)

Введение и меры предосторожности

ВНИМАНИЕ: Деструктивная операция!

`fdisk` — это мощный инструмент, который напрямую изменяет структуру вашего диска. Неправильное использование может привести к полной и необратимой потере всех данных на диске. Перед началом работы:

`fdisk` — это стандартная утилита командной строки Linux для создания и управления таблицами разделов диска. Она поддерживает как старый формат MBR (Master Boot Record), так и современный GPT (GUID Partition Table).

Пошаговое руководство: разметка нового диска

Шаг 1: Идентификация диска

Используйте `lsblk` для просмотра блочных устройств. Новый, неразмеченный диск обычно не будет иметь подразделов.

lsblk

Предположим, наш новый диск — `/dev/sdb`.

Шаг 2: Запуск fdisk

Запустите fdisk в интерактивном режиме для нужного диска.

sudo fdisk /dev/sdb

Шаг 3: Работа в интерактивном режиме (основные команды)

После запуска fdisk вы попадаете в его командную строку. Вот основные команды:

Шаг 4: Обновление информации в ядре

После записи изменений (`w`), ядро Linux может не сразу "увидеть" новую таблицу разделов. Чтобы сообщить ядру об изменениях без перезагрузки, используйте `partprobe`.

sudo partprobe /dev/sdb

Шаг 5: Создание файловой системы

Теперь, когда раздел создан (например, `/dev/sdb1`), его нужно отформатировать, то есть создать на нем файловую систему. `ext4` — отличный выбор по умолчанию.

sudo mkfs.ext4 /dev/sdb1

После этого раздел готов к монтированию. Информацию о монтировании смотрите в соответствующей вкладке.

Пример сессии: создание одного раздела на весь диск

Ниже приведен полный пример команд и ответов в `fdisk` для разметки диска `/dev/sdb` с одним разделом типа "Linux filesystem" с использованием GPT.

$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.37.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command.

Device does not contain a recognized partition table.

Command (m for help): g Created a new GPT disklabel (GUID: ...).

Command (m for help): n Partition number (1-128, default 1): <ENTER> First sector (2048-..., default 2048): <ENTER> Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-..., default ...): <ENTER>

Created a new partition 1 of type 'Linux filesystem' and of size ...

Command (m for help): p Disk /dev/sdb: ... GiB, ... bytes, ... sectors ... Disklabel type: gpt Disk identifier: ...

Device Start End Sectors Size Type /dev/sdb1 2048 ... ... ...G Linux filesystem

Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.

Монтирование (mount)

Монтирование локальных дисков

Для автоматического подключения диска при загрузке системы его нужно добавить в файл /etc/fstab. Используйте UUID — это уникальный идентификатор, который не изменится, в отличие от имени `/dev/sdb1`.

Шаг А: Создайте точку монтирования

Это папка, куда будет "подключаться" ваш раздел.

sudo mkdir /mnt/data
Шаг Б: Узнайте UUID вашего раздела
sudo blkid /dev/sdb1
Шаг В: Добавьте строку в /etc/fstab

Откройте файл /etc/fstab в текстовом редакторе (например, `sudo nano /etc/fstab`) и добавьте в самый конец файла следующую строку, заменив UUID на полученный выше.

# Пример строки для /etc/fstab
UUID=a1b2c3d4-e5f6-7890-1234-567890abcdef  /mnt/data  ext4  defaults,nofail  0  2

Краткое описание опций:

Разбор последних двух параметров: `[dump]` и `[pass]`

Две последние цифры в строке `fstab` (`0 2`) управляют резервным копированием и проверкой файловой системы при загрузке.

Итог: Для всех дополнительных дисков и разделов с данными (не корневых) самая правильная и распространенная комбинация — 0 2.

Монтирование сетевых папок

1. SAMBA (CIFS) - для Windows-сетей

Это пошаговое руководство по настройке автоматического монтирования сетевых папок Windows.

Шаг 1: Установка клиента
sudo apt update && sudo apt install -y cifs-utils
Шаг 2: Создание файла с учетными данными

Чтобы не хранить пароль в открытом виде в `/etc/fstab`, создадим отдельный защищенный файл. Это самый безопасный подход.

# Создаем файл
sudo nano /etc/samba/credentials

#Добавляем в него 2 строки username=your_username password=your_password

#Устанавливаем права (только root сможет его читать) sudo chmod 600 /etc/samba/credentials

Шаг 3: Создание точки монтирования

Это локальная папка, в которую будет "подключен" сетевой ресурс.

sudo mkdir /mnt/samba
Шаг 4: Добавление записи в /etc/fstab

Откройте файл /etc/fstab в текстовом редакторе (например, `sudo nano /etc/fstab`) и добавьте в самый конец файла следующую строку. Замените значения на свои.

# Запись для автоматического монтирования сетевой папки SAMBA
//server-ip/share_name /mnt/samba cifs credentials=/etc/samba/credentials,nofail,uid=1000,gid=1000,vers=3.0,iocharset=utf8,file_mode=0664,dir_mode=0775 0 0

Описание опций CIFS:

2. NFS - для Linux/Unix-сетей

NFS (Network File System) — это "родной" для Linux способ организации сетевого доступа к файлам.

Установка клиента:

sudo apt update && sudo apt install -y nfs-common
Пример 1: Стандартное и надежное монтирование (рекомендуется)

Этот пример использует опцию `hard`, которая заставляет программу "ждать", пока сервер не ответит, что обеспечивает целостность данных. `nfsvers=4` явно указывает использовать современную версию протокола.

server-ip:/path/to/share /mnt/nfs nfs defaults,nofail,hard,nfsvers=4,rsize=8192,wsize=8192 0 0
Пример 2: "Мягкое" монтирование для некритичных данных

Опция `soft` позволяет программе получить ошибку, если сервер не отвечает в течение определенного времени (`timeo`). Это полезно для ресурсов, где "быстрый отказ" лучше, чем "зависание" приложения.

server-ip:/path/to/non-critical/share /mnt/nfs-soft nfs defaults,nofail,soft,timeo=15 0 0

Описание опций NFS:

Программный RAID (mdadm)

1. Установка mdadm и создание RAID

Установите утилиту и создайте массив нужного уровня. Замените `/dev/sd[b-e]` на ваши диски. Перед этим убедитесь, что они не содержат нужных данных.

Установка:

sudo apt update && sudo apt install -y mdadm

Пример создания RAID 1 (зеркало, 2 диска):

sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

Пример создания RAID 5 (мин. 3 диска):

sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

Пример создания RAID 6 (мин. 4 диска):

sudo mdadm --create --verbose /dev/md0 --level=6 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

Пример создания RAID 10 (мин. 4 диска):

sudo mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

2. Настройка и автоподключение RAID

После создания массив нужно отформатировать и настроить для автозагрузки.

Шаг А: Отформатируйте RAID-массив.

sudo mkfs.ext4 /dev/md0

Шаг Б: Сохраните конфигурацию массива, чтобы он собирался при загрузке.

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf

Шаг В: Обновите initramfs, чтобы ядро знало о RAID на раннем этапе загрузки.

sudo update-initramfs -u

Шаг Г: Добавьте массив в `/etc/fstab` для автоматического монтирования, используя его UUID.

# Узнаем UUID массива
sudo blkid /dev/md0

#Добавляем в /etc/fstab (замените UUID и /mnt/raid) UUID=a1b2c3d4-e5f6-7890-1234-567890abcdef /mnt/raid ext4 defaults,nofail,discard 0 2

Комментарии к опциям монтирования:

Разбор последних двух параметров: `[dump]` и `[pass]`

Две последние цифры в строке `fstab` (`0 2`) управляют резервным копированием и проверкой файловой системы при загрузке.

Итог: Для всех дополнительных дисков и разделов с данными (не корневых) самая правильная и распространенная комбинация — 0 2.

UFW Firewall

Что такое UFW?

UFW — это "оболочка" для `iptables`, созданная для упрощения настройки брандмауэра. Она идеально подходит для защиты отдельных серверов, так как позволяет управлять правилами с помощью простых и интуитивно понятных команд, не углубляясь в сложный синтаксис `iptables`.

Базовое управление

Установка

Обычно UFW уже установлен в Ubuntu, но если нет, его можно легко установить.

sudo apt update && sudo apt install ufw

Просмотр статуса

Показывает, активен ли брандмауэр, и список текущих правил.

sudo ufw status verbose

Включение / Выключение

Важно: Перед первым включением убедитесь, что вы добавили правило для SSH, иначе вы потеряете доступ к серверу!

sudo ufw enable
sudo ufw disable

Управление правилами

Настройка правил по умолчанию

Самая безопасная стратегия — запретить все входящие соединения и разрешить все исходящие. Это базовая настройка для любого сервера.

sudo ufw default deny incoming
sudo ufw default allow outgoing

Разрешение подключений

Добавление правил `allow` — основная задача при настройке. Это можно делать по имени сервиса, номеру порта или IP-адресу.

Разрешить SSH (обязательно!):

sudo ufw allow ssh

Разрешить HTTP и HTTPS:

sudo ufw allow http
sudo ufw allow https

Разрешить подключение к порту 5432 по протоколу TCP:

sudo ufw allow 5432/tcp

Разрешить подключения с определенного IP-адреса:

sudo ufw allow from 192.168.1.100

Разрешить подключения с IP-адреса на конкретный порт:

sudo ufw allow from 192.168.1.100 to any port 22

Удаление правил

Удалить правило можно, написав его в обратном порядке, или по номеру.

Удаление по описанию:

sudo ufw delete allow http

Удаление по номеру (более удобный способ):

# Сначала смотрим правила с номерами
sudo ufw status numbered

#Затем удаляем правило по его номеру sudo ufw delete 1

Справочник по SSH

1. Установка и базовая настройка

Установка SSH-сервера (на сервере)

Для Debian/Ubuntu серверная часть SSH устанавливается пакетом `openssh-server`.

sudo apt update && sudo apt install -y openssh-server

Настройка и безопасность (`/etc/ssh/sshd_config`)

Это главный конфигурационный файл SSH-сервера. После внесения изменений **необходимо перезапустить службу**: sudo systemctl restart sshd. Ниже приведен пример безопасной конфигурации.

#Порт, на котором слушает SSH. 22 - стандарт. Для безопасности рекомендуется сменить.
Port 2222

#Запретить вход для пользователя root. Всегда используйте обычного пользователя с sudo. PermitRootLogin no

#Максимальное количество попыток ввода пароля перед разрывом соединения. MaxAuthTries 3

#Отключить аутентификацию по паролю (самый важный шаг для безопасности!). #После этого вход будет возможен ТОЛЬКО по SSH-ключу. PasswordAuthentication no

#Включить аутентификацию по ключам. PubkeyAuthentication yes

#Путь к файлу с разрешенными публичными ключами. AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

#Запретить вход пользователям с пустыми паролями. PermitEmptyPasswords no

#Использовать PAM (Pluggable Authentication Modules). Важно для многих систем. UsePAM yes

Ситуация из жизни: Вы настраиваете новый сервер в интернете. Первым делом после установки ОС вы заходите по временному паролю, настраиваете `sshd_config` как в примере, добавляете свой SSH-ключ (см. раздел 2) и перезапускаете SSH. Только после этого сервер можно считать минимально защищенным.

2. Работа с SSH-ключами (PublicKey Authentication)

Шаг А: Генерация ключей (на вашем компьютере)

Эта команда создает пару ключей: приватный (`id_rsa`), который нужно хранить в секрете, и публичный (`id_rsa.pub`), который вы будете копировать на серверы.

ssh-keygen -t rsa -b 4096

Вам будет предложено ввести пароль для ключа. Это дополнительный слой безопасности: даже если кто-то украдет ваш приватный ключ, он не сможет им воспользоваться без пароля.

Шаг Б: Копирование публичного ключа на сервер

Самый простой и безопасный способ — использовать утилиту `ssh-copy-id`. Она сама создаст нужные файлы и установит правильные права доступа на сервере.

ssh-copy-id username@your_server_ip

Ситуация из жизни: Вы получили доступ к новому рабочему серверу. Чтобы не вводить пароль каждый раз и повысить безопасность, вы одной этой командой прописываете свой ключ на сервере. После этого можно отключать парольную аутентификацию.

3. Примеры подключения и использования

1. Простое подключение

Стандартный способ подключения с использованием вашего ключа по умолчанию.

ssh username@your_server_ip

2. Подключение на нестандартный порт

Используется, если вы изменили порт в `sshd_config` для повышения безопасности.

ssh -p 2222 username@your_server_ip

3. Подключение с указанием конкретного ключа

Полезно, если у вас несколько ключей для разных проектов или серверов.

ssh -i ~/.ssh/my_other_key username@your_server_ip

4. Копирование файла на сервер (SCP)

Простой способ загрузить файл на удаленный сервер.

scp /path/to/local/file.txt username@your_server_ip:/path/to/remote/directory/

5. Копирование папки с сервера (SCP)

Ключ `-r` (рекурсивно) позволяет скопировать целый каталог.

scp -r username@your_server_ip:/path/to/remote/directory /path/to/local/destination

6. Синхронизация каталогов (rsync)

Rsync — более мощный инструмент, чем scp. Он копирует только измененные файлы, что идеально для бэкапов и развертывания сайтов.

rsync -avz --progress /path/to/local/project/ username@your_server_ip:/var/www/project

7. Локальный проброс порта (доступ к удаленной БД)

Позволяет безопасно подключиться к базе данных, работающей на удаленном сервере, как будто она запущена у вас локально.

ssh -L 5433:localhost:5432 username@your_server_ip

Ситуация из жизни: На сервере работает PostgreSQL на порту 5432, но доступ к нему извне закрыт брандмауэром. Эта команда "пробрасывает" удаленный порт 5432 на ваш локальный порт 5433. Теперь вы можете подключиться к `localhost:5433` вашим любимым GUI-клиентом для баз данных.

8. Удаленный проброс порта (показать локальный проект)

Позволяет сделать ваш локальный веб-сервер доступным через публичный IP вашего удаленного сервера.

ssh -R 8080:localhost:3000 username@your_server_ip

Ситуация из жизни: Вы разработали веб-приложение на своем ноутбуке (на порту 3000) и хотите показать его коллеге. Эта команда делает так, что при обращении к `your_server_ip:8080` трафик будет перенаправляться на ваш ноутбук.

9. Использование файла конфигурации (~/.ssh/config)

Чтобы не вводить каждый раз длинные команды, можно создать файл конфигурации. Создайте файл `~/.ssh/config` и добавьте в него блок:

Host my-prod-server
    HostName your_server_ip
    User your_username
    Port 2222
    IdentityFile ~/.ssh/prod_key

После этого для подключения достаточно выполнить короткую команду:

ssh my-prod-server

10. Обратный SSH-туннель (доступ к машине за NAT)

Это продвинутый метод, позволяющий получить доступ к компьютеру, который находится за роутером или брандмауэром (например, ваш домашний ПК).

На домашнем ПК (за NAT) выполните:

ssh -R 9090:localhost:22 user_on_public_server@public_server_ip

Эта команда говорит: "Подключись к публичному серверу и сделай так, чтобы трафик, приходящий на его порт 9090, перенаправлялся на мой локальный 22 порт".

Теперь, находясь на публичном сервере, вы можете подключиться к своему домашнему ПК:

ssh -p 9090 user_on_home_pc@localhost

Bash скрипты

Шаг 1: Создание файла скрипта

Создайте файл с расширением .sh. Первая строка всегда должна быть "shebang" — #!/bin/bash. Он указывает системе, какой интерпретатор использовать для выполнения скрипта.

#!/bin/bash
#Это комментарий
echo "Привет, мир!"

Шаг 2: Предоставление прав на выполнение

По умолчанию текстовый файл не является исполняемым. Используйте команду chmod +x, чтобы это исправить.

chmod +x my_script.sh

Шаг 3: Запуск скрипта

Для запуска укажите путь к файлу. Если вы находитесь в том же каталоге, используйте ./.

./my_script.sh

Автоматизация с помощью Cron

Cron — это планировщик задач. Для редактирования задач текущего пользователя используется команда crontab -e. Каждая строка имеет формат: МИНУТА ЧАС ДЕНЬ_МЕСЯЦА МЕСЯЦ ДЕНЬ_НЕДЕЛИ /путь/к/команде.

Пример записи для выполнения скрипта ежедневно в 2:30 ночи:

30 2 * * * /home/user/scripts/backup.sh >/dev/null 2>&1

Часть >/dev/null 2>&1 перенаправляет весь вывод (стандартный и ошибки) в "никуда", чтобы cron не отправлял вам письма по каждому запуску.

Практические шаблоны скриптов

1. Резервное копирование каталога

Создает .tar.gz архив указанного каталога с датой в имени файла. Идеально для ежедневного бэкапа сайтов или важных документов.

#!/bin/bash
#Каталог, который нужно архивировать
SOURCE_DIR="/var/www/my-site"
# Каталог для хранения бэкапов
BACKUP_DIR="/mnt/backups/sites"
# Имя файла бэкапа с датой
BACKUP_FILENAME="my-site_$(date +%Y-%m-%d).tar.gz"
#Создание архива
tar -czf "$BACKUP_DIR/$BACKUP_FILENAME" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
echo "Бэкап $BACKUP_FILENAME успешно создан."

2. Мониторинг дискового пространства

Проверяет использование диска в указанном разделе. Если использование превышает порог, отправляет письмо на почту.

#!/bin/bash
#Порог в процентах
THRESHOLD=90
#Раздел для проверки
PARTITION="/"
#Email для оповещений
ADMIN_EMAIL="admin@example.com"
#Получаем текущее использование в процентах (без знака %)
CURRENT_USAGE=$(df "$PARTITION" | grep -v Filesystem | awk '{print $5}' | sed 's/%//g')
if [ "$CURRENT_USAGE" -gt "$THRESHOLD" ]; then
  echo "ВНИМАНИЕ: На сервере $(hostname) заканчивается место на диске ($PARTITION). Занято: $CURRENT_USAGE%." | mail -s "Disk Space Alert" "$ADMIN_EMAIL"
fi

3. Проверка и перезапуск сервиса

Проверяет, активен ли указанный сервис (например, nginx). Если нет, пытается его перезапустить и отправляет уведомление.

#!/bin/bash
SERVICE_NAME="nginx"
ADMIN_EMAIL="admin@example.com"
if ! systemctl is-active --quiet "$SERVICE_NAME"; then
    echo "Сервис $SERVICE_NAME не активен! Попытка перезапуска..."
    systemctl restart "$SERVICE_NAME"
    sleep 2
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        echo "Сервис $SERVICE_NAME успешно перезапущен." | mail -s "Service Restart: $SERVICE_NAME" "$ADMIN_EMAIL"
    else
        echo "НЕ УДАЛОСЬ перезапустить сервис $SERVICE_NAME!" | mail -s "CRITICAL: Service Down: $SERVICE_NAME" "$ADMIN_EMAIL"
    fi
fi

4. Очистка старых лог-файлов

Находит и удаляет файлы, которые не изменялись более N дней в указанном каталоге. Помогает освободить место.

#!/bin/bash
#Каталог с логами
LOG_DIR="/var/log/my_app"
#Удалять файлы старше N дней
DAYS=30
find "$LOG_DIR" -type f -name "*.log" -mtime +"$DAYS" -delete
echo "Старые логи в $LOG_DIR удалены."

5. Уведомление о смене публичного IP

Полезно для домашних серверов с динамическим IP. Скрипт проверяет текущий IP и, если он изменился с последнего запуска, отправляет новый IP на почту.

#!/bin/bash
#Файл для хранения последнего известного IP
IP_FILE="/home/user/.last_ip"
ADMIN_EMAIL="myemail@example.com"
#Получаем текущий IP
CURRENT_IP=$(curl -s ifconfig.me)
if [ ! -f "$IP_FILE" ]; then
    echo "$CURRENT_IP" > "$IP_FILE"
fi
LAST_IP=$(cat "$IP_FILE")

if [ "$CURRENT_IP" != "$LAST_IP" ]; then echo "Новый IP-адрес: $CURRENT_IP" | mail -s "IP Address Changed" "$ADMIN_EMAIL" echo "$CURRENT_IP" > "$IP_FILE" fi

6. Аудит успешных входов по SSH

Отправляет на почту список последних успешных входов по SSH. Помогает отслеживать, кто и когда заходил на сервер.

#!/bin/bash
ADMIN_EMAIL="security@example.com"
(echo "Последние 10 успешных входов по SSH на $(hostname):"; echo; last -n 10) | mail -s "SSH Login Audit" "$ADMIN_EMAIL"

7. Создание "снимка" состояния системы

Собирает основную информацию о состоянии системы (нагрузка, память, диск) и сохраняет в лог-файл. Полезно для ретроспективного анализа проблем.

#!/bin/bash
SNAPSHOT_FILE="/var/log/system_snapshots.log"
{ 
    echo "====== SNAPSHOT $(date) ======";
    echo "--- Uptime & Load Average ---";
    uptime;
    echo;
    echo "--- Memory Usage (MB) ---";
    free -m;
    echo;
    echo "--- Disk Usage ---";
    df -h;
    echo "====================================\n";
} >> "$SNAPSHOT_FILE"

8. Массовое переименование файлов

Пример: заменяет пробелы на знаки подчеркивания во всех именах файлов в текущем каталоге. Исправлено для предотвращения перезаписи существующих файлов.

#!/bin/bash
#Перебираем все файлы и папки в текущем каталоге
for file in *; do
    # Проверяем, есть ли пробелы в имени
    if [[ "$file" == *" "* ]]; then
        # Заменяем пробелы на подчеркивания
        new_name=$(echo "$file" | tr ' ' '_')
        # ПРОВЕРКА: не перезаписать существующий файл
        if [ ! -e "$new_name" ]; then
            mv "$file" "$new_name"
            echo "Переименовано: '$file' -> '$new_name'\n"
        else
            echo "ОШИБКА: Файл '$new_name' уже существует. Пропуск '$file'.\n"
        fi
    fi
done

9. Безопасное уведомление об обновлениях

Вместо рискованного авто-обновления, этот скрипт проверяет наличие доступных обновлений и отправляет их список администратору на почту. Это позволяет принять взвешенное решение об обновлении вручную.

#!/bin/bash
ADMIN_EMAIL="admin@example.com"
#Обновляем список пакетов в тихом режиме
apt-get update > /dev/null
#Получаем список пакетов, доступных для обновления
UPGRADABLE=$(apt-get -s upgrade | awk '/^Inst/ {print $2}')
if [ -n "$UPGRADABLE" ]; then
    (echo "На сервере $(hostname) доступны следующие обновления:"; echo; echo "$UPGRADABLE") | mail -s "System Updates Available" "$ADMIN_EMAIL"
fi


Мониторинг и отладка

Работа со службами мониторинга, логирование, отладка

Мониторинг и отладка

Journalctl - справочник

Journalctl — это утилита для работы с системным журналом systemd.
Она объединяет логи всех сервисов и ядра в единое хранилище, доступное через команды фильтрации.
В отличие от классических /var/log/syslog и /var/log/messages, journalctl позволяет быстро находить ошибки, фильтровать логи по времени, сервисам, приоритетам.

Просмотр всех логов

Простая команда для просмотра системного журнала:

journalctl

Обычно логи будут длинные, поэтому часто используют -e (сразу перейти к концу).

journalctl -e
Просмотр последних событий в реальном времени
journalctl -f

Аналогично tail -f /var/log/syslog. Удобно использовать при отладке сервисов.

Фильтрация по сервису

Посмотреть логи конкретного сервиса:

journalctl -u nginx

В реальном времени:

journalctl -u nginx -f
Фильтрация по времени

Примеры:

journalctl --since "2025-10-01" --until "2025-10-05"   # за указанный период
journalctl --since "2 hours ago"                        # за последние 2 часа
journalctl --since yesterday                            # за вчерашний день
Фильтрация по приоритетам (уровням)

Приоритеты: emerg, alert, crit, err, warning, notice, info, debug.

journalctl -p err        # только ошибки
journalctl -p warning    # предупреждения
journalctl -p info       # информационные сообщения
Просмотр логов загрузки
journalctl -b      # текущая загрузка
journalctl -b -1   # предыдущая загрузка
journalctl -b -2   # позапрошлая загрузка

Очень полезно для анализа причин падения системы или kernel panic.

Просмотр логов ядра
journalctl -k             # сообщения ядра
journalctl -k -p err      # только ошибки ядра
Ограничение количества строк
journalctl -n 50          # последние 50 строк
journalctl -n 100 -u ssh  # последние 100 строк сервиса ssh
Вывод в удобочитаемом или машинном формате
journalctl -o short       # стандартный вывод
journalctl -o json-pretty # JSON-формат, удобно для анализа
journalctl -o cat         # только текст сообщения
Типичные ситуации и примеры использования
Типичные ошибки и решения
Мониторинг и отладка

systemctl — справочник

Systemctl — утилита для управления systemd — системой инициализации и менеджером служб в Linux. Она отвечает за запуск и контроль демонов, таймеров, точек монтирования и других компонентов, описываемых unit-файлами.

Кратко

systemd управляет набором объектов: сервисами, сокетами, таймерами, монтированиями и т.д. Каждый объект описывается unit-файлом; systemctl — основной интерфейс для взаимодействия с этими unit'ами и с самой системой.

Что такое unit-файл?

Unit-файл — это конфигурационный файл, который описывает, как именно systemd должен управлять конкретным компонентом (сервисом, сокетом, таймером и т.д.). Обычно имеют расширение .service, .socket, .timer, .mount, .target и т.д.

Где хранятся:

Пример простого unit-файла (nginx.service):


Description=A high performance web server
After=network.target
[Service]
ExecStart=/usr/sbin/nginx -g 'daemon off;'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target 

Пояснение полей:

Базовое управление

Проверка статуса сервиса

Команда показывает состояние (active/failed), PID, путь к unit-файлу и последние строки логов:

sudo systemctl status nginx
Запуск / Остановка / Перезапуск

Запуск вручную (не влияет на автозапуск при следующей загрузке):

sudo systemctl start nginx

Остановка:

sudo systemctl stop nginx

Перезапуск (полностью остановит, затем запустит):

sudo systemctl restart nginx

Перезапустить только если сервис уже запущен:

sudo systemctl try-restart nginx

Когда использовать: перезапуск обязателен при изменении конфигурации демона, но перед этим убедитесь, что unit-файл и конфигурация корректны.

Автозагрузка сервисов

enable / disable

enable создаёт символьные ссылки unit'а в каталогах target'ов — сервис запустится при загрузке системы. disable убирает эти ссылки, но не мешает ручному запуску.

sudo systemctl enable nginx
sudo systemctl disable nginx
systemctl is-enabled nginx

Важно: enable не запускает сервис немедленно — для этого используйте start или restart.

Маскирование (mask / unmask)

Иногда нужно гарантированно запретить запуск сервиса — даже случайный или зависимый запуск. Для этого используется mask, который перенаправляет unit на /dev/null.

sudo systemctl mask nginx    # сервис нельзя будет запустить ни вручную, ни зависимостями
sudo systemctl unmask nginx  # снять маску

Когда применять mask:

Работа с изменениями unit-файлов

После добавления/изменения unit-файла systemd нужно пересканировать. Это делается командой:

sudo systemctl daemon-reload

Дальше обычно перезапускают сервис:

sudo systemctl restart имя_сервиса

Если забыть daemon-reload, systemd будет использовать старую конфигурацию, даже если файл на диске изменён.

Targets (аналог runlevels)

В systemd понятие runlevel заменено на targets — наборы unit'ов, которые запускаются вместе.

systemctl get-default               # посмотреть текущую цель
sudo systemctl set-default multi-user.target  # установить дефолтную цель
sudo systemctl isolate multi-user.target     # переключиться сразу

Логи: journalctl

systemd использует журнал (journald). Для просмотра логов сервиса применяют:

journalctl -u nginx         # все логи для unit
journalctl -u nginx -f      # следить в реальном времени

Полезно сочетать с временными фильтрами: --since, --until, и с -p (уровень приоритета).

Полезные команды и списки

systemctl list-units --type=service        # активные службы
systemctl list-unit-files --type=service     # все файлы unit (включая disabled)
systemctl is-active ssh                       # быстро узнать, активен ли сервис
systemctl list-dependencies имя_сервиса       # показать зависимости

Типичные ошибки и их решения

1) Изменил unit-файл, но изменения не применились
sudo systemctl daemon-reload
sudo systemctl restart имя_сервиса

Обязательная последовательность: daemon-reload → перезапуск/старт.

2) Failed to start ...

Проверяем статус и логи:

sudo systemctl status имя_сервиса
journalctl -xeu имя_сервиса

Частые причины: ошибка в пути в ExecStart, неверные права, конфликт портов, отсутствующие зависимости.

3) Сервис запускается вручную, но не стартует при загрузке
systemctl is-enabled имя_сервиса
sudo systemctl enable имя_сервиса

Проверьте также, не мешают ли target'ы или маскировка, и нет ли ошибок в [Install] блока unit-файла (например, WantedBy=).

4) "Unit not found"

Скорее всего unit-файл отсутствует или не установлен:

systemctl list-unit-files | grep имя_сервиса

Возможные причины: пакет не установлен, unit называется иначе, или unit расположен в нестандартном каталоге.

5) Unit помечен как masked
systemctl is-enabled имя_сервиса   # покажет "masked"
sudo systemctl unmask имя_сервиса

Типы unit-файлов (кратко)

Короткие рекомендации (best practices)

Мониторинг и отладка

top и htop

Что такое top и htop?

top и htop — консольные утилиты для мониторинга процессов в Linux. С их помощью можно в реальном времени отслеживать загрузку процессора, использование памяти, swap, uptime и управлять процессами. Разница: top есть по умолчанию в любой системе, htop удобнее и нагляднее, но может требовать установки.

Установка htop
sudo apt install htop   # Ubuntu/Debian
sudo yum install htop   # CentOS/RHEL
sudo dnf install htop   # Fedora
Запуск
top
htop
Навигация и команды
Примеры использования
top -o %MEM             # отсортировать процессы по памяти
htop -u www-data        # показать процессы пользователя www-data
top -n 1 -b > /tmp/top.txt  # вывести результат в файл (batch mode)
Типичные ситуации
Типичные ошибки и решения
Мониторинг и отладка

netstat, ss и ip

Что такое netstat, ss и ip?

Эти утилиты используются для диагностики сетевых подключений и маршрутов:
- netstat — старая утилита (в пакете net-tools).
- ss — современная замена netstat.
- ip — инструмент для управления сетевыми интерфейсами, IP-адресами и маршрутами.

Базовые примеры
ss -tuln                # список слушающих портов
ss -tulpn | grep 5432   # найти процесс на порту 5432
ip a                    # список интерфейсов и адресов
ip r                    # таблица маршрутов
ip link show up         # активные интерфейсы
netstat -anp            # (устар.) список соединений с PID
Диагностика
Типичные ошибки

Netplan

network:
  version: 2
  renderer: networkd
  ethernets:
    enp6s18: #название интерфейса
      dhcp4: no
      dhcp6: no
      addresses:
        - 10.177.178.47/24 #IP
      nameservers:
        addresses:
          - 10.177.178.42 #DNS
      routes:
        - to: default
          via: 10.177.178.1 #Gateway

Конфигурация для статики. Меняем по пути /etc/netplan/имя_конфигурации.yaml.
После изменения применяем команду:

sudo netplan apply