# Работа с текстовыми редакторами в Linux

Задачи:
1. Подключиться к облачной инфраструктуре.
0. Убедиться в наличии доступных сетей.
0. Создать виртуальную машину.
0. Настройка правил безопасности.
0. Узнать адрес виртуальной машины.
0. Подключиться к ВМ по ssh
0. Установить пакет vim
0. Пройти обучение работе с vim.
0. Выполнить базовые действия с файлами и папками.
0. Установить пакет wget.
0. Научиться работать с переменными окружения.
0. Создать нового пользователя и подключиться к нему. Поменять shell у пользователя.
0. Изучить работу с текстом в Bash.
0. Тренировка работы с grep
0. Тренировка работы с sed
0. Тренировка работы с awk


#### Задание  1. Подключиться к облачной инфраструктуре.

Необходимо перейти по ссылке https://cloud.resds.ru. Для подключения использовать домен AD, а также учётную запись пользователя, используемую для подключения к WiFi СПбГУТ

Для выполнения практических занятий необходимо переключиться на проект {username}.dev.
<hr>
<center><img src=https://docs.resds.ru/uploads/images/gallery/2023-11/CJ58SAPAC9W4Srnm-image-1698912525943.png></center>
<center>Рис. 1</center>

#### Задание  2.	Убедиться в наличии доступных сетей. 

<hr>
Открыть: проект -> сеть -> сети, и убедиться, что там есть сеть external-net (рис. 2)
<hr>
<center><img src=https://docs.resds.ru/uploads/images/gallery/2023-11/BvJVI6TYZCfxFPYt-image-1698912915991.png></center>
<center>Рис. 2</center>
<hr>

#### Задание 3.	Сгенерировать ключевую пару.
При первом входе сгенерировать ключевую пару, для доступа к Linux виртуальным машинам.
Открыть: Проект -> ключевая пара -> создать ключевую пару (рис. 3)
<hr>
<center><img src=https://docs.resds.ru/uploads/images/gallery/2023-11/uqYelywXjB7ESFq2-image-1698913147590.png></center>
<center>Рис. 3</center>
В открывшемся окне (рис. 4) ввести имя ключевой пары и тип ключа(ssh-key)
<hr>
<center><img src=https://docs.resds.ru/uploads/images/gallery/2022-03/scaled-1680-/H8x4KKfkR27VLNZp-image007.png></center>
<center>Рис. 4</center>
Ключ будет сохранен на ваш компьютер, он понадобится в дальнейшем.


#### Задание 4. Создать виртуальную машину. 
Открыть меню Проект > вычислительные ресурсы > инстансы > запустить инстанс (рис. 5)
<hr>
<center><img src=https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/9YQqFEdOUajSPhCU-image-1698913335375.png></center>
<center>Рис. 5</center>
<hr>
В открывшемся окне (рис. 6), во вкладке подробности ввести имя инстанса и нажать Следующая > внизу страницы.
<hr>
<center><img src=https://docs.resds.ru/uploads/images/gallery/2022-03/scaled-1680-/EbiVrAdkw4Hh11I2-image011.png></center>
<center>Рис. 6</center>
<hr>
В следующем меню (Источник) выбрать источник – образ, указать размер тома данных, выбрать удаление диска при удалении инстанса, выбрать необходимый вам образ из доступных (например Ubuntu-server-20.04:docker), и нажать справа от него стрелку вверх (рис. 7)
<hr>
<center><image src=https://docs.resds.ru/uploads/images/gallery/2022-03/GRWhJjYFrFTu0uua-image013.jpg></center>
<center>Рис. 7</center>
  
В следующем меню (тип инстанса) определить объем выделяемых виртуальной машине вычислительных ресурсов. Для этого нужно выбрать <u>**один из предопределённых типов инстансов**</u> (например small), и нажать справа от него стрелку вверх (рис. 8).
<hr>
<center><image src=https://docs.resds.ru/uploads/images/gallery/2022-03/RuUj8904Z2ZFgSMJ-image015.jpg></center>
<center>Рис. 8</center>
<hr>
В меню сети выбрать нужную вам сеть, к которой будет подключена виртуальная машина (наличие сети было проверено в п.1). Если в инфраструктуре доступна только одна сеть, она будет выбрана автоматически, и выбирать ничего не нужно. (рис. 9)
<hr>
<center><image src=https://docs.resds.ru/uploads/images/gallery/2022-11/f73yFADL3xHYsGjQ-screenshot-2.png></center>
<center>Рис. 9</center>
<hr>
Затем перейти к меню Ключевая пара, выбрать созданную ключевую пару, и нажать справа от неё стрелку вверх. (рис. 10)
<hr>
<center><image src=https://docs.resds.ru/uploads/images/gallery/2022-03/6DtKSmtNNk6Be1TP-image019.jpg></center>
<center>Рис. 10</center>
<hr>
После выполнения всех действий - нажать справа снизу кнопку «запустить инстанс» для создания и запуска виртуальной машины.

#### Задание 5. Настройка правил безопасности. 

Для работы с инстансом необходимо разрешить ему сетевое взаимодействие :80/TCP – HTTP, 22/TCP – SSH, 51820/UDP - other.
Для этого нужно открыть Проект > Сеть > Группы безопасности > выбрать группу безопасности default и нажать – управление правилами (рис. 11)

[![](https://docs.resds.ru/uploads/images/gallery/2024-05/scaled-1680-/MbgWLOTKWaJk5Vci-image-1715631944088.png)](https://docs.resds.ru/uploads/images/gallery/2024-05/MbgWLOTKWaJk5Vci-image-1715631944088.png)
<hr>
<center><image src=https://docs.resds.ru/uploads/images/gallery/2022-03/scaled-1680-/IimDgrIvnV5xjLg1-image020.png></center>
<center>Рис. 11</center>
<hr>
В открывшемся меню добавить правило для входящего трафика (рис. 12)
<hr>
<center><image src=https://docs.resds.ru/uploads/images/gallery/2022-03/scaled-1680-/0nR7lwDumyhK1pDj-image021.png></center>
<center>Рис. 12</center>
<hr>
В открывшемся меню добавления правил (рис. 13), добавить правило для порта 80(tcp)
Для этого выбрать:
Правило: «Настраиваемое правило TCP»
Направление: Входящий трафик
Порт: 80
Формат записи подключаемого диапазона адресов: CIDR
Сам подключаемый диапазон адресов: 0.0.0.0/0
Последняя запись означает разрешение подключения с любого адреса
<hr>
После заполнения всех полей нажать кнопку «Добавить» в правом нижнем углу.
<center><image src=https://docs.resds.ru/uploads/images/gallery/2022-03/scaled-1680-/iADChjMLQRvRpdR8-image023.png></center>
<center>Рис. 13</center>
<hr>
Тоже самое необходимо сделать для всех остальных портов.

#### Задание 6.	Узнать адрес виртуальной машины. 
Для этого вернуться во вкладку инстансы и в поле ip адрес будет ip адрес вашего виртуального инстанса (рис 14). Этот адрес понадобится в дальнейшем, для подключения к нему и его настройки.
<center><image src=https://docs.resds.ru/uploads/images/gallery/2022-03/scaled-1680-/j775DBhTELenEevV-image025.png></center>
<center>Рис. 14</center>
<hr>
  
#### Задание 7.	Подключиться к ВМ по ssh 

  ##### Linux
  
Для подключения в большинстве дистрибутивов уже установлены SSH-агенты и для подключения используя ключ достаточно добавить его в агент.

Для этого нужно выполнить команду, где pemkey.pem, это файл полученный вами на 3 пункте данной инструкции
```bash
ssh-add pemkey.pem
```
Для подключения в данном случае в терминале достаточно ввести команду:
```bash
ssh cloudadmin@172.17.5.1
```
>  адрес 172.17.5.1 необходимо заменить на ваш адрес полученный из пункта 6 инструкции

  ##### Windows OpenSSH <br>



В Windows 10 c версии 1809 включен пакет OpenSSH, проверить это можно с помощью команды (выполняется с правами администратора):
> Дальнейшие действия выполняются в PowerShell 
```powershell
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'

```

[![Screenshot from 2022-05-12 17-40-45.png](https://docs.resds.ru/uploads/images/gallery/2022-05/scaled-1680-/2C2fpUjF63J3a87b-screenshot-from-2022-05-12-17-40-45.png)](https://docs.resds.ru/uploads/images/gallery/2022-05/2C2fpUjF63J3a87b-screenshot-from-2022-05-12-17-40-45.png)


Если SSH клиент отсутствует (State: Not Present), его можно установить:
```powershell
Add-WindowsCapability -Online -Name OpenSSH.Client*
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
```
Далее необходимо включить SSH-агент:
```powershell
Start-Service ssh-agent
```
Добавить ключ можно с помощью команды:
```powershell
ssh-add "C:\Users\{username}\.ssh\id_rsa"
```
> username - имя вашего пользователя в системе

Теперь вы можете подключиться используя команду:
```powershell
ssh cloudadmin@172.17.5.1
```
>  адрес 172.17.5.1 необходимо заменить на ваш адрес полученный из пункта 6 инструкции


#### Задание 8. Установка пакета VIM
Для установки, удаления, обновления пакетов в Ubuntu используется утилита `apt`. В процессе установки/обновления/удаления пакетов нужно будет подтвердить установку новых версий, нажав y. Или же использовать флаг -y. Необходимо установить пакет vim, в котором содержится необходимое обучающее руководство.

```bash
sudo apt install -y vim
```

#### Задание 9. Пройти обучение работе с vim
Ввести в консоли следующую команду, для запуска интерактивного обучающего курса по работе с VIM:
```bash
vimtutor ru
```
Пройти интерактивный курс до конца.

#### Задание 10. Работа с файловой системой.

1.	Создать директорию task01. Перейти в неё.
```sh
mkdir task01
cd task01
```
2.	Создать в домашнем каталоге текстовый файл user при помощи текстового редактора `vi`, и заполнить его произвольными символами. 
```sh
vi user
```
3.	Скопировать файл `user` в новый файл с именем `root`.
```sh
cp user root
```
4.	Посмотреть права доступа на файлы можно с помощью команды:
```sh
ls -l
```
5.	Задать владельца root и группу root на файл root. (sudo позволяет выполнять команды от `root`; ввести пароль в диалоговом окне, при этом символы отображаться не будут; пароль - `labpass1!`)
```sh
sudo chown root:root root
```
6.	Переименовать (т.е. переместить с новым именем) файл `user` в файл `lock`.
```sh
mv user lock
```
7.	На файл root поставить доступ на чтение и запись группе и владельцу остальным только на чтение.
```sh
sudo chmod 664 root
```
8.	На файл lock поставить доступ на чтение владельцу, группе и остальным пользователям убрать доступ на чтение запись и исполнение.
```sh
chmod 600 lock
```
9.	Вывести содержимое файла root в терминал.
```sh
cat root
```
10.	Отредактировать файл root случайным образом и вывести его содержимое в консоль.
```sh
sudo vi root 
cat root
```
11.	Удалить каталог task01.
```sh
cd
sudo rm -rf task01
```


#### Задание 11. Установка пакетов.
Для установки, удаления, обновления пакетов в Ubuntu используется утилита `apt`. 
В процессе установки/обновления/удаления пакетов нужно будет подтвердить установку новых версий, нажав `y`. Или же использовать флаг `-y`.

Для установки/удаления пакетов существуют команды:
```sh
sudo apt install -y package_name
sudo apt remove -y package_name
```
В качестве примера необходимо установить программу для скачивания файлов по web-протоколам - `wget`.
```sh
sudo apt install wget
```
Можно проверить версию установленного пакета:
```sh
wget –-version
```

#### Задание 12. Создание пользователей.

Создать нового пользователя newuser с паролем `newpass1!`. Сделать его администратором.
```sh
sudo adduser newuser
sudo passwd newuser # Ввести пароль newpass1!, при этом пароль отображаться не будет
sudo usermod -aG sudo newuser # Добавить пользователя newuser в группу sudo, что даст ему права на исполнение команд с sudo
```
Для того чтобы выполнять команды от имени пользователя `newuser`, необходимо сменить текущее окружение на окружение пользователя newuser командой - `su`. При этом нужно будет ввести пароль пользователя `newuser`.
```sh
su - newuser
```

Имя пользователя изменилось с `labuser` на `newuser`. Также, имя пользователя хранится в переменной окружения `$USER`. Просмотреть значение переменной можно с помощью команды `echo`.
```sh
echo $USER
```
Чтобы узнать, в каких группах состоит текущий пользователь, используется команда `groups`. В данном случае это должны быть группы `newuser` и `sudo`.
```bash
groups
```

Для выхода из оболочки используется команда `exit`. При этом выход идет в оболочку, запущенную пользователем `labuser`. 
```bash
exit
```

Теперь нужно сменить оболочку, запускаемую по умолчанию при входе пользователя `newuser`. Чтобы узнать список доступных в системе оболочек, используется следующая команда:
```bash
cat /etc/shells
```
Сейчас должна быть запущена оболочка `/bin/bash`. Чтобы узнать, какая оболочка запущена сейчас, можно вывести на экран значение переменной `$0`.
```bash
echo $0
```

Чтобы просто запустить оболочку, достаточно просто набрать путь к ней.  Запустить оболочку - `sh`, и вывести на экран переменную - `$0`. После выйти обратно в `bash`.
```bash
/bin/sh
echo $0
exit
```

Чтобы сменить оболочку по умолчанию для пользователя, можно отредактировать файл `/etc/passwd`, либо можно использовать утилиту `usermod`. Необходимо посмотреть, какая оболочка сейчас является оболочкой по умолчанию для пользователя `newuser`, сменить её на `/bin/sh`, и проверить изменения.

```bash
sudo grep newuser /etc/passwd # grep - программа для поиска по тексту. В данном случае, выведет все строки, содержащие newuser. 
sudo usermod --shell /bin/sh newuser
sudo grep newuser /etc/passwd # Данная команда произведет поиск по файлу 
                              # /etc/passwd, и отобразит в консоли все 
                              # строки, в которых присутствует слово
                              # newuser. В этой же строке будет указано,
                              # какая оболочка используется данным
                              # пользователем
```
Теперь необходимо переключиться в режим работы от имени пользователя `newuser`, и проверить, какая оболочка используется. После выйти из этого режима, и удалить пользователя.
```sh
su - newuser
echo $0
exit
sudo userdel -r newuser # флаг r используется, когда вы хотите удалить также домашний каталог пользователя.
```

#### Задание 13. Работа с текстом в bash.
Для практики нужно воспользоваться текстовым файлом, специально созданным для выполнения задания - таблица подключений OpenVPN, состоящая из имени клиента, IP адреса, MAC адреса устройства и внешнего IP, с которого клиент подключился. Необходимо загрузить файл, воспользовавшись специальной утилитой  curl:
```sh
sudo apt install curl -y
cd ~ 
curl -L -o clients.txt https://pastebin.com/raw/cEYa64Cz
```
Вывести содержимое файла в консоль (Тут для удобства можно пользоваться встроенными в консоль горячими клавишами: Ctrl+L - Очистить содержимое консоли, Shift+PgUp - Прокрутить консоль вверх, Shift+PgDn - Прокрутить консоль вниз).
```sh
cat ~/clients.txt
```
Для того чтобы вывести строки, содержащие подстроку, можно использовать grep. Необходимо вывести информацию о клиенте под номером 24 (grep - регистрозависимый, Client24 начинается с заглавной буквы).
```sh
grep Client24 ~/clients.txt
```
В результате исполнения команды должна быть выведена одна строка. Если было несколько строк, содержащих подстроку Client24, то в результате выведется несколько строк. Далее необходимо ввести команду:
```sh
grep Client2 ~/clients.txt
```
Необходимо попробовать понять, сколько будет выведено строк и почему именно они. 

Помимо обычных строк grep поддерживает также регулярные выражения. При этом регулярные выражения должны экранироваться символом \. С помощью регулярных выражений можно задать абсолютно любой паттерн. Относительно простой - вывести всех клиентов, имя которых заканчивается на 4. Точка в выражении означает любой символ.
```sh
grep Client\.4 ~/clients.txt
```
grep также умеет работать с пайплайном (вертикальная черта). С помощью пайплайна можно передавать вывод от одной программы другой, по принципу конвейера. Например, можно вывести текст через cat, и передать этот вывод на вход команды grep, для его обработки этой командой.
```sh
cat ~/clients.txt  |  grep Client\.4
```
Пайплайнов может быть несколько. Так, например, воспользовавшись программой AWK можно вывести только имя клиента и его внешний адрес - то есть первый и четвертый столбцы. (Внимание на пробел в двойных кавычках между номерами столбцов. Это разделитель, который будет между столбцами в конечном результате. Пробел можно заменить на любой другой символ, например, на дефис -, или символ табуляции \t. Можно попробовать это сделать)
>Awk - это полноценный язык обработки текстовой информации с синтаксисом, напоминающим синтаксис языка C. Он обладает довольно широким набором возможностей, однако, мы рассмотрим лишь некоторые из них -- наиболее употребимые в сценариях командной оболочки.
Awk "разбивает" каждую строку на отдельные поля. По-умолчанию, поля -- это последовательности символов, отделенные друг от друга пробелами, однако имеется возможность назначения других символов, в качестве разделителя полей. Awk анализирует и обрабатывает каждое поле в отдельности. Это делает его идеальным инструментом для работы со структурированными текстовыми файлами, осбенно с таблицами.

```bash
cat ~/clients.txt  |  grep Client\.4 | awk ‘{print $1” “$4}’
```
AWK также поддерживает функции в своем синтаксисе. Например, чтобы вывести имя клиента и MAC, при этом чтобы MAC печатался заглавными буквами, нужно использовать следующую конструкцию.
```bash
cat ~/clients.txt  |  grep Client\.4 | awk ‘{print $1” “toupper($3)}’
```
Далее необходимо вывести MAC адрес, чтобы он был разделён не двоеточиями, а дефисами, тогда можно воспользоваться sed. Нужно лишь задать параметры для замены. После этого результат можно вывести не в консоль, а в новый файл (набирать в одну строку):
>Sed - это неинтерактивный строчный редактор. Он принимает текст либо с устройства stdin, либо из текстового файла, выполняет некоторые операции над строками и затем выводит результат на устройство stdout или в файл. Как правило, в сценариях, sed используется в конвейерной обработке данных, совместно с другими командами и утилитами.
```bash
cat ~/clients.txt  |  grep Client\.4 | awk ‘{print $1” “toupper($3)}’ | sed -r ‘s/:/-/g’ > newfile.txt
```
#### Задание 14. Тренировка работы с grep

Устанавливаем пакет, `git` для работы  с git репозиториями:
```bash
  sudo apt install -y git
```
Копируем репозиторий  с GitHub  и устанавливаем тренажер: 
```bash
git clone https://github.com/learnbyexample/TUI-apps.git
cd TUI-apps/GrepExercises
sudo apt install -y python3 python3-pip python3-venv
python3 -m venv textual_apps
cd textual_apps
source bin/activate
pip install grepexercises
```
Запускаем тренажер 

```bash
grepexercises
```

#### Задание 15. Тренировка работы с sed
Переходим :
```bash
cd ../sedexercises
python3 -m venv textual_apps
cd textual_apps
source bin/activate
pip install sedexercises
```
Запускаем тренажер 
```bash
sedexercises
```

#### Задание 16. Тренировка работы с awk
Переходим :
```bash
cd ../awkexercises
python3 -m venv textual_apps
cd textual_apps
source bin/activate
pip install awkexercises
```
Запускаем тренажер 
```bash
awkexercises
```