Главная Темы Тема 4: Введение в bash
$
Главная Темы Упражнения Шпаргалка Ресурсы
04
Основы терминала

Введение в bash

Интерфейс командной строки, потоки ввода/вывода, пайпы и основные команды для администрирования Linux.

🕐 ~25 мин чтения 🟢 Уровень: новичок

🐚 Что такое оболочка (shell) и bash?

Операционная система Linux во многом имеет схожую структуру и систему команд с ОС Unix. Пользователь может работать с помощью командной строки (оболочки). Оболочка (shell) – это программа, которая предоставляет пользователю интерфейс для взаимодействия с операционной системой путем выполнения команд. Оболочка является одной из важнейших частей системы.

Многие важные части системы являются сценариями оболочки (shell script) – файлами, содержащими последовательность команд оболочки.

Существуют различные варианты оболочек Unix, но все они, как правило, заимствуют функции у оболочки Bourne shell (/bin/sh). В системе Linux используется улучшенная версия Bourne shell – bash. Bash является оболочкой по умолчанию в большинстве дистрибутивов Linux. Существуют также другие оболочки, например sh, zsh, fish. Окно, в котором вы взаимодействуете с оболочкой, называется терминалом.

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

ls
user@linux:~$
ls -la /var/log/
# Основное применение – просмотр содержимого нужной папки.
📘
Основные опции ls:
  • -a – отображение всех файлов, включая скрытые (начинаются с точки).
  • -l – подробный список: разрешения, владелец, группа, дата, размер.
  • -c – сортировка файлов по времени модификации/создания (сначала новые).
  • -d – вывод только директорий, без их содержимого.
  • -F – показывает информацию о типе объекта (например, добавляет `/` к папкам).
Подробнее: losst.pro/komanda-ls-linux
Команда Описание Полезные ссылки
cd /путь/к/папке Смена текущего рабочего каталога на указанный. Примеры cd
pwd Вывести в терминал полный пустой путь к текущей директории. Примеры pwd
echo "строка" Выводить строку текста в терминал. Применяется в скриптах и для редактирования конфигов. Примеры echo
cat файл1 файл2 Выводит содержимое одного или нескольких файлов. Выполняет их конкатенацию. Примеры cat
man команда Позволяет получить справку (manual) по переданной команде, функции или программе. Что такое man

📁 Работа с файлами и директориями

создание и удаление
user@linux:~$
touch file.txt
# Создает файл. Если уже существует - обновляет время изменения.
user@linux:~$
mkdir -p project/docs
# Создает директории. Опция -p позволяет создавать вложенные папки.
user@linux:~$
rmdir empty_dir/
# Удаляет только ПУСТЫЕ директории. Если есть файлы — выдаст ошибку.
user@linux:~$
rm -rf project/
# Удаление файлов и папок. -r рекурсивно, -f без подтверждений.
⚠️
Параметры удаления `rm`:
  • -f (force) – игнорировать несуществующие, не запрашивать подтверждений.
  • -i (interactive) – выводить запрос перед удалением каждого файла.
  • -v (verbose) – выводить информацию об удаляемых файлах.
перемещения и права
user@linux:~$
cp file1.txt file_copy.txt
# Копирует файл file1 в новый файл file_copy
user@linux:~$
cp -r /source/ /destination/
# Копирует каталог целиком (-r рекурсивно)
user@linux:~$
mv document.txt /backups/
# Перемещает файл в другую папку (или переименовывает его)
user@linux:~$
chmod ugo+rw file.txt
# Разрешаем чтение и запись (rw) для u (владельца), g (группы) и o (остальных)
user@linux:~$
chmod 755 script.sh
# Цифровой формат: 7=rwx (владелец), 5=r-x (т.е. чтение и выполнение) для группы и остальных
user@linux:~$
chown user:www-data config.conf
# Меняет владельца файла на `user`, а группу на `www-data`

Полезные ссылки по разделу: Права chmod Команда chown Команда cp Команда mv

📦 Работа с архивами

Архивирование — процесс объединения нескольких файлов/директорий в один файл. Сжатие — уменьшение размера файла. Архивы часто дополнительно сжимаются.

tar
user@linux:~$
tar -cvf archive.tar /var/log/
# Создать (-c) архив из папки. -v (verbose) — показать процесс, -f — указать файл архива.
user@linux:~$
tar -xvf archive.tar
# Извлечь (-x) файлы из архива в текущую папку.

Подробнее об архивации: losst.pro/arhivatsiya-v-linux

🔀 Потоки ввода/вывода и перенаправление

В Linux есть три стандартных потока:

  • STDIN — стандартный ввод (файловый дескриптор 0). Используется для получения данных от пользователя или процесса.
  • STDOUT — стандартный вывод (файловый дескриптор 1). Куда передаются результаты команд (обычно в экран).
  • STDERR — стандартный поток ошибок (файловый дескриптор 2). Куда передаются сообщения об ошибках.

Перенаправления

> >> < 2> &>
user@linux:~$
echo "Hello" > output.txt
# STDOUT перенаправляется в output.txt. Содержимое файла ПЕРЕЗАПИСЫВАЕТСЯ.
user@linux:~$
echo "World" >> output.txt
# STDOUT перенаправляется в output.txt. Данные ДОБАВЛЯЮТСЯ в конец файла.
user@linux:~$
ls /root/ 2> errors.txt
# STDERR (так как нет прав) перенаправляется в errors.txt
user@linux:~$
grep "error" &> all_output.txt
# Перенаправление ВСЕХ потоков данных (1 и 2) в файл!
user@linux:~$
sort < names.txt
# Команда получает свой ввод (STDIN) из файла names.txt

Конвейеры (Пипе | Pipe) и xargs

Pipe ( | ) служит для передачи вывода одной команды (STDOUT) напрямую на стандартный ввод (STDIN) другой.

pipe & tee
user@linux:~$
ls -l | grep ".txt"
# Передача вывода ls на вход grep, который оставит в выводе только строки с .txt
user@linux:~$
uptime | tee output.txt
# Команда tee выводит STDOUT и на экран, и одновременно записывает в output.txt
user@linux:~$
find . -name "*.log" | xargs rm
# xargs берет вывод (пути к логам) и передает их как аргументы команды rm (т.е. удаляет все)

Примеры использования xargs: losst.pro/komanda-xargs-linux

🛠️ Полезные утилиты bash (для изучения)

Изучите самостоятельно, в каких случаях используются следующие утилиты (ссылки ведут на развернутые статьи):

Утилита Что это? Ресурсы
htop Интерактивный продвинутый диспетчер процессов Статья на Habr
grep Поиск строк по шаблону / регулярному выражению Гайд Selectel
df Показ свободного места на файловых системах Обзор df
du Размер, занимаемый файлами и папками на диске Обзор du
find Утилита для поиска файлов по параметрам Статья на Habr
nano Самый простой текстовый консольный редактор Для новичков
less Постраничный просмотр текста и логов в консоли Обзор less
sed / awk Потоковые текстовые редакторы и язык обработки Awk в Linux, Шпаргалка sed/awk
head / tail Чтение файла с самого начала (head) или с конца (tail) --
lsof Просмотр списка открытых файлов и сетевых портов Статья на Habr
netstat Отображение сетевых соединений и таблиц маршрутизации Пособие по netstat
ps Просмотр снимка запущенных процессов Обзор ps
ssh / scp Безопасный доступ и копирование по сети Команды SSH
lsblk / mount Работа с дисками и точками монтирования файлов Wiki-статья
👨‍🏫

Советы

Больше практики! Придумывайте себе простые реальные задачи и автоматизируйте их скриптами. Самые частые примеры из жизни сисадмина:

  • Ротация файлов (удаление старых логов).
  • Резервное копирование (бэкапирование важных папок).
  • Очистка дискового пространства по расписанию.
  • Отправка отчетов и уведомлений по почте.
  • Выполнение пакетных скриптов для настройки архитектуры.

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

Что почитать: Настоятельно рекомендую изучить культовый цикл статей по bash-скриптам от RUVDS на Хабре.

🏋️ Практические упражнения

01

Скрипт мониторинга системы и управления логами

Средний ~20 мин

Цель: создать скрипт, который выполняет мониторинг системы и сохраняет результаты в лог-файлы.

Требования:

  1. Используйте команды для проверки загрузки CPU, памяти, места на диске.
  2. Выводите результаты в лог-файл, разделяя STDOUT и STDERR.
  3. Реализуйте ротацию логов (например, сохраняйте логи за последние 3 дня, старые удаляйте).
  4. Добавьте обработку сигналов (SIGINT, SIGTERM), чтобы скрипт корректно завершался.
  5. Добавьте опцию для вывода отладочной информации (set -x).
💡 Показать решение
Решение - script.sh
user@linux:~$
nano monitoring.sh
# Вставьте следующий код в редактор и сохраните (Ctrl+O, Enter, Ctrl+X):
#!/bin/bash # set -x LOG_DIR="/var/log/sys_monitor" LOG_FILE="$LOG_DIR/system_$(date +%F).log" ERR_FILE="$LOG_DIR/error_$(date +%F).log" mkdir -p "$LOG_DIR" cleanup() { echo "Скрипт прерван или завершен. Сохранение данных..." | tee -a "$LOG_FILE" exit 0 } trap cleanup SIGINT SIGTERM echo "--- Мониторинг от $(date) ---" >> "$LOG_FILE" { echo "[CPU Load]" uptime echo "[Memory]" free -m echo "[Disk Space]" df -h } >> "$LOG_FILE" 2>> "$ERR_FILE" find "$LOG_DIR" -type f -name "*.log" -mtime +3 -exec rm {} \; echo "Успешно завершено."

Разбор скрипта:

  • #!/bin/bash — шебанг, указывающий на использование интерпретатора bash.
  • set -x — (закомментировано) включает режим отладки, выводя каждую команду перед выполнением.
  • LOG_DIR, LOG_FILE, ERR_FILE — переменные для путей к директориям и файлам логов.
  • mkdir -p "$LOG_DIR" — создание директории для логов, если она еще не создана.
  • cleanup() { ... } — функция для корректного завершения работы.
  • trap cleanup SIGINT SIGTERM — перехват сигналов прерывания (Ctrl+C) и сигнала завершения.
  • { ... } >> "$LOG_FILE" 2>> "$ERR_FILE" — блок команд, вывод которых перенаправляется в основной лог, а ошибки — в лог ошибок.
  • find ... -mtime +3 -exec rm {} \; — поиск и удаление логов старше 3 дней (ротация).
user@linux:~$
chmod +x monitoring.sh && ./monitoring.sh
02

Система резервного копирования и проверки целостности

Средний ~15 мин

Цель: автоматизировать процесс резервного копирования файлов и проверку целостности.

Требования:

  1. Напишите скрипт для инкрементального копирования (rsync) или создания архивов (tar).
  2. Выполните проверку целостности архива с помощью md5sum.
  3. Запишите успех в STDOUT-лог, а ошибки в STDERR-лог.
  4. Настройте выполнение через cron.
💡 Показать решение
Решение - backup.sh
user@linux:~$
nano backup.sh
# Вставьте следующий код в редактор и сохраните (Ctrl+O, Enter, Ctrl+X):
#!/bin/bash SRC="/path/to/source" DEST="/path/to/backup" ARCHIVE="$DEST/backup_$(date +%F).tar.gz" mkdir -p "$DEST" if tar -czf "$ARCHIVE" "$SRC" 2> /var/log/backup_error.log; then md5sum "$ARCHIVE" > "$ARCHIVE.md5" echo "$(date): Резервное копирование успешно - $ARCHIVE" >> /var/log/backup.log else echo "$(date): Ошибка копирования" >> /var/log/backup_error.log fi

Разбор скрипта:

  • SRC, DEST, ARCHIVE — задание переменных для путей исходных данных, папки бэкапа и имени файла.
  • mkdir -p "$DEST" — создание директории назначения, если она не существует.
  • tar -czf "$ARCHIVE" "$SRC" — создание сжатого архива исходной папки.
  • 2> /var/log/backup_error.log — перенаправление сообщений об ошибках в лог.
  • if ... then ... else — логика проверки успешного завершения команды архивации.
  • md5sum — создание файла с контрольной суммой для будущей проверки целостности архива.
  • echo "$(date) ..." — запись сообщения об успехе или ошибке с текущей датой в лог-файл.
user@linux:~$
crontab -e
# В конец файла добавьте строку для запуска каждый день в 02:00:
0 2 * * * /bin/bash /путь/до/backup.sh
03

Анализ процессов и диагностика системы

Средний ~20 мин

Цель: провести диагностику системы с помощью инструментов анализа.

Требования:

  1. Создайте высокую нагрузку на CPU (или запустите процесс) и изучите его с помощью top/htop и /proc.
  2. Создайте процессы-сироты или зомби и отследите их через ps.
  3. Выполните анализ команды ls с расшифровкой системных вызовов через strace.
  4. Измените приоритет процесса с помощью nice/renice и посмотрите влияние на систему.
💡 Показать решение
Решение терминала
user@linux:~$
strace -o syscalls.log ls
# Анализируем системные вызовы команды ls и пишем их в лог
user@linux:~$
cat /dev/urandom | gzip -9 > /dev/null &
# Искусственная нагрузка на CPU для тестов (работает в фоне)
user@linux:~$
ps aux | grep gzip
# Находим PID нашего процесса
user@linux:~$
renice -n 10 -p [PID]
# Понижаем приоритет процесса (передавая управление другим задачам)
user@linux:~$
kill -9 [PID]
# Завершаем процесс нагрузки
04

Автоматизация управления пользователями

Сложный ~30 мин

Цель: создать скрипт для массового управления пользователями из CSV.

Требования:

  1. Считывание пользователей из CSV-файла (имя,группа) и их создание.
  2. Генерация паролей и создание SSH-ключей.
  3. Добавление в группы, контроль прав (chmod/chown) на домашние директории.
  4. Логирование создания и ошибок. Добавить возможность массового удаления.
💡 Показать решение
Решение - users.sh
user@linux:~$
nano users.sh
# Реализация массового создания пользователей:
#!/bin/bash INPUT_FILE="users.csv" LOG_FILE="user_management.log" while IFS=',' read -r username groupname; do if id "$username" &>/dev/null; then echo "Пользователь $username уже существует" else useradd -m -g "$groupname" -s /bin/bash "$username" echo "password123" | passwd --stdin "$username" 2>/dev/null mkdir -p "/home/$username/.ssh" ssh-keygen -t rsa -N "" -f "/home/$username/.ssh/id_rsa" chown -R "$username":"$groupname" "/home/$username/.ssh" chmod 700 "/home/$username/.ssh" echo "$(date): Успех - создан $username в группе $groupname" >> "$LOG_FILE" fi done < "$INPUT_FILE"

Разбор скрипта:

  • while IFS=',' read -r — цикл для чтения CSV-файла построчно с разделителем «запятая».
  • id "$username" — проверка существования пользователя в системе перед созданием.
  • useradd -m -g — создание пользователя с домашней директорией и привязкой к группе.
  • passwd --stdin — автоматическая установка пароля (требует прав суперпользователя).
  • ssh-keygen -N "" — генерация RSA-ключей без ввода пароля для автоматизации.
  • chown -R — рекурсивная смена владельца папки .ssh.
  • chmod 700 — ограничение прав доступа к SSH-ключам (только для владельца).
# Пример для массового удаления:
while IFS=',' read -r username; do userdel -r "$username" 2>/dev/null done < delete_users.csv