###### tags: `МДК02.05 Организация администрирования операционных систем Linux` `Linux`
# Лабораторная работа №2. Работа с командной строкой Linux.
### Тема: Знакомство с Linux.
##### Цель работы: Научиться: работать в командной строке.
##### Необходимые материалы: Пк с доступом в интернет. Виртуальные машины с Linux Debian и Ubuntu.
## Теоретическая часть
### Работа в командной строке
**Студент должен уметь работать с командными оболочками и командами в командной строке**
:::success
Работа администратора с Linux заключается прежде всего в оперировании в командной строке. Командная строка, или консоль — это отдельная программируемая среда со своими настройками, возможностями и инструментами. Существует множество различных оболочек, в данном уроке рассматривается **bash**, используемая в большинстве современных ОС.
:::
Увидеть название оболочки, используемой пользователем по умолчанию, можно в конце каждой строки файла `/etc/passwd` . Глобальные настройки командной строки находятся в файле `/etc/profile` , а настройки для каждого пользователя в файлах его домашней директории.
При этом существует несколько вариантов расположения настроек, в зависимости от семейства ОС. В общем виде поиск настроек осуществляется в следующем порядке: ~/.bash_profile, ~/.bash_login , и ~/.profile (настройки берутся из первого обнаруженного файла).
При работе в консоли используются следующие распространенные команды:
```bash!
cat #вывод содержимого файла в консоль;
cd #переход в каталог;
ls #вывод содержимого каталога;
echo #вывод текста в консоль;
touch #обновление времени редактирования файла или создание нового пустого файла;
uname #вывод имени ОС;
```
Консоль, как отдельная рабочая среда содержит свои переменные: переменные среды (глобальные переменные, использующиеся в ОС) и обычные переменные (работают в пределах запущенного сеанса консоли). Для просмотра переменных доступны команды:
```bash!
env #вывод переменных среды;
export #превращение переменной в переменную среды;
unset #отключение переменной;
```
Для создания переменной используется простой синтаксис имя_переменной=значение_переменной. Для обращения к переменной указывается знак $, например:
```bash!
X=12 #(задать переменной X значение 12);
echo $X #(вывести значение переменной X);
```
Для выполнения команды в текущем каталоге (его можно узнать командой **pwd**), нужно указывать полный путь к команде (например, **/home/script**), если текущий каталог не перечислен в значениях переменной среды **PATH**.
Для получения справочной информации доступны команды:
```bash!
man #справка по команде;
file #справка по файлу;
whatis #справка по названию;
history #вывод истории команд (список хранится в .bash_history);
```
Отдельно следует упомянуть команду **exec** , позволяющую выполнять команду за пределами текущей оболочки, сбрасывая права суперпользователя.
### Управление текстовым потоком
**Студент должен уметь управлять и фильтровать текстовый поток.**
:::success
Множество файлов в Linux неудобны для восприятия без предварительного форматирования, кроме того процесс обработки текстовой информации часто требует ее форматирования, обрезания, сортировки и т.д. Linux предлагает широкий набор инструментов редактирования текстового вывода, при этом следует заметить что указанные инструменты не затрагивают исходный файл (или текстовый поток), а форматируют его, выдавая полученный результат в консоль или другой файл.
:::
**Простой вывод текста (без корректировки содержимого):**
Для вывода содержимого файла или объединения нескольких файлов на выводе используется команда cat , например: `сat 1.txt 2.txt > 3.txt` (передать содержимое двух файлов в третий);
- Команда **join** объединяет строки нескольких файлов по общему полю и отправляет их на стандартный вывод.
- Команда **less** загружает файл постепенно и также отправляет его на вывод (удобно для больших файлов).
- Команда **nl** нумерует строки.
- Команда **pr** показывает, как содержимое файла будет выглядеть при выводе его на печать.
- Команда **paste** вставляет строки из одного файла в другой и отправляет результат на стандартный вывод.
- Команда **head** показывает первые строки файла, а **tail** – последние. Например: `head –n 2 /var/log/syslog` (вывести первые две строчки файла); `tail –f /var/log/syslog` (показывать последние строки файла, отображая содержимое в реальный момент времени);
- Команда **sort** может отсортировать содержимое файла по какому-нибудь признаку, например: `sort 1.txt` (отсортировать строки по алфавиту);
- Команда **wc** позволяет посчитать количество символов и т.д. в текстовом потоке, например: `wc 1.txt` (посчитать количество строк, символов, слов);
Вывод форматированного текста (с корректировкой содержимого):
- Команда **cut** используется для обрезания содержимого файлов на выводе, например: `сut – c 2,3,4,5,10 1.txt` (показывать только символы на указанных позициях: 2,3,4,5,10);
- Команда **expand** превращает символы табуляции в несколько пробелов, а **unexpand** наоборот – пробелы в символы табуляции.
- Команда **fmt** предназначена для форматирования текста различными способами, например: `fmt 1.txt` (вывести содержимое файла в одну строку); `fmt –w 10 1.txt` (вывести содержимое файла в строки не больше 10 символов каждая);
- Команда **od** предназначена для конвертации текста в другой формат, например: `od –c 1.txt` (отобразить в кодировке ASCI);
- Команда **tr** предназначена для замены и удаления символов в текстовом потоке, например: `echo "HELLO " | tr – t L l` (заменить " L" на " l" в полученном на вводе тексте);
- Команда **split** может разбить файла по каким-либо критериям, например: `split –l 2 1.txt` (разбить содержимое файла по две строчки);
- Команда **uniq** предназначена для поиска повторяющихся строк, например: `uniq –u 1.txt` (показать только уникальные строки);
- **Sed** – отдельный мощный инструмент, понимающий групповые символы, шаблоны и т.д. Будет рассмотрен немного подробнее в дальнейших урока. Работает, например, так: `sed –e 's/socks/people/' 1.txt` ( заменить в файле слово "socks" на «people");
### Основные операции с файлами
**Студент должен уметь управлять файлами и каталогами при помощи основных команд Linux**
:::success
Частой задачей администратора в Linux является работа с файлами и каталогами: создание, копирование, перемещение и удаление. Использование групповых символов вместе с инструментами консоли позволяют осуществлять эти действия с максимальной эффективностью.
:::
Для создания директорий используется команда **mkdir имя_каталога**, для удаления пустого каталога - **rmdir имя_каталога**.
Просмотр содержимого текущей директории – **ls**.
Например:
```bash!
ls –l #просмотреть содержимое текущего каталога;
ls fol #посмотреть содержимого каталогов, имена которых начинаются с fol;
```
Для копирования используется команда cp что_копировать куда_копировать , например:
**`cp –R Folder NewFolder`** - скопировать директорию "Folder" со всем содержимым в текущий каталог с именем новой директории "NewFolder");
Для переноса используется команда **mv** что_переносить куда_переносить , например:
**`mv file.txt folder_1/`** (перенести " file.txt" в каталог " folder_1» в текущей директории);
Для удаления используется команда **rm что_удалить**, например:
**`rm –rf folder 1`** (удалить каталог folder_1 вместе с содержимым);
Для создания пустого файла, или обновления метки доступа существующего, используется команда **touch имя_файла**, а для получения информации о файле – команда **file имя_файла**.
Групповые символы, использующиеся при работе с текстовыми данными:
```
* – любое количество любых символов;
?_ – любой символ;_
! – не (любой символ кроме указанных);
[ac] – a или c;
[a - c] – a , b , c
```
Например:
```bash!
ls * #(вывести содержимое всех каталогов);
ls ?at.txt #(вывести содержимое файла с именем: любая первая буква, остальная часть имени " at.txt");
ls *at.txt #(вывести содержимое файла с именем, оканчивающимся на " at.txt");
ls ![ab] #(вывести содержимое файла или каталога с именем, начинающимся с любых символов, кроме "a" и "b");
```
Для поиска информации используется команда **find**, например:
```bash!
find . -name "\A" #(искать в текущей директории объекты, имеющие в имени символ "A");
find /etc -size -5M #(искать в директории "/etc" объекты размером менее 5 Мб);
find . – type l #(искать в текущей директории ссылки);
```
В среде Linux существует несколько распространённых архиваторов, использующихся для распаковки и упаковки объектов в единый файл:
- **сpio** - двоичный архиватор, копирующий информацию в архив и обратно;
- **dd** - копирование по блокам;
- **gzip и gunzip** - утилита сжатия и восстановления файлов (контейнер одного файла);
- **bzip2 и bunzip2** - утилита сжатия и восстановления файлов (контейнер одного файла);
- **xz и unxz** - утилита сжатия и восстановления файлов (контейнер одного файла);
- **tar** - архиватор (работает с набором файлов и каталогов).
Например:
- **`find . –name "*.txt" | cpio – o > ./ test. cpio`** (найти в текущей папке все файлы с расширением `".txt"` и упаковать их в архив `test.cpio`, расположив его на уровень выше текущей директории);
- **`cpio -id < test . cpio`** (распаковать в текущий каталог архив `"test.cpio"`, создавая при необходимости структуру директорий);
- **`dd if =/dev/sdb of = drive.img`** (скопировать носитель `/dev/sdb` в образ `drive.img` , располагающийся в текущей директории);
- **`gzip drive.img`** (сжать образ `"drive.img"` до `"drive.img.gz"`, удалив исходный файл);
- **`bunzip2 drive.img.bz2`** (распаковать архив `"drive.img.bz2"` в текущий каталог);
- **`unxz drive.img.xz`** (распаковать архив " `drive.img.xz`" в текущий каталог);
- **`tar cvf arch.tar folder`** (упаковать каталог `folder` в архив `"arch.tar"`).
- **`tar –xvf archive.tar `** (распаковать архив `archive.tar`).
### Потоки, конвейеры и перенаправления
**Студент должен уметь управлять потоками для обработки текстовых данных**
:::success
Linux традиционно использует потоки для ввода, вывода и ошибок. Обычно ввод – это клавиатура или файлы, а вывод ошибок и результатов происходит в консоль. Но часто бывает нужно объединить последовательность команд в конвейер, или отправить результат в какой-нибудь файл.
:::
Для того чтобы послать на ввод программы некоторые данные используется знак "<", например: **`wc < file 1. txt `** (использовать в качестве ввода для программы wc файл `file.txt`);
Для того чтобы послать вывод программы куда-нибудь, кроме стандартного направления, используется знак ">", например:
```bash!
ls > list.txt #(перезаписать содержимое файла list.txt результатом команды ls);
ls >> list.txt #(дописать в файл list.txt результат команды ls);
```
Для ввода, вывода и ошибок используются следующие обозначения:
- Stdin – стандартный ввод программы (обозначение "0");
- Stdout – стандартный вывод программы (обозначение "1");
- Stderr – стандартные ошибки программы (обозначение "2");
Например:
```bash!
ls bob 2> error.txt
ls bob > result .txt 2> error .txt
```
### Управление процессами в Linux
**Студент должен уметь создавать, отслеживать и завершать процессы**
:::success
Linux содержит в себе множество инструментов для управления запущенными процессами: от сортировки, отслеживания состояния и загрузки системы до перевода процессов в фоновый режим и обратно.
:::
Посмотреть запущенные процессы в текущей консоли можно при помощи команды **jobs**. Для вывода всех запущенных в данный момент процессов (независимо от консоли) используется команда **ps** с различным набором ключей, например:
```bash!
ps aux #(вывести процессы всех пользователей);
```
Можно вывести процессы в консоль, отображая иерархию из взаимосвязи командой pstree.
Для отображения идентификаторов процессов по определенному критерию можно использовать команду pgrep, например:
```bash!
pgrep -l -u root #(отобразить все процессы пользователя root)
```
Чтобы запустить процесс в фоновом режиме необходимо указать ключ &, например:
```bash!
sleep 999 & #(запустить задачу sleep 999 в фоновом режиме);
```
Для перевода процесса из фонового режима в активный используется команда **fg** , обратно – **bg**. В качестве аргумента команды следует указать номер процесса (его можно увидеть на выводе команды **jobs**).
Для того чтобы процесс продолжал выполняться после выхода пользователя из системы, его следует запускать командой nohup , например:
```bash!
nohup sleep 1000 & #(запустить процесс "sleep 1000" в фоновом режиме, и выполнять его даже в случае выхода пользователя из системы);
```
Для остановки процесса используется команда **kill**, например:
```bash!
kill 2625 #(выключить процесс с PID=2625);
killall sleep #(выключить все процессы с именем sleep для текущего пользователя) ;
```
Для остановки процессов по указанному критерию можно использовать команду **pkill**, например:
```bash!
pkill refox #(остановить процесс, в имени которого есть символы "refox");
```
Для просмотра информации о работающих процессах в режиме реального времени используется диспетчер задача **top**. Используя его можно сортировать запущенные задачи по различным критериям и останавливать их (клавиша K) мягко (sigterm) и жестко (sigkill).
Для отображения информации о времени работы системы и среднем времени загрузки АЧ используется команда **uptime**. Для отображения информации о загрузке ОЗУ и раздела подкачки используется команда **free**.
Кроме того, Linux поддерживает работу с несколькими «экранами» при помощи команды **screen**. Она позволяет, в числе всего прочего, сворачивать запущенные приложения в консоли, в рамках той же консоли, например:
```bash!
screen -S yandex ping ya.ru #(создать экран с именем yandex для команды ping);
screen -ls #(показать свернутые экраны);
screen -r yandex #(развернуть экран с именем yandex).
```
### Пользователи и группы.
**Студент должен уметь создавать пользователей а также группы пользователей. Менять домашний каталог пользователя, оболочку выполнения команд и тд.**
#### Управление пользователями.
Добавление пользователя осуществляется при помощи команды **useradd**. Пример использоания:
```bash!
useradd vasyapupkin
```
**Параметры создания пользователя по умолчанию**
Если при создании пользователя не указываются дополнительные ключи, то берутся настройки по умолчанию. Эти настройки вы можете посмотреть выполнив: **`useradd -D`**
Результат будет примерно следующий:
```bash !
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
```
Чтобы менять параметры можно использовать ключи при создании пользователя:
- **-b** Базовый каталог. Это каталог, в котором будет создана домашняя папка пользователя. По умолчанию /home
- **-с** Комментарий. В нем вы можете напечатать любой текст.
- **-d** Название домашнего каталога. По умолчанию название совпадает с именем создаваемого пользователя.
- **-e** Дата, после которой пользователь будет отключен. Задается в формате ГГГГ-ММ-ДД. По умолчанию отключено.
- **-f** Количество дней, которые должны пройти после устаревания пароля до блокировки пользователя, если пароль не будет изменен (период неактивности). Если значение равно 0, то запись блокируется сразу после устаревания пароля, при -1 - не блокируется. По умолчанию -1.
- **-g** Первичная группа пользователя. Можно указывать как GID, так и имя группы. **Если параметр не задан будет создана новая группа название которой совпадает с именем пользователя**.
- **-G** Список вторичных групп в которых будет находится создаваемый пользователь
- **-k** Каталог шаблонов. Файлы и папки из этого каталога будут помещены в домашнюю папку пользователя. По умолчанию /etc/skel.
- **-m** Ключ, указывающий, что необходимо создать домашнюю папку. **По умолчанию домашняя папка не создается.**
- **-p** Зашифрованный пароль пользователя. **По умолчанию пароль не задается**, но учетная пользователь будет заблокирован до установки пароля
- **-s** Оболочка, используемая пользователем. **По умолчанию /bin/sh**.
- **-u** Вручную задать UID пользователю.
**Что такое UID/GID?**
:::info
**UID** обозначает идентификатор пользователя. **UID** — это номер, назначенный каждому пользователю Linux. Это представление пользователя в ядре Linux.
**UID** используется для идентификации пользователя в системе и для определения того, к каким системным ресурсам пользователь может получить доступ. Вот почему идентификатор пользователя должен быть уникальным.
Вы можете найти **UID** в файле **/etc/passwd**. Это тот же файл, который можно использовать для составления списка всех пользователей в системе Linux.
Обратите внимание, что в большинстве дистрибутивов Linux UID 1-500 обычно зарезервирован для системных пользователей. В Ubuntu и Fedora **UID для новых пользователей начинаются с 1000**.
Например, если вы используете команду **useradd** или **adduser** для создания нового пользователя, он получит следующий доступный номер после 1000 в качестве своего UID.
**GID** в свою очередь индефекатор группы в системе.
:::
Если вас не устраивают такие настройки, вы можете поменять их выполнив:
```bash!
useradd -D -s /bin/bash
```
где -s это ключ из таблицы выше.
**Таким образом могут быть заданы параметры, определяемые только ключами: -b -e -f -g -s**
**Изменение параметров пользователя**
Изменение параметров пользователя происходит с помощью утилиты **usermod**. Пример использования:
```bash!
usermod -c "Эта команда поменяет комментарий пользователю" vasyapupkin
```
**usermod использует те же опции, что и useradd.**
**Изменение пароля**
Изменить пароль пользователю можно при помощи утилиты **passwd**.
```bash!
sudo passwd vasyapupkin
```
**passwd** может использоваться и обычным пользователем для смены пароля. Для этого пользователю надо ввести **passwd** и ввести старый и новый пароли.
Основные ключи passwd:
- **-d** Удалить пароль пользователю. После этого пароль будет пустым, и пользователь сможет входить в систему без предъявления пароля.
- **-e** Сделать пароль устаревшим. Это заставит пользователя изменить пароль при следующем входе в систему.
- **-i** Заблокировать учетную запись пользователя по прошествии указанного количества дней после устаревания пароля.
- **-n** Минимальное количество дней между сменами пароля.
- **-x** Максимальное количество дней, после которого необходимо обязательно сменить пароль.
- **-l** Заблокировать учетную запись пользователя.
- **-u** Разблокировать учетную запись пользователя.
**Установка пустого пароля пользователя**
Супер пользователь с помощью утилит командной строки **passwd** и **usermod** или путем редактирования файла **/etc/shadow** может удалить пароль пользователь, дав возможность входить в систему без указания пароля.
```bash!
sudo passwd -d vasyapupkin
#или
sudo usermod -p "" vasyapupkin
```
Если учетная запись пользователя в этот момент была заблокирована командой **passwd -l**, то указанные выше команды так же снимут эту блокировку.
:::info
Установка пустого пароля может быть полезна как временное решение проблемы в ситуации, когда пользователь забыл свой пароль или не может его ввести из-за проблем с раскладкой клавиатуры. После этого имеет смысл принудить пользователя установить себе новый пароль при следующем входе в систему:
```bash!
sudo passwd -e vasyapupkin
```
:::
**Удаление пользователя**
Для того, чтобы удалить пользователя воспользуйтесь утилитой **userdel**. Пример использования:
```bash!
sudo userdel vasyapupkin
```
**userdel** имеет всего два основных ключа:
- **-f** Принудительно удалить пользователя, даже если он сейчас работает в системе.
- **-r** Удалить домашний каталог пользователя.
#### Управление группами
**Создание группы**
Утилита **groupadd** создаёт новую группу согласно указанным значениям командной строки и системным значениям по умолчанию. Пример использования:
```bash!
sudo groupadd testgroup
```
Основные ключи:
- **-g** Установить собственный GID.
- **-p** Пароль группы.
- **-r** Создать системную группу.
**Изменение параметров группы**
Сменить название группы, ее GID или пароль можно при помощи groupmod. Пример:
```bash!
sudo groupmod -n newtestgroup testgroup #Имя группы изменено с testgroup на newtestgroup
```
Опции groupmod:
- **-g** Установить другой GID.
- **-n** Новое имя группы.
- **-p** Изменить пароль группы.
**Удаление группы**
Удаление группы происходит так:
```
sudo groupdel testgroup
```
**groupdel** не имеет никаких дополнительных параметров.
#### Файлы конфигурации
Изменять параметры пользователей и групп можно не только при помощи специальных утилит, но и вручную. Все настройки хранятся в текстовых файлах. Описание каждого из них приведено ниже.
В файле **/etc/passwd** хранится вся информация о пользователях кроме пароля. Одна строка из этого файла соответствует описанию одного пользователя. Примерное содержание строки таково:
```conf!
vasyapupkin:x:1000:1000:VasyaPupkin:/home/vpupkin:/bin/bash
```
Строка состоит из нескольких полей, каждое из которых отделено от другого двоеточием. Значение каждого поля приведено ниже.
- **vasyapupkin** Имя пользователя для входа в систему.
- **x** Необязательный зашифрованный пароль.
- **1000** Числовой идентификатор пользователя (UID).
- **1000** Числовой идентификатор группы (GID).
- **Vasya Pupkin** Поле комментария
- **/home/vpupkin** Домашний каталог пользователя.
- **/bin/bash** Оболочка пользователя.
Второе и последнее поля необязательные и могут не иметь значения.
В **/etc/group**, как очевидно из названия хранится информация о группах. Она записана в аналогичном **/etc/passwd** виде:
```conf!
vasyapupkin:x:1000:vasyapupkin,petya
```
- **vasyapupkin** Название группы
- **x** Необязательный зашифрованный пароль.
- **1000** Числовой идентификатор группы (GID).
- **vasyapupkin,petya** Список пользователей, находящихся в группе.
В этом файле второе и четвертое поля могут быть пустыми.
Файл **/etc/shadow** хранит в себе пароли, по этому права, установленные на этот файл, не дают считать его простому пользователю. Пример одной из записей из этого файла:
```conf!
vasyapupkin:$6$Yvp9VO2s$VfI0t.o754QB3HcvVbz5hlOafmO.LaHXwfavJHniHNzq/bCI3AEo562hhiWLoBSqxLy7RJJNm3fwz.sdhEhHL0:15803:0:99999:7:::
```
Здесь:
- **vasyapupkin** Имя пользователя для входа в систему.
- **`$6$Yvp9VO2s$VfI0t.o754QB3HcvVbz5hlOafmO.LaHXwfavJHniHNzq/bCI3AEo562hhiWLoBSqxLy7RJJNm3fwz.sdhEhHL0`** Необязательный зашифрованный пароль.
- **15803** Дата последней смены пароля.
- **0** Минимальный срок действия пароля.
- **99999** Максимальный срок действия пароля.
- **7** Период предупреждения о пароле.
Далее есть два не заданных параметра можете заметить по количеству **`:::`**:
- Период неактивности пароля.
- Дата истечения срока действия учётной записи.
### Права доступа к файлам
**Студет должен разбираться в правах доступа к файлам.**
У каждого файла в Linux есть у два владельца: **пользователь и группа**.
Чтобы вывести список файлов и увидить права и владельцов фала выполните команду **`ls -l`**:

Для того чтобы изменить владельцов файла используеться утилита **chown** пример:
```bash!
chown erik 1.txt # Изменит владельца файла 1.txt на пользователя erik
chown .root 2.txt # Измменит владельца файла 2.txt на группу root.
chown erik:root 3.txt # Изменит владельцов файла 3.txt на пользователя erik и группу root.
```
Пользователь, который создает файл, автоматически становится владельцем этого файла, а основная группа этого пользователя автоматически становится владельцем этого файла. Обычно это группа, которая указана в файле **/etc/passwd** в качестве основной группы пользователя. Однако если пользователь является членом нескольких групп, он может изменить эффективную основную группу.
Для задания прав на файл может использоваться символьное обозначение:

Либо числовое:

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

Для того чтобы менять права на файл используеться команда **chmod** примеры:
```bash!
chmod u+rwx g+x o-rwx 1.txt # Добавит пользователю файла права на (чтение запись выполнение), группе файла добавит права на выполнение и всем остальным запретит доступ к файлу в любом виде.
chmod 710 1.txt # Заменит текущие права на полный доступ к файлу пользователю файла, заменит права группе на только выполнение и остальным полностью запретит выполнять какие-либо операции с файлом.
```
### Настройка сетевых интерфейсов
**Студент должен уметь настраивать сетевые интерфейсы в основных debian подобных операционных системах Linux.**
#### (ifupdown) Настройка сетевых интерфейсов в Debian.
Сетевые параметры в OC Debian задаються с помощью networking через конфигурацию файла: `/etc/network/interfaces`. Чтобы настроить сетевой интерфейс нужно знать его название для этого можно использовать команду **ip a** в примере название интерфейс **eth0**.
Основные параметры задаються следующим образом:
```conf!=
auto eth0
iface eth0 inet static
address 192.168.1.35
gateway 192.168.1.1
netmask 255.255.255.0
```
- auto указанный интерфейс необходимо запускать автоматически при загрузке системы
- iface интерфейс eth0 находится в диапазоне адресов IPv4 со статическим ip
- address статический ip адрес
- gateway шлюз по-умолчанию
- netmask маска сети
Для того чтобы обновить сетевые настройки после изменения файла нужно перезагрузить сетевую службу:
```bash!
systemctl restart networking.service
```
Для того чтобы интерфейс получал ip адресс по dhcp нужно в конфиге указать следующие:
```conf!
auto eth0
iface eth0 inet dhcp
```
После необходимо перезагрузить сетевую службу и запросить ip адрес у dhcp сервера.
```bash!
systemctl restart networking.service
dhclient -v eth0
```
#### (netplan) Настройка сетевых интерфейсов в Ubuntu.
Начиная с релиза Ubuntu 17.10, для управления конфигурацией сети используется утилита **Netplan**. Раньше для этих целей применялся скрипт ifupdown, конфигурационные файлы которого находились в папке /etc/network/interfaces.
Вы можете найти новые файлы конфигурации в /etc/netplan/*.yaml. Сервер Ubuntu генерирует конфигурационный файл Netplan для system-networkd под названием 01-netcfg.yaml, а рабочий стол Ubuntu генерирует конфигурационный файл Netplan для Network-Manager под названием 01-network-manager-all.yaml.
Если у вас несколько интерфейсов, используйте 02-network-manager-all.yaml для второго интерфейса. Netplan применяет конфигурацию в числовом порядке. Это означает, что 01 файл будет применен раньше 02 файла.
Теперь перейдем к конфигурации сети. Чтобы настроить статическую или динамическую IP-адресацию в Ubuntu, выполните следующие шаги:
Сначала найдите имя активного сетевого интерфейса, который вы хотите настроить. Для этого выполните следующую команду:
```bash!
ip a
```
Файл конфигурации Netplan по умолчанию находится в каталоге /etc/netplan. Вы можете найти его с помощью следующей команды:
```bash!
ls /etc/netplan/
```
Чтобы просмотреть содержимое файла сетевой конфигурации Netplan, выполните следующую команду:
```bash!
cat /etc/netplan/*.yaml
```
Теперь вам нужно открыть файл конфигурации в любом редакторе:
```
nano /etc/netplan/*.yaml
```
Обновите файл конфигурации в соответствии с вашими сетевыми потребностями. Для статической IP-адресации добавьте IP-адрес, шлюз, информацию DNS, а для динамической IP-адресации нет необходимости добавлять эту информацию, так как она будет получена от DHCP-сервера. Для редактирования файла конфигурации используйте следующий синтаксис.
```netplan
network:
Version: 2
Renderer: NetworkManager/ networkd
ethernets:
DEVICE_NAME:
Dhcp4: yes/no
Addresses: [IP_ADDRESS/NETMASK]
Gateway: GATEWAY
Nameservers:
Addresses: [NAMESERVER_1, NAMESERVER_2]
```
Где
- DEVICE_NAME - Имя интерфейса.
- Dhcp4 - да или нет в зависимости от динамической или статической IP-адресации
- Addresses - IP-адрес устройства в префиксной нотации. Не используйте маску сети.
- Gateway - IP-адрес шлюза для подключения к внешней сети.
- Nameservers - Адреса серверов имен DNS.
:::danger
Обратите внимание, что файлы YAML довольно строго относятся к отступам. Используйте для отступов пробелы, а не табуляцию. В противном случае вы столкнетесь с ошибкой.
:::
#### Настройка статического IP-адреса в Ubuntu
Чтобы вручную настроить IP-адрес, используйте приведенный выше синтаксис конфигурационного файла и добавьте IP-адрес, шлюз и информацию о DNS-сервере. Здесь вы можете увидеть пример конфигурации для статической IP-адресации:
```netplan
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.1.25/24
nameservers:
addresses:
- 192.168.1.1
gateway4: 192.168.1.1
```
Так же возможен вариант с перечислением, визуально он проще воспринимается:
```netplan
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: false
addresses: [192.168.122.250/24]
nameservers:
addresses: [192.168.122.1,192.168.122.2]
gateway4: 192.168.122.1
```
#### Настройка динамического IP-адреса в Ubuntu
Чтобы получить IP-адресацию от DHCP-сервера, используйте тот же вышеприведенный синтаксис конфигурационного файла. Но не добавляйте IP-адрес, шлюз и информацию о DNS-сервере.
Здесь вы можете увидеть пример конфигурации для динамической IP-адресации:
```netplan
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: true
```
После завершения настройки статического или динамического IP, сохраните и выйдите из файла конфигурации.
#### Тестирование конфигурации
Прежде чем применять какие-либо изменения, мы протестируем конфигурационный файл. Выполните следующую команду от имени sudo для тестирования конфигурации:
```bash!
netplan try
```
Если проблем нет, то будет выдано сообщение о принятии конфигурации. Если конфигурационный файл не пройдет проверку, он будет возвращен к предыдущей рабочей конфигурации
#### Применение конфигурации
Теперь примените новые конфигурации, выполнив следующую команду от имени sudo:
```
netplan apply
```
Если вы видите какую-либо ошибку, попробуйте выполнить отладку, чтобы выяснить проблему. Чтобы запустить отладку, выполните следующую команду от имени sudo:
```
netplan -d apply
```
#### Перезапуск сетевой службы
После успешного применения всех конфигураций перезапустите службу Network-Manager, выполнив следующую команду:
```bash!
systemctl restart network-manager
```
Если вы используете Ubuntu Server, вместо этого выполните следующую команду:
```bash!
systemctl restart system-networkd
```
#### Вернуть в Ubuntu ifupdown
Сперва отключим netplan в загрузчики grub:
```bash!
sudo nano /etc/default/grub
```
И приводим строку `GRUB_CMDLINE_LINUX` к следующему виду:
```bash!=
GRUB_CMDLINE_LINUX="netcfg/do_not_use_netplan=true"
```
После этого обновляем параметры grub.
```bash!
sudo update-grub
```
Устанавливаем сервис networking, для этого нам необходимо установить пакет ifupdown:
```bash!
sudo apt update
sudo apt install ifupdown
```
Редактируем / создаем файл /etc/network/interfaces.
Удаляем конфиг netplan.
```bash
sudo rm -rf /etc/netplan/*.ymal
```
После чего перезагружаем систему:
```bash
sudo reboot
```
## Практическая часть
1. Создайте директорию при название используйте свою фамилию.
2. Перейдите в созданную директорию и создайте 3 файла 1-2-3.txt.
3. Использую перенаправления вывода запишите в файл 1.txt информацию о содержимом корневого каталога.
4. Выведите содержимое файла 1.txt в консоль.
5. Используя команду echo выведите в консоль сообщение «Привет Linux»
6. Запишите в файл 2.txt сообщение «Я учу Linux» не используюя текстовый редактор.
7. Откройте файл 2.txt в текстовом редакторе nano. Запишите на новой строке «Редактор nano - это круто».
8. Запишите содержимое фала 1.txt и 2.txt в файл 3.txt не используя редактор.
9. Создайте пустой файл history. Запишите в этот файл историю выполненных ранее команд без использования редактора.
10. Выведите в консоль содержимое директории.
11. Выведите в консоль содержимое файла history c нумерацией строк.
12. Выведите в консоль с помощью команд первую и последнюю строку файла history.
13. Создайте файл .secret. Выведите в консоль содержимое директории так чтобы увидеть этот файл.
14. Выведите в консоль содержимое переменной среды. Зачем нужна переменная среды?
15. Посмотрите справку по команде ip.
16. Посмотрите настройки сетевых интерфейсов с помощью команды ip.
17. Выведите с помощью команды less содержимое журнала syslog.
18. Посчитайте количество символов в файле 3.txt используя команду.
19. Используя команду man прочитайте что делает команда sort. Отсортируйте файл history тремя разными способами.
20. Вывести содержимое файла 3.txt в одну строку.
21. Скопируйте файл 1.txt в домашнию директорию пользователя.
22. Переместите файл .secret в домашнию директорию пользователя.
23. Отыщите в созданной ранее директории файлы с расширением .txt и выведите их название в консоль одной командой.
24. Удалите файл 1.txt файл .secret в домашней директории пользователя.
25. Создайте архив с помощью утилиты tar из директории в которой находитесь. Переместите архив в домашний каталог пользователя.
26. Выведите все процессы в системе запущенные от всех пользователей.
27. Отобразите процессы запущенные от пользователя root.
28. Удалите ранее созданную директорию.
29. Восстановите директорию из созданного архива.
30. Запустите задачу sleep 120 в фоновом режиме.
31. Используя утилиту top найдите PID процесса sleep и убейте процесс.
32. Создайте 3 терминала с помощью screen, в одном из терминалов выполните команду history. Во втором терминале выполните любые 3 команды. В третьем терминале еще раз выполните history. Сделайте вывод. Выйдите из виртуальных терминалов. Закройте созданные терминалы.
33. Выполните команду ping до yandex.ru.
34. Созайте нового пользователя name_N (где name - ваше имя, а N номер по журналу). Оболочкой командной строки должен быть bash у пользователя должен быть задан пароль 123, также у пользователя долже быть домашний каталог в директории /home с названием test_user.
35. Создайте группу test_users.
36. Добавьте раннее созданного пользователя в группу test_users.
37. Перейдите в директорию созданного пользователя (при необходимости создайте ее). Скопируйте в эту директорию ранее созданный файл 3.txt с изменением названия на 3.txt.test. Залогиньтесь в системе под созданным ранее пользователем. Перейдите в домашний католог этого пользователя. Создайте файл 4.txt. Сравните права и владельцев обоих файлов.
38. Измените владельца файла 3.txt.test на нового пользователя.
39. Измените права доступа на файлы так чтобы их мог прочитать и изменить любой пользователь в системе.
40. Задайте статические настройки для сетевого интерфейса виртуальной машины ubuntu используя netplan. Проверьте наличие доступа в интернет.
41. Верните networking в ubuntu и настройте интерфейс так чтобы он получал ip от dhcp сервера.
## Контрольные вопросы
1. **С помощью каких команд можно создавать и удалять файлы?**
2. **С помощью какой команды можно перемещаться по директориям в Linux?**
3. **C помощью какой команды можно посмотреть содержимое директории?**
4. **Какими командами можно выводить содержимое файлов в консоль?**
5. **Какой командой можно искать файлы по какому-либо признаку?**
6. **Какой командой можно скопировать файл?**
7. **Какой командой можно переместить файл?**
8. **Как можно посмотреть процессы запущенные от пользователя root? А от всех пользователей?**
9. **Какие команды используются для создания архивов?**
10. **Какой командой можно посмотреть конфигурацию сетевых интерфейсов? Какой командой можно проверить жив ли хост?**
11. **Какой командой можно создавать виртуальные интерфейсы?**
12. **Что такое UID/GID?**
13. **Какими командами создаються пользователи и группы пользователей?**
14. **Как менять права на файл?**
15. **Как менять владельцев файла?**
16. **Что используеться для настройки сетевых интерфейсов в ubuntu?**