---
# System prepended metadata

title: 'Знакомство с  Linux. Часть третья. Процессы, пользователи, группы, права доступа. '
tags: [ОП.01]

---


### Тема: Знакомство с командной строкой в Linux. 
##### Цель работы: Научиться: работать в командной строке.
##### Необходимые материалы: Пк с доступом в интернет. Виртуальные машины с Linux Debian и Ubuntu.  

## Теоретическая часть
Видео формат теоретического материала:
1. [Работа с процессами](https://youtu.be/Y4W_rJStNSA?si=dkrPib5NUN3dQ5Vl).
2. [Приорететы процессов](https://youtu.be/4GovHRq6S7g?si=xuRD7EnyU4uKaxgB).
3. [Владельцы файлов и папок](https://youtu.be/uKZDV8TsXGQ?si=drF82nlKdDCMOlQv).
4. [Права доступа к файлам](https://youtu.be/PNBs3RowwGc?si=HmTwwxoyqOSfrBVe).
5. [Сведения о пользователях и группах](https://youtu.be/zmHZhymnGss?si=I5LdaiaK0vmchePd).
6. [Управление пользователями 1](https://youtu.be/r3BtzR24GsI?si=-_tlIjlSix_MG2BG).
7. [Управление пользователями 2](https://youtu.be/yeJJ-6PJZwI?si=Oilv0L7rmVfjA96A).
:::info
Рекомендуеться к просмотру!
:::
### Управление процессами в Linux
**Студент должен уметь создавать, отслеживать и завершать процессы**

:::success
Linux содержит в себе множество инструментов для управления запущенными процессами: от сортировки, отслеживания состояния и загрузки системы до перевода процессов в фоновый режим и обратно.
:::
PID обозначает идентификационный номер процесса, который обычно используется большинством ядер операционной системы, таких как Linux, Unix, macOS и Windows.

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

Процесс – это исполняемый экземпляр программы.

Каждый раз, идентификатор процесса будет получать изменения ко всем процессам, кроме init, поскольку init всегда является первым процессом в системе и является предком всех других процессов. Это PID – 1.
Максимальное значение PID по умолчанию – 32 768.
Для проверки у себя выполните команду:
```
cat /proc/sys/kernel/pid_max
```

В 32-битных системах 32768 является максимальным значением, но мы можем установить любое значение до 2 ^ 22 (приблизительно 4 миллиона) в 64-битных системах.
Вы можете спросить, почему нам нужно такое количество PID? потому что мы не можем повторно использовать PID сразу. Также во избежание возможных ошибок.

Посмотреть запущенные процессы в текущей консоли можно при помощи команды **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`**:

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

Для того чтобы изменить владельцов файла используеться утилита **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** в качестве основной группы пользователя. Однако если пользователь является членом нескольких групп, он может изменить эффективную основную группу.

Для задания прав на файл может использоваться символьное обозначение:

![image alt](https://i.imgur.com/fHwWUVH.png)

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

![image alt](https://i.imgur.com/1OLWBXj.png)

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

Это выглядит следующим образом: 

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

Для того чтобы менять права на файл используеться команда **chmod** примеры:
```bash!
chmod u+rwx g+x o-rwx 1.txt # Добавит пользователю файла права на (чтение запись выполнение), группе файла добавит права на выполнение и всем остальным запретит доступ к файлу в любом виде. 
chmod 710 1.txt # Заменит текущие права на полный доступ к файлу пользователю файла, заменит права группе на только выполнение и остальным полностью запретит выполнять какие-либо операции с файлом. 
```

## Практическая часть
### Работа с процессами.
1. Выполните команду `top` опишите что она делает. Выполните команду `htop`, если утилиты нету установите. 
2. Выведите все процессы в системе запущенные от всех пользователей.
3. Отобразите процессы запущенные от пользователя root.
4. Запустите задачу `sleep 120` в фоновом режиме. 
5. Используя утилиту `top` найдите **PID** процесса `sleep` и убейте процесс. 
6. Создайте 3 терминала с помощью screen, в одном из терминалов выполните команду history. Во втором терминале выполните любые 3 команды. В третьем терминале еще раз выполните history. Сделайте вывод. Выйдите из виртуальных терминалов. Закройте созданные терминалы. 
### Работа с пользователями и группами.
7. Созайте нового пользователя name_N (где name - ваше имя, а N номер по журналу). Оболочкой командной строки должен быть bash у пользователя должен быть задан пароль 123, также у пользователя долже быть домашний каталог в директории /home с названием test_user. 
8. Создайте группу test_users. 
9. Добавьте раннее созданного пользователя в группу test_users. 
10. Перейдите в директорию созданного пользователя (при необходимости создайте ее). Скопируйте в эту директорию файл любого лога c именем `.secret.log`. Залогиньтесь в системе под созданным ранее пользователем. Перейдите в домашний католог этого пользователя. Создайте файл `hellow.txt`. Сравните права и владельцев обоих файлов. 
11. Измените владельца файла `.secret.log` на ранее созданного пользователя.
12. Измените права доступа на файлы находящиеся в домашней директории ранее созданого пользователя так чтобы их мог прочитать и изменить любой пользователь в системе. 
13. Создайте двух новых пользователей (как в 7 пункте), имена пользователям выбирете любые + номер по журналу. Имена домашних каталогов этих пользователей должны соответсвовать их именам. 
14. Создайте группу programers. И добавьте ранее созданных пользователей в нее. 
15. Зайдите под root пользователя. Создайте директорию `programers` в директории `/home`, перейдите в нее, создайте файл: `main_project.sh` запишите туда код:
```bash=
#!/bin/bash
echo Hellow bash scripts!
``` 
>Измените группу которой пренадлежит файл на группу programers, в качестве пользователя файла должен быть указан root. Измените права таким образом чтобы root пользователь мог только исполнять скрипт, а пользователи группы programers могли изменять, читать и выполнять его. Остальным пользователям разрешите только чтение файла.
16. Запустите созданный скрипт командой `./main_project.sh` или `bash main_project.sh`. Попробуйте вывести содержимое файла командой cat. После попробуйте открыть файл.  
17. Перейдите под пользователя созданного в 7 пункте, попробуйте запустить скрипт что вышло? Обьясните. Выведите содержимое файла скрипта командой nl. 
18. Перейдите под одного из пользователей группы programers. Запустите скрипт. Измените скрипт добавив в него строку `echo i am guru Linux Amdmin!`. Запустите скрипт повторно. 

## Контрольные вопросы 
**1. Какие есть аналоги диспетчера задач в Linux?
2. Какой командой можно вывести список процессов? Какой командой можно убить процесс? Что такое PID?
3. Как изменить права на файл? Какие права бывают? На какие сущности задаються права? 
4. Как изменить владельца файла? Кто может быть владельцем файла? 
5. Как создать пользователя?
6. Как создать группу?
7. Как изменить параметры пользователя?
8. Что такое UID и GID?
9. Как изменить пароль пользователю?
10. Как запустить bash скрипт?**