# Основы Linux
<div class="TOC" >
Содержание:
<p>
</p>
</div>
<style>
.TOC {
font-size: 26px;
font-weight: 550;
color: #270469;
text-align: left;
</style>
[TOC]
---
## Каталоги и Файловые системы
В Linux – все файл. Директории, устройства, сами файлы, ядро – все это файлы.
В корневом каталоге находится набор важным каталогов, зачастую общих для всех дистрибутивов Linux.
### Основные каталоги в корне (/)
`/bin` - важные бинарные пользовательские исполняемые приложения.
`/sbn` - системные бинарные файлы.
`/etc` - конфигурационные файлы, стартовые сценарии.
`/dev` - файлы устройств.
`/proc` - специальный динамический каталог, содержащий информацию о состоянии системы, включая процессы, исполняемые в данный момент.
`/var` - изменяемые файлы, такие как логи и базы данных.
`/tmp` - временные файлы.
`/usr` - приложения и файлы, наиболее доступные всем пользователям.
`/home` - домашние каталоги пользователей.
`/boot` - загрузочные конфигурационные файлы, ядра и другие файлы, необходимые во время загрузки операционной системы.
`/lib` - системные библиотеки.
`/opt` - каталог для установки дополнительных приложений.
`/mnt` - файловые системы на вашем жестком диске, примонтированные вручную.
`/media` - отключаемые устройства.
`/srv` - может содержать файлы веб-сервера, ftp-сервера и др.
`/lost+found` - предоставляет систему потерян+найден для файлов в корневом (/) каталоге filename>/media.

---
## Способы подключения
> Существует множество способов подключения в Linux систему, ниже перечисленны некоторые из них, однако подробно мы остановимся только на **SSH**, так как в основном при работе будет использоваться этот протокол.
* SSH
* VNC
* RDP
### SSH
SSH - Secured Shell. Сетевой протокол прикладного уровня реализует удалённое управление операционной системой и туннелирование TCP-соединений (например, для передачи файлов). Предустановлена почти во всех современных ОС.
Пример команды SSH:
```
ssh user@server-address -p 22
```
`ssh` - вызов команды.
`user` - имя пользователя, под которым мы хотим подключится (в основном - это **root**).
`@` - разделительный знак между именем пользователя и адресом сервера.
`server-address` - адрес сервера для подключения, может быть как в формате имени (servername.com), так и в формате IP-адреса (1.1.1.1).
`-p 22` - (-p) ключ указывающий порт, в данном случае - порт 22.
> Портом для подключения по умолчанию является порт **22**. Однако, порт может быть сменен в конфигурационном файле SSH.
При подключении по ssh протокол будет запрашивать пароль пользователя, для успешного подключения.

### SSH SCP
**SCP** - Утилита для копирования файлов через SSH.
Пример команды SCP:
```
scp path_to_file/file.txt user@server_address:/root/
```
`scp` - вызов команды.
`path_to_file/file.txt` - путь до файла и сам файл, соответственно.
`user` - пользователь под которым выполняем операцию.
`@` - знак разделения между пользователем и именем сервера.
`server-address` - адрес сервера для подключения, может быть как в формате имени (servername.com), так и в формате IP-адреса (1.1.1.1).
`:/root/` - путь до директории, в которую требуется скопировать файл.

---
## Пользователь root и sudo
### root пользователь
#### Для чего нужны root-права?
В дистрибутивах Linux пользовательские привилегии предоставляются путем открытия доступа к root правам.
Наличие таких прав позволяет использовать функциональность операционной системы более широко и выполнять необходимые действия в корневом каталоге.
> Использовать **root**-права следует осознавая, что вы имеете полный доступ к системе и одно неправильное действие может повлечь за собой плачевные последствия, ведь вы можете делать **абсолютно ВСЁ**!
Как стать пользователем **root**?
> 1. Авторизоваться под root.
> 2. Поднять права до уровня root.
По поводу авторизации говорить не буду, так как для этого следует просто подключиться под root пользователем, к примеру через SSH, указав root@server.
Как поднять права?
`su` - команда, которая изменят ID пользователя и делает его суперпользователем, он же root.
На скриншоте ниже использовав команду `su` и введя пароль root, мы стали суперпользователем.

### sudo
SUDO - Substitute User and do, дословно «подменить пользователя и выполнить».
Команда sudo, по своей сути, позволяет выполнять задачи root-пользователя обычным пользователем.
Пример:
Попытка сделать `apt update` под обычным пользователем. Как мы видим на скриншоте ниже, ошибка из-за нехватки прав на выполнение команды.

Однако если выполнять эту же команду, этим же пользователем, но через **sudo**, то она успешно выполнится.

---
## apt и dpkg
### APT
APT (Advanced Package Tool) - инструмент командной строки для взаимодействия с этой упаковочной системой. Для управления им уже существуют команды dpkg, но apt является более удобным способом работы с пакетами. Вы можете использовать его для поиска и установки новых пакетов, обновления пакетов, очистки пакетов и т.д.
#### Обновление и установка пакетов через APT
`apt update` - команда для обновления списков репозиториев и версий пакетов.

`apt install <package>` - команда для установки указанного пакета.
`apt remove <package>` - команда для удаления указанного пакета.
`apt autoremove` - команда для удаления ненужных зависимостей.
`apt list` - список доступных пакетов.
> `apt list` С ключом `--installed` выводит список установленных пакетов.
`apt full-upgrade` - обновляет систему, удаляя / устанавливая / обновляя пакеты.
### DPKG
**DPKG** - Сокращение от **Debian package**. Базовый пакетный менеджер **Debian**. Также присутствует в Debian подобных дистрибутива, к примеру в **AstraLinux**.
#### Работа с dpkg
В основном **dpkg** используется для установки скачанных пакетов:
`dpkg -i <package_name>.deb` - установка выбранного пакета.
`dpkg -l [маска]` - вывод списка установленных пакетов по маске.
>
`dpkg -r <package_name>` - удаление выбранного пакета.
> 
> Для взаимодействия с **dpkg** предусмотрено много команд, подробную инструкцию советую посмотреть используя коману `man dpkg`.
---
## Основы взаимодействия
В этом разделе мы поговорим про основые команды для взаимодействия с системой. А конкретно про взаимодействие с системой через **Bash**.
### Bash
**Bash (Bourne again shell или «возрождённый» shell)** – это модифицированная версия программной оболочки Bourne-shell (**sh** или «Оболочка Борна»). Она является командным процессором, работающим интерактивно в текстовом окне. **Bash** нужен для приема команд пользователя и их отправки операционной системе для последующей обработки.
Иначе говоря **bash** – это ваш инструмент для взаимодействия с системой и выполнения в ней различных команд. Также bash является скриптовым языков по типу **PowerShell**.
### Основные команды
* **`ls </path/to/directory>`** - Сокращение от list, отбражает все файлы и директории в директории </path/to/directory>.

> С ключом `-l` команда показывает права на файлы в директории.

> Ключ `-a` показывает все файлы и директории, включая скрытые.

* **`cd </path/to/directory>`** - change directory, позволяет перемещаться по файловой системе.

> * `cd` без параметров перемещает в домашнюю директорию пользователя.
> * `cd` - - перемещает по прошлому пути.
> * `.` (точка) текущая директория.
> * `..` (две точки) родительская директория.
> * `~` (тильда) домашняя директория пользователя.
* **`pwd`** - Cокращение от print work directory, выводит текущий абсолютный путь.

* **`cat <file_name>`** - Отображает содержимое файла file_name.

* **`cp <file1 file2>`** - Сокращение от copy, копирует файл file1 по пути file2.

* **`mv <file1> <file2>`** - Сокращение от move, перемещает файл file1 по пути file2.

* **`find <file>`** - находит файлы по указанным ключам.

* **`df`** - выводит список файловых систем по именам устройств.

> С ключом `-h` вывод будет более "user-frendly".

* **`man <cmd>`** - Отображает справку по указанной команде `<cmd>`.

* **`help`** - краткая справка по ключам и команде.

* **`file <file_name>`** - Выводит на экран тип файла. Настоящий тип, а не указанный в расширении.

* **`more <file_name>`** - Отображает содержимое файла file_name, выводит только содержимое помещающееся в окно терминала. По нажатию клавиши *Enter* выводит следующие строчки.

* **`less <file_name>`** - Отображает содержимое файла file_name, выводит только содержимое помещающееся в окно терминала. Навигация по файлу возможна клавишами-стрелками, кнопка "q" закрывает просмотр.

* **`grep <key>`** - выводит строки содержащии `<key>`.

* **`rm <file1>`** - Сокращение от remove, удаляет файл file1. (rm -r удаляет директорию).

* **`mkdir <directory>`** - Сокращение от make directory, создает директории с именем directory.

* **`rmdir <directory>`** - Сокращение от remove directory, еще один способ удалить указанную директорию.

* **`echo <string>`** - Выводит заданную строку string на экран.

* **`strings <file1>`** - Выводит все строки с печатными символами из файла `<file1>` на экран.

* **`touch <file>`** - создает пустой файл в указанной директории.

### Запуск исполняемых файлов и скриптов
Для того чтобы запустить файл нужно указать его консоли, просто написав `"имя_файла"`, лучше всего это делать уточняя, что это не команда, а именно файл, который мы запускаем, то есть добавлять **./** `./"имя_файла"`. Также можно запускать скрипты обращаясь к **bash** или **sh** - `bash ./"имя файла"`, `sh ./"имя файла"`.
### Перенаправления вывода
**Bash** позволяет перенаправлять стандартный вывод в файлы с помощью оператора `>`.
Если файл не существовал, он будет создан, иначе он будет перезаписан.

Если использовать `>>`, то файл не будет перезаписан, а добавит строки.

### Конвейер
Для того, чтобы перенаправить вывод одной команды в другую можно использовать следующий оператор - **`|`**.
> К примеру здесь мы запрашиваем список всех установленных пакетов, но направляем вывод на обработку командой **grep**, которая в свою очередь сортирует по заданному ключу **mc**, выводя нам только требуемые пакеты.

---
## Редактирование текста
В Linux есть множество редакторов, как с псевдографическим интерфейсом, по типу **mcedit** (встроенный редактор **midnight commander**), так и чисто терминальных - **nano**, **vim**.
Ниже мы немного разберем каждый из представленных.
### **mcedit**
**mcedit** - графический редактор идущий в комплекте с файловым менеджером **mc**. Прост в использовании, однако малофункционален. Одним из плюсов для неопытного пользователя может стать возможность использования мыши, для взаимодействия с интерфейсом.
Для вызова редактора требуется ввести команду типа: `mcedit путь/до/файла/имя_файла`.
Если требуется создать новый файл, можно просто запустить редактор `mcedit имя_файла`.
Интерфейс:

#### Функциональные клавиши
На нижней панели (как видно выше на скриншоте) расположены функицональные клавиши для взаимодействия. Все они вызываются через F1-F10, собвстенно цифры это и есть их нумерация.
1. **F1** - Вызов меню подсказки, открывает окно, с небольшим мануалом о редакторе.

2. **F2** - Сохранение файла.
3. **F3** - Блок, позволяет перейти в режим выделения текста, однако сам режим также доступен и через стандартные CTRL+(стрелочки).
4. **F4** - Вызывает окно замены строки или слова по критериям.

5. **F5** - Копирует и сразу вставить по месту курсора выделенный текст.
6. **F6** - Перемещает выделенный текст по месту курсора.
7. **F7** - Вызывает окно поиска строки.

8. **F8** - Удаляет строку, на которой находится курсор.
9. **F9** - Открывает функциональное меню в верхней панели.

10. **F10** - Выходит из редактора, предаварительно предложив сохранить файл.
### **nano**
**nano** - простой текстовый редактор использующий командную строку. Подходит для простого взаимодействия с текстом. В отличии от **mcedit**, не умеет взаимодейстовать с мышью, однако обладает чуть более расширеным функицоналом.
Для вызова редактора требуется ввести команду типа: `nano путь/до/файла/имя_файла`.
Если требуется создать новый файл, можно просто запустить редактор `nano имя_файла`.
На скриншоте ниже можно ознакомиться с функицоналом редактора, так как в целом отличаются только функциональные клавиши, не буду заострять на нем много внимания.
Для перемещения по файлу просто используются стрелочки, для сохранения используется `Ctrl+O`, а для выхода из файла - `Ctrl+X`.
Интерфейс:

### **Vim**
**Vim** - Vi Improved. Улучшенная версия текстового редактора **vi**, на данный момент также существует версия **nvim** - neovim. Редактор изначально расчитаный на профессионалов. В сравнении с предыдущими редакторами vim гораздо более мощный по функицоналу, в нём ~~матерые ребята~~ пишут скрипты, код, а также (если научится) в нем гораздо быстрее можно редактировать файлы, чем в обычных, но все эти плюсы перекрывает высокий порог вхождения, так как работа в vim менее интуитивно-понятна по началу, в отличие от аналогов.
Синтаксис запуска редактора не сильно отличается от остальных.
Для вызова редактора требуется ввести команду типа:
`vim путь/до/файла/имя_файла`
Если требуется создать новый файл, можно просто запустить редактор:
`vim имя_файла`
Внутри редактора работа с ним несколько отличается, как и интерфейс.
Интерфейс:

#### **Режимы vim**
* Командный режим
Изначально vim запускается в командном режиме, в нем можно перемещатся по файлу и использовать команды для взаимодействия с текстом, однако, чтобы войти в режим редактирования текста, нужно ввести специальную команду.
* Режим редактирования
Для того чтобы начать редактировать текст в vim нужно ввести горячую клавишу:
* клавиша `i` или ++`insert`++ - переводит vim в режим редактирования текста.
* `а` - переводит vim в режим редактирования текста, ++однако на 1 символ после курсора++.
* Режим выделения
Для того чтобы перейти в режим выделения требуется нажать в командом режиме клавишу **`v` - visual**.
#### **Команды vim**
Командная строка Vim запускается в командном режиме нажатием двоеточия - "`:`".
В ней, как написано выше, доступны команды для сохранения файла и выхода из редактора, настройки внешнего вида и взаимодействия с внешней оболочкой.
Здесь вы будете использовать краткие команды, перед которыми может устанавливаться номер, чтобы повторить команду несколько раз. Для начинающих может быть поначалу очень запутанно то, что в командном режиме символы интерпретируются как команды.
**Для перемещения используются такие команды:**
* `h` - на один символ влево;
* `l` - на один символ вправо;
* `j` - на одну строку вниз;
* `k` - на одну строку вверх;
* `w` - на слово вправо;
* `b` - на слово влево;
* `H` - перейти в низ экрана;
* `G` - перейти в конец файла;
> Либо можно перемещаться стандартными стрелочками, однако считается, что указанный выше способ перемещения помогает оптимизировать скорость печати и работы с файлом.
**Для переключения в режим редактирования используются такие команды:**
* `i` - вставить текст с позиции курсора, символ под курсором будет заменен;
* `I` - вставить текст в начало строки;
* `a` - добавить текст начиная от позиции курсора;
* `o` - вставить новую строку после этой и начать редактирование;
* `O` - вставить новую строку перед этой и начать редактирование;
* `r` - заменить текущий символ;
* `R` - заменить несколько символов.
> К этим командам также можно использовать символы повторений.
Более сложны команды редактирования текста. Вы можете править текст не только в обычном режиме, но и в командном с помощью команд.
**Для этого применяются такие команды:**
* `d` - удалить символ;
* `dd` - удалить всю строку;
* `D` - удалить символы начиная от курсора и до конца строки;
* `y` - копировать символ;
* `yy` или `Y` - скопировать всю строку;
* `v` - выделить текст;
#### **Командная строка vim**
Командная строка Vim запускается в командном режиме нажатием двоеточия - `":"`.
Здесь доступны команды для сохранения файла и выхода из редактора, настройки внешнего вида и взаимодействия с внешней оболочкой.
**Рассмотрим наиболее часто используемые команды редактора vim:**
* `:w` - сохранить файл;
* `:q` - закрыть редактор;
* `:q!` - закрыть редактор без сохранения;
* `:e` файл - прочитать содержимое файла в позицию курсора;
* `:r` файл - вставить в содержимое файла в следующую строку;
* `:r!` - выполнить команду оболочки и вставить ответ в редактор;
* `:set переменная=значение` - установить значение переменной, например, tabstop=4, или set number, с помощью этой команды можно управлять многими аспектами работы vim.
* `:buffers` - посмотреть открытые файлы.
Со всеми основами разобрались, и вы теперь использование vim не будет казаться вам таким сложным. Но это еще далеко не все, этот мощный редактор может еще очень многое. Дальше мы рассмотрим несколько примеров использования vim, чтобы вам было легче справиться с новой программой.
#### **Поиск и замена в vim**
Довольно часто нам нужно найти определенную последовательность в тексте. Текстовый редактор Vim умеет это делать.
Во-первых, если нужно найти символ в строке, нажмите `f` и наберите нужный символ, курсор будет перемещен к его позиции.
Для поиска по всему файлу используйте команду `/`.
После нее нужно ввести слово, которое нужно найти. Для поиска следующего вхождения используйте `n`, для предыдущего - `N`.
**Для замены будет использоваться немного другая конструкция:**
`:%s/искать/заменить/g`
Пояснение:
* `:` - запускает командную оболочку с командой `s` для замены.
* `%` - означает что обрабатывать нужно весь файл.
* `g` - значит, что нужно обработать все найденные строки, а не только первую.
Чтобы программа спрашивала перед каждой заменой можно добавить в конец строки опцию `c`.
#### **Буфер обмена vim**
Текстовый редактор Vim имеет свой буфер обмена. Например, вам нужно скопировать в четыре строки и вставить их в другое место программы, для этого выполните такую последовательность действий:
* Нажмите `Esc`, чтобы перейти в командный режим;
* Наберите `4yy` чтобы скопировать четыре строки;
* Переместите курсор в место где нужно вставить эти строки;
* Нажмите `p` для вставки.
Также можно использовать выделение vim, чтобы скопировать строки. Выделите текст с помощью `v`, а затем нажмите `y`, чтобы скопировать.
---
## Systemd
**Systemd** — это система инициализации и системный диспетчер, который стал новым стандартом для дистрибутивов **Linux**. Из-за сложной адаптивности знакомство с системой **systemd** оправдано, поскольку это существенно упростит администрирование серверов. Изучение и использование инструментов и демонов, которые включают **systemd**, поможет вам лучше оценить предоставляемые возможности и гибкость или, по крайней мере, работать с минимальным количеством проблем.
**Systemctl** - которая является инструментом центрального управления для контроля системы инициализации.
### Systemctl
Для взаимодействия с **systemctl** в основном используются несколько ключей команд:
* **systemctl start "имя_службы"** - запуск указанной службы
* **systemctl stop "имя_службы"** - остановка указанной службы
* **systemctl restart "имя_службы"** - перезапуск указанной службы
* **systemctl status "имя_службы"** - просмотр статуса указанной службы
* **systemctl enable "имя_службы"** - добавление в автозагрузку указанной службы
Собственно при запуске указанных команд будет характерный вывод, пример ниже:
*Служба работает без ошибок*

*Служба загружена, однако не работает из-за ошибки*

Благодаря **systemctl** можно посмотреть как состояние службы, так и проверить её на ошибки, так как systemctl выводит часть логов ошибок при запуске, которые можно подробно посмотреть добавив после **systemctl** ключ `-l`, который выводит расширенную информацию по коду ошибки и проблеме, на которую ссылается служба. Благодаря этому можно понять, в каком конфиге проблема, а также где следует проверить определенные зависимости или службы.
---
## Просмотр log-файлов
#### Где лежат?
Как уже было указанно, в основном, все логи служб и приложений хранятся по пути **`/var/log/"имя_сервиса"`**.

> Некоторые программы могут хранить логи по другим путям, однако это скорее исключение из правил.
#### Как читать?
Прочитать лог-файл можно множеством способов, можно использовать команду `cat` (желательно связку `cat "имя_файла" | less`, чтобы иметь удобную возможность перемещения по выводу из файла), также можно прочитать логи используя текстовый редактор. Есть ещё возможность скачать файлы, к примеру через **scp** и смотреть со своей устройства.
## Ресурсы для закрепления
Это был ~~надеюсь~~ достаточно подробный топик по основным способам взаимодействия с системой. Для того, чтобы работать на уверенном уровне в системе и не боятся страных букв и отсутствия графического интерфейса прилагаю список полезных ресурсов:
* [Bandit](https://overthewire.org/wargames/bandit/)
Очень полезный ресурс, на котором я советую пройти первые ~15 уровней, это поможет закрепить изученный материал, а также лучше освоить базовые команды для взаимодействия.
* [Видеокурс Stepik](https://stepik.org/course/73/info)
Бесплатный, полезный и подробный видеокурс по основам, если что-то из материала было непонятно.
* [Про Linux за 5 минут](https://www.youtube.com/watch?v=t2iMS8V8v_U )
* [Expert Linux administration guide](https://cloud.lanit.ru/s/sY8jQSQxAbGDbrj) - очень большой и информативный мануал по администрированию Linux систем
---
## Практика [Bandit](https://overthewire.org/wargames/bandit/)
Весь смысл игры на OverTheWire - это поиск флагов. Флаг является паролем для следующего уровня.
Предлагаю пройти первые 2 уровня на OverTheWire из раздела Bandit, для того, чтобы использовать информацию на практике.
### Уровень 0

И так, мы видим задачу уровня, в которой сказано, что чтобы получить наш заветный флаг нам нужно подключиться к серверу по **SSH** с указанными параметрами.
Вводим указанные данные, как написано в задаче: логин - `bandit0`, сервер - `bandit.labs.overthewire.org`, а также не забываем указать порт - `-p 2220`.

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

Ура, мы внутри, однако теперь нужно найти флаг. Попробуем посмотреть, какие файлы нам доступны, для этого используем команду `ls`. После чего находим, что в нашей директории есть один файл **readme**.

Попробуем посмотреть его содержание командой `cat`

Находим заветный ключ! Теперь используя его в качестве пароля, мы можем перейти к следующему уровню.
### Уровень 1

И так, в задаче написано, что наш "флаг - пароль" спрятан в файле "**-**", который расположен в домашней директории. Используя логин - **bandit1** и пароль, который мы нашли на прошлом уровне, подключаемся к серверу.
> Логин равен уровню, то есть, к примеру, bandit3 - логин от 3-го уровня, а bandit1, соответственно, логин от 1-го уровня.
Подключаемся

Вводим пароль

Теперь, когда мы внутри, ищем файл названный "-", через команду `ls`.

Попробуем его прочитать используя `cat -`

Ничего нет? Увы, мы не можем прочитать этот файл так, из-за его названия, **bash** не понимает что это, поэтому требуется указать, что нам нужен файл с названием "-", для этого используем `./"имя_файла"`, точка показывает, что мы читаем файл в той директории, в которой находимся, а слеш указывает что нам нужен именно такой файл. `cat ./"имя_файла"`.

Ура! Славная победа, пора перейти ко 2-му уровню.
### Уровень 2

В задании написано, что пароль спрятан в файле с пробелами в названии, ещё одно проблемное название :).
Используя логин от уровня 3 и пароль, который мы нашли на уровне 2 подключаемся к серверу.

Видим наш файл, попробуем его прочитать.

Так просто это сделать не получится, так как **bash** опять не понимает, что мы от него хотим, он видит будто мы вводим команы **"cat spaces in [так далее]"**, для того, чтобы указать, что нам нужен именно наш файл, обернем его название в кавычки.

Ура! Наш новый флаг получен!
Думаю суть игры понятна, советую продолжать в том же духе и пройти первые 12-15 уровней, к каждому из них прилагается список команд, некоторые из которых могут помочь в решении, а некоторые добавлены просто так, и полезные материалы, которые тоже помогут разобраться в решении задачи. Эта игра очень хороша тем, что вы изучаете новый материал или закрепляете его сразу на практике.
---