---
# System prepended metadata

title: Linux Basics Модуль Занятие 2

---

# Linux Basics Модуль Занятие 2
## Администрирование Linux
### Практическая работа 2.1 Основы мониторинга OS Linux с помощью утилит df, du, free, iostat, mpstat, vmstat, w, htop
Рассмотрим утилиты мониторинга, которые доступны в дистрибутивах по умолчанию
1. Утилита df
Она позволяет посмотреть на используемое файловыми системами Linux пространство
Вывод команды без аргументов:
![](https://i.imgur.com/fLsTYvN.png)
Используем аргумент `-a`, который выводит информацию обо всех файловых системах
![](https://i.imgur.com/7cQjWfa.png)
Используем аргумент -h, который выводит информацию в удобном для чтения виде (подставляет удобные для восприятия единицы информации - килобайты, мегабайты, гигабайты)
![](https://i.imgur.com/KggJhhg.png)
Посмотрим на состояние инодов в каталоге /home
![](https://i.imgur.com/ED1sQeu.png)

2. Утилита du
Утилита дает информацию о приблизительном использовании дискового пространства
Вызовем утилиту без аргументов
![](https://i.imgur.com/rJl1xiV.png)
Чтобы отобразить занимаемоем всеми (и скрытыми) файлами пространство, используется аргумент `-a`
![](https://i.imgur.com/yvBXWXb.png)
Для удобочитаемого формата можно использовать `-h`
![](https://i.imgur.com/cALxxKG.png)
Чтобы отобразить только размер указанного каталога, а не рекурсивно просматривать все файлы, используется флаг `-s`
![](https://i.imgur.com/Ln0lMyr.png)
А чтобы вывести и размер всех файлов, и общий размер каталога, используется флаг `-c`
![](https://i.imgur.com/W9EMfZJ.png)
Посмотреть фактический размер файла используется переключатель `--apparent-size`
![](https://i.imgur.com/agkiWVv.png)
Попробуем использовать другие доступные нам функции для того чтобы посмотреть 10 самых больших файлов в каталоге */home/kali*
`du -h ~ | sort -rh | head -10`
![](https://i.imgur.com/uBaHGnM.png)

3. Утилита free
Чтобы посмотрет о количестве оперативной памяти используется утилита *free*. Она выводит:
    + общее количество оперативной памяти
    + сколько памяти используется
    + сколько свободно
    + сколько используется буфером и под кэш
    + доступный объем памяти

    Также, как и остальные утилиты мониторинга, она воспринимает флаг `-h`
![](https://i.imgur.com/8rJ2pnw.png)
Для вывода можно выбирать любую единицу измерения (килобайты, кибибайты и т.д, форму написания можно посмотреть по `free --help`)
![](https://i.imgur.com/CQEd9TD.png)
Можно включить циклический вывод состояния с помощью флага `-s` и указания времени, через сколько (в секундах) выводить результат (процесс будет вечным)
![](https://i.imgur.com/Nns5ulm.png)
Чтобы не засорять терминал, можно использовать команду watch: `watch free -h`. Вывод будет происходить через равные промежутки времени
![](https://i.imgur.com/RP7mSN7.png)

4. Утилита iostat
Показывает информацию об использовании устройств ввода-вывода, Здесь отображается информация о времени работы и времени простоя, а также средняя скорость чтения/записи для устройств ввода-вывода
При использовании без аргументов будет выведена информация об использовании процесса и устройства хранения
![](https://i.imgur.com/CYzK7mo.png)
При использовании аргумена `-x` будет выдана расширенная статистика
![](https://i.imgur.com/c7pVhQq.png)

5. Утилита mpstat
Выводит статистику по использованию ядер процессора.
![](https://i.imgur.com/PYhZ4bR.png)
Использование флага `-A` выдаст расширенную статистику
![](https://i.imgur.com/AWKmN9v.png)
Утилита позвляет посмотреть статистику и каждого из ядер по отдельности, для этого можно использовать флаг `-P` и либо номер ядра, либо `ALL`
![](https://i.imgur.com/a5vn6zW.png)
![](https://i.imgur.com/zQawDqY.png)

6. Утилита vmstat
Эта утилита показывает общую информацию о состоянии процессора, памяти, своп-файла, устройств ввода-вывода и системы.
![](https://i.imgur.com/ezqtAZe.png)
Параметр `-a` позволяет вывести количесто активной и неактивной памяти
![](https://i.imgur.com/XSGSfPy.png)
А чтобы посмотреть количество вилок (моментов запуска подпрограмм), с момента загрузки, используется параметр `-f`
![](https://i.imgur.com/17vbhsa.png)
Посмотреть статистику использования дисков (`-d` выводит информацию для каждого диска отдельно, `-D` выводит общую статистику)
![](https://i.imgur.com/9kf7aau.png)

7. Утилита w
Выводит информацию о работающих в системе пользователях
![](https://i.imgur.com/9duuMXv.png)
Расшифровка заголовка таблицы:
    + USER — имя пользователя
    + TTY — название терминала
    + FROM — название удаленного компьютера или IP-адрес
    + LOGIN — время входа в систему
    + IDLE — время бездействия
    + JCPU — время, использованное всеми процессами, подключенными к tty. Оно не включает завершенные фоновые задания, но включает фоновые задания, работающие в данный момент
    + PCPU — время, использованное текущим процессом, который указан в поле WHAT
    + WHAT — текущий процесс (командная строка текущего процесса)
    
    Чтобы убрать заголовок используется параметр `-h`
![](https://i.imgur.com/M9CMLJG.png)
    Параметр `-s` отвечает за сокращенный вывод: не будут выводиться колонки JCPU и PCPU
![](https://i.imgur.com/9jihoaG.png)
    Параметр `-f` также уберет поле FROM
![](https://i.imgur.com/CEZXjCj.png)

8. Утилита htop
Чтобы выводить всю информацию в более аккуратном виде, схожем с тем, что используется в Диспетчере задач Windows, была создана утилита htop. По большей части, она не входит в дистрибутивы Linux, и ее нужно устанавливать через команду `sudo apt install htop`
После установки и запуска появится отдельный терминал:
![](https://i.imgur.com/dmkaAIq.png)
htop выводит всю информацию о запущенных в данный момент процессах. Кроме этого, в верхней части окна отображается процент загрузки ядер и памяти, количество запущенных задач, средний процен загруженности системы и время с начала работы.
С помощью утилиты можно посмотреть информацию: ID процесса, его приоритет, кем процесс был запущен, количество используемой процессом память, его состояние, время работы и само имя запущенной программы.
htop сильно нагружает операционную систему из-за слишком частого сбора статистики, поэтому скорость обновления данных можно понизить с помощью аргумента `-d` при запуске утилиты. Время для обновления ставится в десятых долях секунды. 
Также все процессы можно вывести в виде дерева, чтобы можно было отследить, кем бы порожден процесс: `sudo htop -t`
![](https://i.imgur.com/0GnCVN0.png)




### Практическая работа 2.2 Установка и настройка сервера SSH в Linux

Установим и запустим сервер SSH на Linux, предварительно изменив первичные настройки сервера:
+ изменим порт подключения
+ добавим правило на запррет входа через root-пользователя
+ отменим аутентификацию по паролю
+ разрешим использование публичных и приватных ключей для аутентификации

А также попробуем подключиться с основной операционной системы к SSH серверу при помощи утилиты PuTTY.

1. Утсановка пакетов.
Сначала нужно установить пакеты для SSH сервера. Установка происходит командой `sudo apt-get install ssh` для Ubuntu и Kali Linux (`yum -y install openssh-server openssh-clients` для Linux с менеджером пакетов yum). При этом сначала следует произвести обновление всех имеющихся пакетов через `sudo apt update && sudo apt upgrade`.
После набора команды начнется процесс установки
![](https://i.imgur.com/GCDcyZq.png)

2. После установки нужно проверить, запущен ли фоновый процесс ssh-сервера (делается командой `sudo service ssh status`)
![](https://i.imgur.com/WRGnDrP.png)
Если сервер отключен, его нужно поставить на включение командой `sudo systemctl enable --now ssh`
![](https://i.imgur.com/BGRGYUU.png)

3. Теперь можно начать настройку ssh-сервера. Нужно открыть файл `/etc/ssh/sshd_config` с помощью текстового редактора (для изменения файла нужны права root). 
Сам файл организован в виде набора настроек по умолчанию для сервера, закомментированных с помощью знака #. Для того, чтобы измененная настрйка вступила в силу, нужно снять знак #. 
В первую очередь нужно изменить порт, который будет использоваться для подключения (по умолчанию используется порт 22). Здесь порт изменен на 5555 (порты с одинаковыми цифрами часто сканируются ботами, поэтому следует ставить порт с разными цифрами). Также нужно поменять атрибут AddressFamily, который указывает на типы адресов, которые будут восприниматься для подключения (ставим inet, указывающий на адреса IPv4).
![](https://i.imgur.com/bko6aPh.png)
Далее нужно отключить доступ по root-пользователю. Делается это в настройке PermitRootLogin.
![](https://i.imgur.com/aAucYKR.png)
Теперь следует отключить аутентификацию по паролю 
![](https://i.imgur.com/Eemx9PW.png)
Взамен отключенным паролям включим возможность аутентификации по публичным ключам
![](https://i.imgur.com/npEYbqt.png)
После явного включения аутентификации по ключам нужно указать путь до файлов с этими ключами для разных версий SSH (1 и 2). Делается это в настройке AuthorizedKeysFile. Здесь указаны пути до ключей, хранящихся в каталогах каждого пользователя.
![](https://i.imgur.com/TmMEwBw.png)
После внесения всех настроек следует перезапустить сервер ssh командной `sudo service sshd restart`
![](https://i.imgur.com/UiwWgZn.png)

4. Генерация ключа.
Для генерации публичных и приватных ключей используется утилита *ssh-keygen*. Она генерирует пары открытого и закрытого ключей RSA размером в 2048 бит в директории, на которую вы укажете. После запуска утилита спросит, по какому пути сохранять файлы (путь по умолчанию указывает на папку для каждого пользователя, этот путь можно не менять). После утилита попросит ввести фразу для шифровки ключа (потом эту фразу понадобится вводить при каждом использовании ключа, она используется для того, чтобы не держать ключ в открытом виде).
![](https://i.imgur.com/AVCU9Yv.png)
Если ключ уже был ранее сгенерирован, появится диалог для получения разрешения перезаписать имеющийся ключ.


5. Перенос ключа для подключения к серверу
Теперь понадобится переправить ключ на сервер, чтобы можно было произвести аутентификацию. Делается это командой `ssh-copy-id -i ~/.ssh/id_rsa.pub -p <port> user_name@host_name`, где:
    + id_rsa.pub - файл публичного ключа аутентификации, сгенерированный утилитой ssh-keygen
    + port - порт, на который настроен сервер ssh
    + username@hostname - пара имени пользователя и айпи-адреса или имени хоста.

    ![](https://i.imgur.com/XAqko03.png)
    Для входа на сервер и загрузки ключа понадобится предварительно включить аутентификацию по паролю, после ее можно будет обратно выключить.  

6. Теперь мы можем попробовать зайти на сервер из терминала Linux. 
Для этого используем команду `ssh -p 5555 kali@kali`
![](https://i.imgur.com/CBI3EnY.png)
У нас попросят парольную фразу для использования ключа, полсе чего появится сообщение о входе. 

7. Использование PuTTY для входа  на сервер с хостовой операционной системы.
Для входа будем использовать PuTTY. Для начала нам понадобится перенести приватный ключ на хостовую операционную систему, т.к. без него не получится войти на сервер. 
Ключ можно перенести при помощи буфера обмена (вывести ключ в терминал и скопировать текст в текстовый документ уже на хостовой операционной системе).
![](https://i.imgur.com/nPxlYuA.png)
![](https://i.imgur.com/YPr4e6J.png)
Однако формат OpenSSH, который генерируется ssh-keygen, не воспринимается утилитой PuTTY. Нам понадобится импортировать ключ с помощью утилиты PuTTYgen (поставляется вместе с самой PuTTY).
![](https://i.imgur.com/hX3ElKh.png)
В этом окне нам нужно перейти по Conversions -> Import Key, после чего понадобится выбрать расположение файла с  скопированным ключом. После этого в PuTTYgen появится окно с вводом парольной фразы для использования ключа
![](https://i.imgur.com/ZDKHDdO.png)
Вводим парольную фразу, после чего в PuTTYgen появляется наш ключ. Нам нужно получить приватный ключ, поэтому нужно будет нажать на кнопку Save private key
![](https://i.imgur.com/kuGPc5N.png)
После этого появится окно выбора расположения файла, этот файл нужно будет сохранить в расширении .ppk
Теперь переходим в саму PuTTY.
![](https://i.imgur.com/b4S6kcA.png)
Здесь во вкладке Session нам нужно вписать айпи-адрес Linux сервера, порт подключения, а также проверить, что тип подключения выставлен в SSH. (проверить, что Linux сервер и хостовая операционная система могут отправлять друг другу пакеты)
После этого переходим SSH->Auth, чтобы указать путь до приватного ключа. 
![](https://i.imgur.com/B6WrNRf.png)
Добавление пути происходит по кнопке Browse, далее понадобится указать путь до .ppk файла.
Теперь можно нажать на кнопку Open, после чего откроется консольное окно, в котором будут спрашивать логин пользователя (можно установить логин по умолчанию в Connection-> Data-> поле Auto login username)
После ввода логина появится надпись о использовании для входа сгенерированного ключа (понадобится ввести парольную фразу для использования приватного ключа). 
После этого появится информация о последнем входе, а также поле ввода, как в терминале Linux. 
![](https://i.imgur.com/iR9S9R2.png)

Теперь можно удаленно взаимодействовать с Linux с хостовой операционной системы!
![](https://i.imgur.com/TUo7w1x.png)

### Практическая работа 2.3 Установка и настройка SSH-authorized_keys

#### Разибраемся в работе SSH-ключей.
Изначально для аутентификации в SSH использовались пароли. Т.к. пароли передаются по зашифрованному каналу, SSH была гораздо более безопасной, чем ее предшественники Telnet и rlogin
Однако передача пароля по сети, пусть даже и зашифрованного, несет опасность, т.к. шифр пароля можно разгадать. 

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

Открытый ключ выгружается на удаленный сервер, и добавляется в отдельный файл .ssh/authorized_keys. При этом ключу ставится в пару логин, под которым будет заходить пользователь.
Когда пользователь пытается войти в систему под своим логином, сервер может попросить клиент доказать наличие приватного ключа. Если проверка будет пройдена, сервер разрешит подключение и выполнение команд от имени логина.

Преимущества использования ключей перед парольным входом:
+ Закрытый ключ никогда не передается по сети (расшифровка паролем происходит на устройстве, и никакие данные не переправляются на другие устройства). Также применение ключа происходит тоже только на устройстве клиента, по итогу, никакая информация о закрытом ключе не распространяется. 
+ Доступ к закрытому ключу ограничен в операционной системе - получить доступ к файлу может лишь его создатель.
+ Следовательно, чтобы получить доступ к ключу, злоумышленник уже должен иметь доступ к системе 

#### Настройка доступа по ключам.

Основной принцип настройки ключей описан в Практической работе 2.2 (пукнты 3-5). Однако утилита ssh-copy-id не всегда доступна на дистрибутивах Linux, поэтому опишем здесь проброс ключа на сервер без ее использования. Для этого способа, также как и для ssh-copy-id, понадобится парольный доступ к серверу.

Для копирования можно использовать возможности команды cat:
```
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
```
Первая часть команды (до прямого слеша) отвечает за вывод содержимого из файла с публичным ключом на клиенте. Прямой слеш указывает на выполнение дополнительных команд для организации вывода: нужно используя ssh войти на сервер, создать папку .ssh внутри директории удаленного пользователя и вывести весь результат в файл authorized_keys в этой папке. Для того, чтобы не перезаписывать все содержимое файла, а только добавить данные в конец, используется `>>`.

Также после выгрузки ключа важно отключить доступ по паролю в конфигурационном файле фонового процесса ssh - sshd_config на стороне сервера.

### Практическая работа 2.4 Сбор информации о Linux и WGET

#### Часть 1. Сбор информации.
Попробуем собрать максимальное количество информации об установленной ОС Linux базовыми средствами

1. Получение информации о дистрибутивах
Команда `cat /etc/*release`
![](https://i.imgur.com/XKskxhW.png)
Здесь выводится оснвная информация об установленном дистрибутиве: назнвания, версия и URL-адреса поддрежки
2. Информация о ядре Linux
Команда `uname -a`
![](https://i.imgur.com/o5Afm69.png)
Здесь выводится имя ядра, его версия,  дата и тип выпуска и релиза, тип поддерживаемой архитектуры и назнвание самой операционной системы. Также для вывода информации по отдельности, можно использовать флаги, перечисленные в `uname --help`
3. Имя пользователя
Команда `whoami`
![](https://i.imgur.com/IfnI1cg.png)
4. Время работы
Команда `uptime`
![](https://i.imgur.com/JmbPLYN.png)
Показывает: сколько работает система, сколько пользователей использовало систему за время ее работы, среднее время нагрузки за последние 1, 5 и 15 минут
5. Права на домашние директории
Команда: `ls -la /home`
![](https://i.imgur.com/OwygaiP.png)
Показывает информацию о доступе к домашним каталогам пользователей.
6. Просмотр подключенных соседей
Команда: `ip neigh`
![](https://i.imgur.com/GigYT6k.png)
Выводит айпи адрес хоста, с которым в данный момент происходит соединение, имя интерфейса, через который происходит соединение, а также MAC-адрес подключенного интерфейса (фактически, выводит ARP-таблицу из собранных активных адресов)
7. Запущенные процессы и какие порты они прослушивают
Команда: `sudo ss -tlnp`
![](https://i.imgur.com/ofIvMYM.png)
Здесь есть информация о процессе sshd, который прослушивает 5555 порт.
8. Просматриваем разрешения пользователя
Команда: `sudo -l`
![](https://i.imgur.com/0oM6M4R.png)
Команда показывает, какие команды может выполнять пользователь. Также отображаются параметры среды, которые используются при выполнении этих команд. К примеру, сейчас *kali* доступны на выполнение все команды. 
9. SUID-SGID
По умолчанию запуск программ происходит с правами того, кто запустил программу. Следовательно, если пользователь не может изменять какие-то системные файлы, то и программа, которую он запустит, эти файлы поменять не сможет.
Однако для некоторых ситуаций существует обходной путь в виде SUID файлов, дающих право доступа пользователям уровнем создателя.
Посмотрим на SUIDные файлы в системе при помощи команды: `sudo find / -user root -perm -4000 -exec ls -ldb {} \; 2> /dev/null`
![](https://i.imgur.com/E0JCey3.png)
Смысл команды состоит в том, что мы ищем файлы в каталоге /, которые принадлежат пользователю root и имеют права доступа 4000 (4 - обозначение для только suid-ных файлов). При этом, как только мы найдем такой файл, нам нужно его вывести через команду `ls -ldb`, а при возникновении ошибок направить их в /dev/null (/dev/null - эквивалент "пустого устройства", весь вывод в это устройство будет проигнорирован).

#### Работа с WGET и аудит Linux через Lynis

Собирать всю эту информацию можно и автономно, к примеру, с помощью утилиты Lynis - системы аудита для Linux. Установим ее с помощью WGET - программы для загрузки файлов по сети. 
Если она еще не установлена: `sudo apt install wget`

Затем копируем ссылку для скачивания архива с Lynis - https://cisofy.com/downloads/lynis/
(понадобится сначала перейти по ссылке, затем скопировать ссылку, которая спрятана за кнопкой Download, а затем вставить ссылку как аргумент вызова wget)
![](https://i.imgur.com/A1y1WBp.png)
Wget скачивает файл в директорию, из которой вызывается, поэтому заранее следует перейти туда, где можно будет оставить скачанный архив.

Разархивируем скачанный файл с помощью команды `tar xfv lynis-3.0.6.tar.gz`, где 
+ x - извлечение файлов из архива, 
+ f - указание имени архива, 
+ v - вывод всех обрабатываемых файлов.
+ lynis-3.0.8.tar.gz - имя самого архива

![](https://i.imgur.com/PdIoyl3.png)

Теперь перейдем в директорию со скачанными файлами и посмотрим, что там скачалось
![](https://i.imgur.com/tDCGSvl.png)
В этом каталоге находится система аудита. Попробуем ее запустить командой `sudo ./lynis audit system`
![](https://i.imgur.com/nBjeXHM.png)
Продолжим, нажав *Enter*
![](https://i.imgur.com/YC5yyQX.png)
Программа начнет выдавать нам информацию состоянии системы и проводить полный аудит безопасности.
В самом конце мы получим отчет:
![](https://i.imgur.com/bgUtNuS.png)


#### Часть 3. Проверка целостности пакетов.
В аудит системы также входит проверка целостности установленных пакетов. За управление пакетами отвечает менеджер пакетов. И он делится на две части: низкоуровневая часть управляет установленными локально пакетами, высокоуровневая же строит дерево зависимостей, находит недостающие для установки пакеты в репозиториях и скачивает их в локальную базу, откуда их уже сможет инсталировать низкоуровневая часть.
К примеру, в дистрибутивах, основанных на Debian, используются в качестве низкоуровневого менеджера dpkg, а в качестве высокоуровневого apt.
Посмотрим на все установленные в системе пакеты. Команда: `dpkg -l`
![](https://i.imgur.com/Nr7Ez5G.png)
Также мы можем использовать низкоуровневый менеджер, чтобы посмотреть на основные установленные утилиты. Команда: `dpkg -L coreutils | column -x` (вторая часть команды используется для вывода списка в несколько колонок)
![](https://i.imgur.com/sp0hQ6q.png)

Для проверки целостности пакетов существует несколько способов. 
Самый простой заключается в сверке метаданных файла с эталоном: имя, вес, время создания и изменения, права доступа... Но такой способ является очень ненадежным, т.к. метаданные файла можно подделать.
Частоиспользующийся способ заключается в высчитывании hash-суммы от исходного кода пакетов и сравнение этой суммы с эталоном. Данный способ позволяет отследить изменение в исходном коде пакета, да и подделать hash-сумму достаточно сложно.
Самым безопасным считается использование цифровой подписи.

Сканирование на основе метаданных (с возможным сканированием и по hash-сумме файла, если присудствует) выполняет сама утилита dpkg черерз команду `dpkg --verify`
![](https://i.imgur.com/tWgLujr.png)

Утилита debsums проверяет md5 hash-суммы пакетов и таким образом отлавливает изменения исходного кода пакетов. Скачаем утилиту, если она еще не установлена в системе: `sudo apt install debsums`
![](https://i.imgur.com/1S6C6UW.png)
Утилита принимает в качестве аргументов флаги:
+ -a - сканирование всех файлов
+ -e - сканирование только конфигурационных файлов
+ -с - вывод измененных пакетов
+ -l - вывод пакетов, для которых не высчитана hash-сумма 
+ -s - вывод ошибок
+ -x - вывод несоответствия суммы и места обнаружения несоотвествия
+ -g - генерация суммы для файла

Попробуем провести сканирование основных пакетов пакетов на наличие изменений (подставим флаги -ac)
![](https://i.imgur.com/cQAMc9J.png)
Ошибок не обнаружено.

Попробуем эту ошибку создать. Сломаем утилиту *dir*, которая позволяет работать с каталогами также, как и утилита ls.
![](https://i.imgur.com/HEt52C5.png)
Сначала сделаем бекап утилиты
`sudo mv /bin/dir /bin/dir.bak`
![](https://i.imgur.com/H68Zcix.png)
Теперь мы не сможем использовать эту утилиту
![](https://i.imgur.com/134Oyie.png)
Также попробуем заменить файлы утилиты другой утилитой
`sudo cp /bin/false /bin/dir`
Теперь утилита *dir* отображается как *false*
![](https://i.imgur.com/YRqTX6X.png)

Используем debsums для проверки
![](https://i.imgur.com/iKK7H0I.png)
Программа сразу нашла утилиту, в которой найдена ошибка
Мы даже можем явно посмотреть на отличие hash-сумм пакетов
![](https://i.imgur.com/BtHE4qh.png)

Вернуть изменения можно с помощью команды `sudo cp /bin/dir.bak /bin/dir`
![](https://i.imgur.com/ytWqT62.png)

### Практическая работа 2.5 Переменные окружения в Linux .bashrc, .bash_profile и .bash_login

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

Переменные делятся на несколько типов, в зависимости от того, где они создаются и сколько можут жить:
+ Системные переменные. Они создаются в самом старте системы и используются программами для доступа к основным настройкам операционной системы. Они хранятся в определенных конфигурационных файлах и доступны всем пользователям и всем процессам.
+ Пользовательские перменные - переменные, которые объявляются для отдельного пользователя. Значения переменных также хранятся в конфигурационных файлах, но из-за того, что значения переменных отличаются от пользователя к пользователю, доступ к ним имеют только процессы, запускаемые от имени владельца.
+ Локальные переменыне - эти переменные создаются в рамках одной терминальной сессии. После закрытия окна терминала значения этих перменных будут утеряны.

Системные и пользовательские перменные хранятся в разных конфигурационных файлах. Перечислим пути к основным:
+ /ETC/PROFILE — один из системных файлов. Доступен для всех пользователей и всей системы даже при удаленном входе. Единственное ограничение для него — параметры не принимаются при открытии стандартного терминала, то есть в этом расположении никакие значения из этой конфигурации работать не будут.
+ /ETC/ENVIRONMENT — более широкий аналог предыдущей конфигурации. Он функционирует на системном уровне, имеет те же опции, что и предыдущий файл, но теперь без каких-либо ограничений даже при удаленном подключении.
+ /ETC/BASH.BASHRC — файл только для локального использования, при удаленной сессии или соединении через интернет функционировать он не будет. Выполняется для каждого юзера отдельно при создании новой терминальной сессии.
+ .BASHRC— относится к конкретному юзеру, хранится в его домашней директории и выполняется каждый раз при новом запуске терминала.
+ .BASHRC— относится к конкретному юзеру, хранится в его домашней директории и выполняется каждый раз при новом запуске терминала.

Просмотрим список переменных окружения. Команда: `printenv`, `env`
![](https://i.imgur.com/jyz8ZkF.png)
Также посмотрим список переменных оболочки. Команда: `set`
![](https://i.imgur.com/p1X1Xqe.png)
Переменные окружения отличаются от переменных оболочки тем, что значения переменных окружения будут видны любым дочерним оболочкам или процессам.

Все перменные строятся на основе списка строк КЛЮЧ=значение1:значение2. Написание ключа всегда происходит заглавными буквами, несколько значений переменной отделяются двоеточием. 

Основные доступные локальные переменные:
+ DE. Полное название — Desktop Environment. Содержит имя текущего окружения рабочего стола. В операционных системах на ядре Linux используются различные графические оболочки, поэтому приложениям важно понимать, какая сейчас активна. В этом и помогает переменная DE.
+ PATH - список каталогов, в которых хранятся исполняемые файлы, которые можно запустить в операционной системе
+ SHELL - описывает оболочку, которая выполняет интерпретацию всех вводимых команд
+ HOME - путь до домашнего каталога активного пользователя
+ BROWSER - содержит в себе команду для открытия браузера (если браузер по умолчанию установлен)
+ PWD и OLDPWD - отвечают за хранение директории, из которой запущен процесс. Первый параметр отвечает за текущее нахождение, а второй показывает предыдущее.
+ TERM - название активной консоли
+ EDITOR - хранит ссылку на текстовый редактор по умолчанию
+ HOSTNAME - имя компьютера
+ USER - имя пользователя
+ LANG - отвечает за используемый в системе язык
+ UID - UID текущего пользователя
+ GUID - айди группы текущего пользователя

Для создания собственных переменных окружения достаточно просто ввести имя новой переменной и поставить значение: `VAR=VALUE`
![](https://i.imgur.com/DNLA21n.png)
Теперь мы можем вывести значение переменной *VAR* с помощью команды `echo $VAR`, или посмотреть ее через команду `env`. 
![](https://i.imgur.com/2LdZF2i.png)
Однако при открытии новой оболочки получить значение этой переменной уже не удастся
![](https://i.imgur.com/SUAJtW8.png)
Если мы хотим сделать из переменной окружения переменную оболочки, то нам нужно использовать команду `export VAR=VALUE`. Теперь переменной не страшно открытие дочерней оболочки.
![](https://i.imgur.com/JHCnHBX.png)
Однако значения создаваемых переменных все еще не видны между окнами терминалов. 

Теперь рассмотрим переменные, хранящиеся в файлах, и значение которых можно поменять, изменив данные в конфигурационном файле

Из домашнего каталога вызываем просмотр файла **.bashrc** в удобном текстовом редакторе
![](https://i.imgur.com/srccKBL.png)
![](https://i.imgur.com/m73Kays.png)
Здесь хранятся определения основных функций оболочки, а также переменные пользователей. 
Перейдем на редактирование этого файла чтобы вставить свою переменную. Для изменения файл нужно открывать с правами *sudo*
![](https://i.imgur.com/ntVzKSf.png)
После замены нужно обновить конфигурации через команду `source .bashrc`
![](https://i.imgur.com/cKPSh44.png)
*Примечание для Kali Linux: здесь используется другая оболочка: **zsh**, ее конфигурационный файл имеет вид `.zshrc`. Если нужно поменять переменные окружения именно для zsh, использовать нужно другой файл, ни в коем случае не применять для обновления конфигураций файл для оболочки bash.*

Удаление созданных переменных происходит либо через удаление строки в файле, либо через закомментирование ненунжной переменной.

Теперь займемся изменением системных переменных. Системные переменные хранятся по пути `/etc/profile`

Используем действия, которые выполнялись для изменения `.bashrc` для изменения данных в файле `/etc/profile`
![](https://i.imgur.com/OsqXSfk.png)
Внесем новую переменную
![](https://i.imgur.com/lA2T1Nr.png)
И сохраним изменения через `source /etc/profile`
![](https://i.imgur.com/MuSe0Jq.png)
Теперь мы сможем увидеть значение созданной переменной даже в другом пользователе
![](https://i.imgur.com/qx4C2Fw.png)


















































