## Краткая история Linux
- 1991 г. - эмулятор терминала
- 1991 г. - первые дистрибутивы
- 1994 г. - Linux 1.0 GUI
- 1996 г. - Linux 2.0, конкуренция с коммерческими UNIX
- 1996 г. - появление талисмана Tax - "(T)orvalds (U)ni(X)"
- 1998 г. - IBM и Oracle объявляют о поддержке Linux
## Генеалогия Linux
![Генеалогия Linux](../Pictures/09_01.%20Генеалогия%20Linux.png)  
#### Дистрибутивы Linux
![Дистрибутивы Linux](../Pictures/09_02.%20Дистрибутивы%20Linux.png)
## 2 принципиальных критерия дистрибутивов Linux
Способы распространения ПО - src vs bin  
- Gentoo - распространяется в исходных кодах
- Ubuntu - распространяется через бинарные пакеты
  
Политика обновления - стабильность vs актуальность
- Archlinux - предоставляет последние версии ПО
- Red Hat Enterprise Linux - "лучшие" версии остаются неизменными на протяжении цикла поддержки
## Архитектура Linux
![Архитектура Linux](../Pictures/09_03.%20Архитектура%20Linux.png)  
Ядро Linux представляет собой единый блок бинарного кода. Все коды ядра и структуры данных, в том числе драйверы устройств, коды распределения ресурсов и виртуальной памяти, сетевой поддержки, а также файловая система - хранятся в едином адресном пространстве. Преимуществом такой структуры является то, что не требуется никаких переключений при запросах процессами системных ресурсов или прерываниях от различных устройств.  
Общее адресное пространство, однако, не препятствует модульности системы. По мере необходимости Linux подгружает в память либо выгружает их нее указанные модули.  
В Linux все ядро работает в привилегированном режиме - режиме ядра. Никакая часть кода не работает в режиме пользователя. Фрагменты поддержки ОС, не требующие запуска в режиме ядра, помещаются в раздел системных библиотек.
## Стандартные каталоги Linux
- `/etc` - конфигурационные файлы
- `/home` - каталог для размещения "домашних" каталогов пользователей
- `/usr` - основной каталог, содержащий программы, библиотеки, файлы документации и т. д.
- `/var` - каталог для данных большого и часто меняющегося размера - лог-файлов, баз данных, временных файлов печати и почты и т. д.
- `/tmp` - каталог для временных файлов
- `/dev` - файлы физических устройств
## Командная строка Linux
- Минимализм
- Автоматизируемость
- Расширяемость
  
![Командная строка Linux](../Pictures/09_04.%20Командная%20строка%20Linux.png)
## Командные оболочки Linux
**Командная оболочка** или **Командный интерпретатор** - это приложение, предоставляющее пользователю интерфейс командной строки, в которой тот либо вводит команды по отдельности, либо запускает скрипты, состоящие из списка команд. Устно и в неофициальных текстах часто называется "**шел**", от английского **shell** - оболочка.
- Клоны Bourne shell (bash, zsh)
- С shell (csh, tcsh)
- Базирующиеся на популярных языках программирования (psh, ipython, scsh)
- Экзотические, специфические и все остальные
#### Bourne shell
Исполняемый файл: `.sh`. Командная оболочка, названная в честь своего создателя Стивена Борна. Большая часть операторов была заимствована им из языка Алгол 68. Вышла в 7-м издании операционной системы UNIX, где была оболочкой по умолчанию.
#### Bourne again shell
Исполняемый файл: `.bash`. Название можно перевести, как "Возрожденный шел Борна". Скорее всего самая популярная оболочка на сегодняшний день. Де-факто стандарт для Linux.
#### Z shell
Исполняемый файл: `.zsh`. Свободная современная sh-совместимая оболочка. Имеет ряд преимуществ перед bash, касающихся в основном работы в интерактивном режиме
#### C shell
Исполняемый файл: `.csh`. За основу для скриптового языка csh был взят язык C.
#### IPython
Интерактивная оболочка для языка программирования Python
## Некоторые команды bash
- `man` - выводит руководство пользователя (справку) по команде
- `pwd` - выводит сведения о рабочей директории
- `is` - выводит содержимое директории
- `ps` - позволяет просматривать сведения о работающих процессах
- `cd` - изменение рабочей директории
- `touch` - создание файла
- `mkdir` - создание директории
- `cp` - копирование файла
- `mv` - перемещение или удаление файла
- `in` - создание ссылки
- `<` - перенаправление `stdin` 
- `>` - перенаправление `stdout`
- `head` - чтение начала файла
- `tail` - чтение конца файла
- `cat` - чтение файла и вывод его содержимого на экран или конкатенация файлов
- `rm` - удаление файла
- `kill` - удаление файла
- `grep` - поиск информации
- `ag` - продвинутая команда для поиска
## Скрипты bash
**Bash-скрипт** (от англ. script - сценарий) - это последовательность команд, которые по очереди считывает и выполняет интерпретатор.  
Обычно оформляются в файлы с расширением `.sh`. Например, `myscript.sh`.  
Пример:
```bash
#I/bin/bash
# Демонстрационный скрипт
# demo_user 01/01/2023
echo Список файлов в текущем каталоге:
Is
```
- `!/` - шебанг
- `#` - комментарий
- `echo` - вывод сообщения
  
Запуск:
```bash
user@bash: ./myscript.sh
```
Разрешение:  
К какому файлу будет обращаться пользователь, решает 2 фактора в Linux:
- Владение файлами: пользователь, группа, другие
- Разрешение файла: чтение, запись, выполнение
## Пользователи и группы
Параметры пользователя:
- Логин
- Пароль - не обязателен
- `uid`
- `gid`
- Имя, комментарий - не обязательны
- Домашняя директория
- Интерпретатор
- Группа
- Членство в группах
## Права доступа к файлам и каталогам
- Владелец файла и его группа
- Стандартная восьмеричная маска доступа
- `chmod 666` - изменение прав доступа к файлам и каталогам
  
![Права доступа к файлам и каталогам](../Pictures/09_05.%20Права%20доступа%20к%20файлам%20и%20каталогам.png)
```bash
user@bash: Is -I myscript.sh
rwxr-xr-x 1 demo_user users 2 Jan 01 2023 myscript.sh
```
## Привилегии пользователей
Виды пользователей:
- Привилегированный пользователь `root`
- Локальный пользователь - непривилегированный
- Системный пользователь - учетные записи, автоматически создаваемые системой для работы внутренних процессов и служб
  
- `useradd` - создание пользователя
- `passwd` - создание пароля
  
Команды `su` и `sudo`.  
Где и как хранится пароль?
- `etc/passwd`
- `etc/shadow`