Основы Linux и программирования в терминале: от первых команд до автоматизации

Курс предназначен для глубокого погружения в архитектуру Linux и командную строку Bash с нуля. Вы пройдете путь от понимания ядра системы до создания сложных скриптов автоматизации и управления ресурсами.

1. Устройство Linux и первые шаги в терминале

Устройство Linux и первые шаги в терминале

Представьте, что вы купили огромный современный завод, но вместо привычного пульта управления с кнопками и экранами вам выдали печатную машинку. Чтобы запустить конвейер или проверить склад, вам нужно не кликать мышкой, а отправлять текстовые депеши. Именно так чувствует себя новичок, впервые открывший терминал Linux. Однако за этой кажущейся архаичностью скрывается мощь, позволяющая управлять серверами в Антарктиде или суперкомпьютерами, не отрывая рук от клавиатуры.

Философия Linux и роль ядра

В основе Linux лежит кардинально иной подход к взаимодействию с «железом», чем в Windows или macOS. Если в бытовых ОС интерфейс — это и есть система, то в Linux графическая оболочка — лишь одна из многих программ, которую можно выключить, заменить или вообще не устанавливать. Сердцем всего является Ядро (Kernel).

Ядро — это главный распорядитель ресурсов. Оно решает, какой программе выделить память, как записать файл на диск и как передать сигнал от клавиатуры к приложению. Вы никогда не взаимодействуете с ядром напрямую. Между вами и ядром стоит Шелл (Shell) или командная оболочка.

> Шелл — это интерпретатор, который переводит ваши текстовые команды в понятный ядру язык системных вызовов. Самая популярная оболочка, ставшая стандартом де-факто, называется Bash (Bourne Again Shell). > > The Linux Documentation Project

Когда вы вводите команду в черном окне терминала, происходит магия: шелл находит нужную программу на диске, просит ядро запустить её, передает ей ваши параметры и выводит результат обратно на экран. Это позволяет строить цепочки управления, недоступные в графическом интерфейсе. Например, системный администратор может одной строчкой текста найти все файлы, измененные за последние 5 минут, и отправить их в архив, в то время как в обычном проводнике это потребовало бы десятков кликов.

Анатомия командной строки

Работа в терминале — это не заучивание заклинаний, а освоение грамматики. Почти любая команда в Linux строится по единому шаблону: команда -опции аргументы.

  • Команда — это само действие (глагол). Например, ls (list) — показать список файлов.
  • Опции (флаги) — уточняют, как именно выполнить действие (наречие). Обычно начинаются с дефиса. -l (long) заставит ls показать подробную информацию: размер, дату и права.
  • Аргументы — то, над чем совершается действие (существительное). Для ls аргументом может быть путь к папке, которую нужно осмотреть.
  • Рассмотрим это на практике. Если вы просто введете ls, вы увидите список имен файлов. Но если вы введете ls -lh /var/log, система покажет содержимое системного журнала в «человекочитаемом» виде (флаг h — human-readable), отображая размеры файлов в мегабайтах и гигабайтах, а не в байтах.

    Важно понимать, что в Linux регистр имеет значение. Файл Document.txt и document.txt — это два абсолютно разных объекта. Это часто сбивает с толку пользователей Windows, где система игнорирует разницу между большой и маленькой буквой в именах.

    Первое знакомство: навигация и ориентация

    В терминале у вас нет курсора мыши, который показывает, где вы находитесь. Вашим «местоположением» является Текущая рабочая директория (PWD). Вы всегда находитесь «внутри» какой-то папки.

    Для базовой ориентации используются три «кита» навигации:

  • pwd (print working directory) — отвечает на вопрос «Где я?». Она выведет полный путь, например /home/user/documents.
  • ls (list) — отвечает на вопрос «Что здесь есть?».
  • cd (change directory) — позволяет переместиться в другое место.
  • Особое внимание стоит уделить символу «тильда» (~). В Linux это сокращение для вашей Домашней директории. Это ваше личное пространство, где хранятся ваши документы и настройки. Команда cd ~ или просто cd без аргументов всегда вернет вас «домой», в какой бы части системы вы ни заплутали.

    Еще один важный концепт — Пути. Они бывают абсолютными и относительными. Абсолютный путь всегда начинается от корня системы (символ /) и похож на полный почтовый адрес: /home/user/photos/cat.jpg. Относительный путь отсчитывается от того места, где вы находитесь сейчас. Если вы уже в папке photos, вам достаточно написать cd .., чтобы подняться на уровень выше. Точка с запятой . означает текущую папку, а две точки .. — родительскую.

    Пошаговый разбор: создание структуры проекта

    Давайте разберем, как профессионал создает рабочее пространство для нового проекта, используя только терминал. Допустим, нам нужно создать папку для сайта, внутри которой будут папки для стилей и картинок, а также пустой файл индекса.

    Шаг 1: Создание дерева папок. Вместо того чтобы создавать каждую папку отдельно, мы используем команду mkdir (make directory) с флагом -p (parents). mkdir -p my_project/assets/{css,images,js} Здесь фигурные скобки — это мощный инструмент шелла (brace expansion). Эта команда создаст сразу всю структуру: папку my_project, в ней assets, а внутри неё — три подпапки.

    Шаг 2: Переход в рабочую область. cd my_project Теперь наша рабочая директория изменилась. Мы «вошли» внутрь проекта.

    Шаг 3: Создание пустого файла. touch index.html Команда touch изначально предназначена для обновления времени изменения файла, но если файла не существует, она его создает. Это самый быстрый способ сделать «заготовку».

    Шаг 4: Проверка результата. ls -R Флаг -R (recursive) заставит систему показать не только файлы в текущей папке, но и заглянуть во все вложенные директории. Мы увидим наше дерево во всей красе.

    Шаг 5: Удаление (с осторожностью). Если мы решим, что папка js нам не нужна, мы используем rmdir assets/js. Но помните: в терминале нет «Корзины». Команда rm удаляет файлы безвозвратно. Ошибка в одном символе может стоить вам всех данных.

    Справка и самообучение: как не утонуть

    Ни один системный администратор не помнит все флаги всех команд. Главный навык в Linux — умение пользоваться встроенной документацией. Для этого существует команда man (manual).

    Если вы напишете man ls, откроется подробная энциклопедия по этой команде. Там описаны все возможные опции, автор программы и примеры использования. Чтение мануалов — это признак профессионализма, а не слабости.

    Помимо man, часто помогает флаг --help. Например, mkdir --help выдаст краткую справку прямо в консоль, не открывая отдельное окно документации. Если же вы забыли название команды, но помните, что она делает, поможет apropos. Команда apropos "copy files" подскажет, что вам, скорее всего, нужна утилита cp.

    Если из этой главы запомнить три вещи — это:

  • Терминал — это не просто ввод текста, а общение с оболочкой (Shell), которая управляет ядром.
  • Любая команда следует логике «Действие — Настройка — Объект».
  • В Linux нет «Корзины», а регистр букв имеет критическое значение для системы.
  • 2. Файловая система и управление правами доступа

    Файловая система и управление правами доступа

    Если в первой главе мы научились «ходить» по системе, то теперь пора разобраться, как устроено здание, по которому мы перемещаемся. В Linux всё подчинено одному фундаментальному правилу: «Всё есть файл». Жесткий диск — это файл, ваша клавиатура — это файл, и даже запущенный процесс представлен в системе как файл. Чтобы не наступил хаос, эта структура строго организована и защищена правами доступа.

    Иерархия файловой системы (FHS)

    В отличие от Windows, где каждый диск имеет свою букву (C:, D:), в Linux существует единое дерево. Оно начинается с корня — /. Все физические диски и флешки «примонтированы» (вставлены) в определенные ветви этого дерева.

    Существует стандарт FHS (Filesystem Hierarchy Standard), который определяет, где что должно лежать. Вот основные узлы, которые важно знать:

  • /bin и /usr/bin — здесь лежат исполняемые программы (команды), которые вы запускаете (например, ls или cp).
  • /etc — «нервный центр» системы. Тут хранятся все конфигурационные файлы. Если нужно изменить настройки сети или пароли, вам сюда.
  • /home — личные папки пользователей.
  • /root — домашняя папка суперпользователя (администратора). Не путайте её с корнем /.
  • /var — здесь лежат «переменные» данные: логи системы, базы данных, очереди печати.
  • /tmp — временные файлы, которые обычно удаляются при перезагрузке.
  • Понимание этой структуры позволяет мгновенно ориентироваться в любой Linux-системе, будь то ваш ноутбук или сервер в облаке. Например, если программа выдает ошибку конфигурации, вы интуитивно начнете искать причину в /etc.

    Права доступа: кто, что и как

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

    Когда вы вводите ls -l, вы видите строку вроде -rwxr-xr--. Это «паспорт» файла, который делится на три группы:

  • Owner (u) — владелец (обычно тот, кто создал файл).
  • Group (g) — группа пользователей, имеющая доступ к файлу.
  • Others (o) — все остальные пользователи системы.
  • Для каждой группы определены три типа прав:

  • r (read) — чтение. Для папки это право увидеть список файлов в ней.
  • w (write) — запись. Право изменять файл или создавать/удалять файлы в папке.
  • x (execute) — выполнение. Для файла — запуск как программы, для папки — право «войти» в неё (сделать cd).
  • > Важный нюанс: чтобы просто прочитать файл внутри папки, вам нужно иметь право x на саму папку. Без права «входа» вы не дотянетесь до содержимого, даже если у самого файла стоят права на чтение.

    Цифровая маскировка: восьмеричная система прав

    Часто в руководствах вы встретите команды вида chmod 755 file. Эти цифры — краткая запись прав доступа. Каждое право имеет свой «вес»:

  • 4 — чтение (r)
  • 2 — запись (w)
  • 1 — выполнение (x)
  • Суммируя эти числа, мы получаем уровень доступа для одной группы. Например, 7 () — это полные права (rwx), а 5 () — чтение и выполнение (r-x). Таким образом, 755 означает: владелец может всё, а остальные — только читать и запускать.

    | Код | Символы | Описание | |:---:|:-------:|:---------| | 7 | rwx | Полный доступ | | 6 | rw- | Чтение и запись (типично для документов) | | 5 | r-x | Чтение и выполнение (типично для папок и программ) | | 4 | r-- | Только чтение | | 0 | --- | Нет доступа |

    Пошаговый разбор: защита конфиденциальных данных

    Представим сценарий: у вас есть файл passwords.txt, и вы хотите сделать так, чтобы никто в системе, кроме вас, не мог его даже увидеть.

    Шаг 1: Проверка текущих прав. ls -l passwords.txt Предположим, мы видим -rw-r--r--. Это значит, что любой пользователь может прочитать ваши пароли.

    Шаг 2: Смена владельца (если нужно). Если файл принадлежит не вам, а, скажем, пользователю guest, нужно использовать команду chown (change owner). sudo chown youruser:yourgroup passwords.txt Команда sudo (substitute user do) позволяет выполнить действие от имени суперпользователя.

    Шаг 3: Ограничение прав доступа. Мы хотим оставить rw для себя и 0 для всех остальных. В цифровом виде это 600. chmod 600 passwords.txt

    Шаг 4: Проверка. Снова вводим ls -l. Теперь строка выглядит так: -rw-------. Задача выполнена. Теперь даже если другой пользователь попытается сделать cat passwords.txt, система ответит: Permission denied.

    Суперпользователь и концепция sudo

    В Linux есть «бог» системы — пользователь root. Он игнорирует любые права доступа: может удалить любой файл, остановить любой процесс и даже «убить» саму систему одной командой.

    Работать под root постоянно — плохая практика. Это как ходить по городу с активированной гранатой: одна опечатка в команде rm -rf / (удалить всё, начиная от корня), и ваша система исчезнет за секунды.

    Для безопасной работы используется sudo. Это механизм, который дает вам права администратора временно, только на одну команду. Система переспросит ваш пароль, убеждаясь, что это именно вы, и залогирует действие. Это защищает систему от случайных ошибок и вредоносных скриптов, которые могли бы попытаться изменит системные файлы без вашего ведома.

    Если из этой главы запомнить три вещи — это:

  • Файловая система Linux — это единое дерево, где всё, включая устройства, является файлом.
  • Права доступа делятся на чтение, запись и выполнение для трех групп: владельца, группы и прочих.
  • Использование sudo — это стандарт безопасности, позволяющий избежать фатальных ошибок при управлении системой.
  • 3. Управление процессами и системными ресурсами

    Управление процессами и системными ресурсами

    Представьте, что ваша операционная система — это кухня ресторана. Каждый повар — это Процесс, а ингредиенты и плиты — это Ресурсы (процессорное время и оперативная память). Чтобы кухня не превратилась в хаос, нужен шеф-повар, который следит, кто чем занят, не слишком ли много места занимает один помощник и не пора ли кого-то «уволить», если он застыл с ножом над луковицей и ничего не делает. В Linux эту роль выполняете вы, используя инструменты управления процессами.

    Что такое процесс и откуда он берется

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

    У каждого процесса в Linux есть два важных атрибута:

  • PID (Process ID) — уникальный цифровой номер. Как паспорт у человека, PID позволяет системе точно идентифицировать процесс.
  • PPID (Parent Process ID) — ID родительского процесса. В Linux процессы не рождаются из ниоткуда: один процесс «порождает» другой. Например, ваш Bash-шелл является родителем для всех команд, которые вы в нем запускаете.
  • Если «родитель» погибает, а «ребенок» остается, такой процесс называют «сиротой», и его усыновляет самый первый процесс в системе — systemd (имеющий PID 1).

    Мониторинг: кто съел мою память?

    Чтобы понять, что происходит в системе прямо сейчас, используются мониторы ресурсов. Самый простой — ps (process status). Команда ps aux выведет список всех процессов всех пользователей в системе.

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

  • В верхней части htop вы видите графики загрузки каждого ядра процессора и использование оперативной памяти.
  • Ниже идет список процессов, отсортированный по потреблению ресурсов.
  • Здесь важно смотреть на колонку %CPU и %MEM. Если вы видите, что какая-то программа потребляет CPU, это повод задуматься: либо она выполняет сложную работу, либо она «зависла» в бесконечном цикле.

    Еще один важный показатель — Load Average. Это три числа, показывающие среднюю нагрузку на систему за последнюю 1, 5 и 15 минут. Если эти числа больше количества ядер вашего процессора, значит, система перегружена и процессы стоят в очереди на исполнение.

    Сигналы: искусство вежливого (и не очень) завершения

    Иногда процесс нужно остановить. В Linux это делается с помощью Сигналов. Мы не просто «выключаем» программу, мы отправляем ей сообщение.

    Самые важные сигналы:

  • SIGTERM (15) — просьба завершиться. Программа получает этот сигнал, закрывает файлы, сохраняет данные и культурно уходит. Это то, что делает команда kill <PID> по умолчанию.
  • SIGKILL (9) — принудительная остановка. Процесс не может игнорировать этот сигнал. Ядро просто выкидывает его из памяти. Используйте это только в крайнем случае, так как данные могут быть потеряны.
  • SIGINT (2) — прерывание с клавиатуры. Это то, что происходит, когда вы нажимаете Ctrl+C в терминале.
  • > Бытовой пример: SIGTERM — это когда вы просите гостя уйти, и он собирает вещи. SIGKILL — это когда вы выбрасываете гостя в окно.

    Пошаговый разбор: поиск и устранение «зависшего» процесса

    Представим, что ваша система начала тормозить. Вы подозреваете, что виноват какой-то процесс, связанный с программой python.

    Шаг 1: Поиск виновника. Вместо того чтобы листать огромный список в ps, используем поиск: pgrep -l python Эта команда выведет PID всех процессов, в названии которых есть «python». Допустим, мы нашли процесс с PID 1234.

    Шаг 2: Уточнение нагрузки. Проверим, сколько ресурсов он потребляет: top -p 1234 Мы видим, что процесс потребляет слишком много памяти.

    Шаг 3: Попытка мягкого завершения. kill 1234 Ждем пару секунд. Проверяем через pgrep, исчез ли он.

    Шаг 4: Принудительное завершение. Если процесс всё еще висит (например, он заблокирован операцией ввода-вывода), применяем «тяжелую артиллерию»: kill -9 1234 Теперь процесс гарантированно исчезнет.

    Фоновые и приоритетные задачи

    Иногда вы запускаете задачу, которая будет выполняться долго (например, резервное копирование), и не хотите, чтобы она блокировала терминал. Для этого в конце команды ставится символ &: cp -r /large_folder /backup & Теперь процесс ушел в «фон». Вы можете продолжать вводить команды, а когда копирование закончится, шелл пришлет уведомление.

    Если же вы уже запустили программу и поняли, что она надолго заняла консоль, нажмите Ctrl+Z. Это поставит процесс на паузу (сигнал SIGSTOP). После этого введите bg (background), чтобы он продолжил выполнение в фоновом режиме, или fg (foreground), чтобы вернуть его обратно под ваш контроль.

    Также процессам можно назначать приоритет с помощью Nice. Значение nice варьируется от (самый высокий приоритет) до (самый низкий). По умолчанию у всех процессов 0. Если вы запускаете тяжелую задачу, которая не к спеху, сделайте доброе дело для системы: nice -n 19 my_heavy_script.sh.

    Если из этой главы запомнить три вещи — это:

  • У каждого процесса есть свой идентификатор (PID) и родитель (PPID).
  • Мониторинг системы через htop или top позволяет выявить утечки ресурсов и «зависшие» задачи.
  • Завершение процессов через сигналы (kill) должно начинаться с мягкого SIGTERM и заканчиваться жестким SIGKILL только при необходимости.
  • 4. Автоматизация работы: основы Bash-скриптинга

    Автоматизация работы: основы Bash-скриптинга

    Зачем вводить одни и те же пять команд каждый день, если можно научить компьютер делать это за вас? В этом и заключается суть скриптинга. Bash-скрипт — это просто текстовый файл, в котором записаны команды терминала. Но как только вы добавляете туда переменные, условия и циклы, этот список превращается в полноценную программу, способную управлять сервером.

    Первая строка и переменные

    Любой уважающий себя Bash-скрипт должен начинаться со строки Shebang: #!/bin/bash. Этот символ сообщает системе, какой именно интерпретатор нужно использовать для выполнения этого файла. Без него система может попытаться запустить скрипт через другой шелл, что приведет к ошибкам.

    Переменные в Bash — это контейнеры для данных. Важное правило: при объявлении переменной вокруг знака = не должно быть пробелов. NAME="Алексей" — правильно. NAME = "Алексей" — ошибка (Bash подумает, что NAME — это команда).

    Чтобы получить значение переменной, перед её именем ставится знак NAME".

    Интерактивность и аргументы

    Скрипты становятся по-настоящему полезными, когда они могут принимать данные извне. Есть два способа это сделать:

  • Команда read: скрипт останавливается и ждет, пока пользователь что-то введет.
  • Аргументы командной строки: вы передаете данные сразу при запуске, например ./myscript.sh backup_folder.
  • Внутри скрипта эти аргументы доступны через специальные переменные:

  • 2, ... — первый, второй аргумент и так далее.
  • # — количество переданных аргументов.
  • AGE -ge 18 ]; then ... (здесь -ge означает "greater or equal", ).
  • Циклы позволяют повторять действия. Самый популярный — цикл for, который проходит по списку элементов. Например, можно одним циклом переименовать сто фотографий или создать десять пользователей.

    > Метафора: Скрипт без циклов — это рецепт яичницы. Скрипт с циклами — это инструкция для завода по производству яичницы на 10 000 человек.

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

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

    Шаг 1: Создание файла и права. touch backup.sh chmod +x backup.sh (даем право на выполнение, иначе скрипт не запустится).

    Шаг 2: Написание заголовка и переменных.

    Здесь SOURCE" ]; then echo "Ошибка: укажите путь к папке!" exit 1 fi bash tar -czf DATE.tar.gz SOURCE завершен успешно." ` Команда tar создает сжатый архив.

    Коды завершения: как программы общаются

    Каждая команда в Linux после выполнения оставляет «посмертную записку» — Код завершения (Exit Code).

  • 0 — всё прошло успешно.
  • Любое число от 1 до 255 — произошла ошибка.
  • Вы можете проверить код последней выполненной команды с помощью переменной ? нулю после работы tar.

    Если из этой главы запомнить три вещи — это:

  • Скрипт начинается с #!/bin/bash и требует прав на выполнение (chmod +x).
  • В Bash критически важны пробелы (их отсутствие при присваивании и наличие внутри [ ]).
  • Использование аргументов (()`) делает скрипты гибкими инструментами.
  • 5. Продвинутые сценарии и управление потоками данных

    Продвинутые сценарии и управление потоками данных

    Мы подошли к вершине мастерства работы в терминале. До этого мы рассматривали команды как изолированные инструменты. Но истинная сила Linux проявляется, когда вы начинаете соединять их в цепочки, заставляя данные течь от одной программы к другой, фильтруясь и трансформируясь на лету. Это концепция Потоков данных.

    Три стандартных потока

    Каждая программа в Linux при запуске автоматически получает три «трубы» для связи с миром:

  • Standard Input (stdin / 0) — входной поток. По умолчанию это ваша клавиатура.
  • Standard Output (stdout / 1) — выходной поток. Сюда программа пишет результаты. По умолчанию — ваш экран.
  • Standard Error (stderr / 2) — поток ошибок. Сюда пишутся сообщения о проблемах. Тоже выводится на экран, но отделен от основного результата.
  • Вы можете перенаправлять эти потоки.

  • Символ > отправляет результат команды в файл (перезаписывая его). ls > files.txt.
  • Символ >> добавляет результат в конец файла. echo "Новая строка" >> logs.txt.
  • Символ 2> позволяет поймать только ошибки. find / -name "secret" 2> errors.log.
  • Конвейер (Pipe): объединяй и властвуй

    Символ вертикальной черты | — это, пожалуй, самый важный символ в Linux. Он соединяет stdout первой команды со stdin второй.

    Представьте задачу: вам нужно найти в огромном лог-файле (access.log) 10 самых активных IP-адресов, с которых заходили на ваш сайт. Вместо того чтобы писать сложную программу на Python, вы строите конвейер: cat access.log | awk '{print — конец. Шаблон ^[0-9] найдет все строки, которые начинаются с цифры. Это мощнейший язык описания текстовых структур, который сэкономит вам часы ручного поиска.

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

    Допустим, мы хотим создать скрипт, который раз в час проверяет системный журнал на предмет неудачных попыток входа по SSH и, если их больше 5 с одного IP, записывает этот адрес в «черный список».

    Шаг 1: Чтение лога и фильтрация. Системные логи часто лежат в /var/log/auth.log. Ищем строки с фразой "Failed password". grep "Failed password" /var/log/auth.log

    Шаг 2: Извлечение IP-адресов. Используем grep с флагом -o (only matching) и регулярным выражением для IP-адреса. grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"

    Шаг 3: Подсчет и условие. Добавляем sort | uniq -c и используем awk, чтобы отфильтровать тех, у кого счетчик . awk '2}'

    Шаг 4: Итоговая сборка в скрипт.

    Автоматизация по расписанию: Cron

    Скрипт готов, но как заставить его работать без нашего участия? Для этого есть Cron — планировщик задач. Вы вводите crontab -e и добавляете строку: 0 /path/to/script.sh

    Эта запись означает: «в 0 минут каждого часа каждого дня запускать этот скрипт». Формат Cron состоит из пяти полей: минуты, часы, день месяца, месяц, день недели. Это позволяет настроить запуск чего угодно: от ежедневных бэкапов в 3 часа ночи до поздравления коллег в Slack каждую пятницу в 17:00.

    Если из этой главы запомнить три вещи — это:

  • Любая программа имеет три потока (ввод, вывод, ошибки), которые можно перенаправлять.
  • Конвейеры (|) позволяют создавать сложнейшие инструменты из простых кирпичиков.
  • Сочетание Bash-скриптов, регулярных выражений и Cron превращает вас из пользователя в архитектора системы.