# Linux (с курса Игоря Литвина)
## Команды общего назначения
### ls
Вывод содержимого директории
Ключи:
- -a: вывести все включая скрытые файлы
- -A: то же, что и -a, но без вывода . и . .
- -l: подробный вывод (права доступа, жесткая ссылка на файл, владелец, группа, размер в байтах, дата изменения, имя)
- -s: выводит размеры файлов
- -S: сортирует по размеру, от большего к меньему
- -h, используемый вместе с -l или -s представляет размеры файлов в виде мб/гб, т.е. человекочитаемом
- -d: выводит только директории без их содержимого
- -R: рекурсия, выводит директории и их содержимое, а также содержимое директорий внутри них
- -i: выводит значения inode
### mkdir
Создание директории. Если не указывать путь, то директория создатся внутри текущей.
```bash=
$ mkdir test
$ mkdir /home/test
```
По дефолту директория создатся, если путь к ней существует. Если нужно создать несколько директорий, указанных в пути, нужно указать опцию -p
```bash=
$ mkdir -p easy/as/pie
```
### touch
touch обновляет mtime у указанного файла. Если файла не существует, он создается. В основном эта команда как раз для этого и используется.
### echo
Выводит в поток то, что подается на вход команде. Часто используется с перенаправлениями:
```bash=
$ echo “Hello World!” > copyme
$ cat copyme
Hello World!
```
### mv
Перемещение файлов.
```bash=
$ mv /var/tmp/myfile.txt /home/drobbins
```
Часто используется для переименования файлов:
```bash=
$ mv copiedme movedme
$ ls -i movedme
648284 movedme
```
Также можно перемещать несколько файлов в одну директорию за раз:
```bash=
$ mv /var/tmp/myfile1.txt /var/tmp/myarticle3.txt /home/drobbins
```
### ln
Создание ссылок. Без аргументов создаст жесткую сслыку:
```bash=
$ cd /tmp
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
15782 firstlink 15782 secondlink
```
С аргументом -s создаст символьную ссылку:
```bash=
$ ln -s secondlink thirdlink
$ ls -l firstlink secondlink thirdlink
-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 firstlink
-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 secondlink
lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:39 thirdlink -> secondlink
```
### rm
Удаление файлов. Аргументы:
* -r: рекурсивное удаление, удаляет все вложенные директории с вложенными файлами
* -f: не возвращать код ошибочного завершения, если ошибки были вызваны несуществующими файлами; не запрашивать подтверждения операций.
* --no-preserve-root: если в качестве директории для удаления задан корневой раздел /, то считать, что это обычная директория и начать выполнять удаление.
```bash=
$ echo 'Вам пиздец'
$ sudo rm -rf --no-preserve-root /*
```
### which
Все программы, которые вызываются командой, должны находить в PATH переменной окружения. Проверить, находится ли там команда, можно с помощью which:
```bash=
$ which sudo
/usr/bin/sudo
```
### find
Параметры:
-P - никогда не открывать символические ссылки.
-L - получает информацию о файлах по символическим ссылкам. Важно для дальнейшей обработки, чтобы обрабатывалась не ссылка, а сам файл.
-maxdepth - максимальная глубина поиска по подкаталогам, для поиска только в текущем каталоге установите 1.
-depth - искать сначала в текущем каталоге, а потом в подкаталогах.
-mount искать файлы только в этой файловой системе.
-version - показать версию утилиты find.
-print - выводить полные имена файлов.
-type f - искать только файлы.
-type d - поиск папки в Linux.
Критерии поиска:
-name - поиск файлов по имени.
-perm - поиск файлов в Linux по режиму доступа.
-user - поиск файлов по владельцу.
-group - поиск по группе.
-mtime - поиск по времени модификации файла.
-atime - поиск файлов по дате последнего чтения.
-nogroup - поиск файлов, не принадлежащих ни одной группе.
-nouser - поиск файлов без владельцев.
-newer - найти файлы новее чем указанный.
-size - поиск файлов в Linux по их размеру.
Программа для поиска файлов в директории(ях).
* -iname: игнорирование регистра
```bash=
$ find /usr/share/doc -iname readme\*
```
* -regex: поиск по регулярке
* -igerex: поиск с игнорированием результатов регулярки
* -type: искать файлы опр. типа. Возможные аргументы для -type это: b (блочное устройство), c (символьное устройство), d (директория), p (именованый канал), f (обычный файл), l (символическая ссылка), и s (сокет).
* -mtime: поиск файлов по дате последнего изменения.
Поиск файлов, измененных в посл. 24 часа:
```bash=
$ find . -name \? -mtime -1
./a
```
Или файлы которые были изменены до текущего 24-часового периода:
```bash=
$ find . -name \? -mtime +0
./b
./c
./d
```
* -size: поиск файлов по их размеру. По умолчанию, аргумент -size это количество 512-байтных блоков, но добавляя к опции суффикс, можно сделать вывод более понятным. Доступные суффиксы: b (512-байтные блоки), c (байт), k (килобайт), и w (2-байтные слова). Дополнительно, перед аргументом можно указать плюс («больше чем») или минус («меньше чем»).
Например, для поиска обычного файла в /usr/bin размер которого меньше 50 байт:
```bash=
$ find /usr/bin -type f -size -50c
/usr/bin/krdb
/usr/bin/run-nautilus
/usr/bin/sgmlwhich
/usr/bin/muttbug
```
* -exec: исполняет указанные действия над найденнымим файлами. Принимает строку команд, оканчивающуюся на **;**, и заменяет все вхождения **{}** именем файла.
```bash=
$ find /usr/bin -type f -size -50c -exec ls -l '{}' ';'
-rwxr-xr-x 1 root root 27 Oct 28 07:13 /usr/bin/krdb
-rwxr-xr-x 1 root root 35 Nov 28 18:26 /usr/bin/run-nautilus
-rwxr-xr-x 1 root root 25 Oct 21 17:51 /usr/bin/sgmlwhich
-rwxr-xr-x 1 root root 26 Sep 26 08:00 /usr/bin/muttbug
```
### grep
Команда фильтрации вывода или поиска внутри файлов по заданному шаблону.
-c - подсчитать количество вхождений шаблона;
-h - не выводить имя файла в результатах поиска внутри файлов Linux;
-i - не учитывать регистр;
-l - отобразить только имена файлов, в которых найден шаблон;
-n - показывать номер строки в файле;
-s - не показывать сообщения об ошибках;
-v - инвертировать поиск, выдавать все строки кроме тех, что содержат шаблон;
-w - искать шаблон как слово, окружённое пробелами;
-e - использовать регулярные выражения при поиске;
-An - показать вхождение и n строк до него;
-Bn - показать вхождение и n строк после него;
-Cn - показать n строк до и после вхождения;
## Манипуляции с процессами
### fg и bg
Если процесс, запущенный из терминала был остановлен с помощью Ctrl+Z, то его можно "растормошить" командой fg или bg. fg продолжит процесс на переднем плане, а bg - в фоне.
### jobs
Выводит все процессы, запущенные из текущего терминала, в т.ч. фоновые, запущенные с &
```bash=
arkom@arkomDebian:~$ jobs
[1]- Running xeyes -center red &
[2]+ Running xeyes -center blue &
```
### ps
Выводит процессы, запущенные в системе.
* a, -A, -e: выводит все процессы в системе
* -d, g: выбрать все процессы, даже фоновые, кроме процессов сессий
* -С: выбирать процессы по имени команды
* -G: выбрать процессы по ID группы
* -t, t: выбрать процессы по tty
* -u, U - выбрать процессы пользователя.
### kill
Посылает сигнал завершения процесса. Один из:
- SIGINT - самый безобидный сигнал завершения, означает Interrupt. Он отправляется процессу, запущенному из терминала с помощью сочетания клавиш Ctrl+C. Процесс правильно завершает все свои действия и возвращает управление;
- SIGQUIT - это еще один сигнал, который отправляется с помощью сочетания клавиш, программе, запущенной в терминале. Он сообщает ей что нужно завершиться и программа может выполнить корректное завершение или проигнорировать сигнал. В отличие от предыдущего, она генерирует дамп памяти. Сочетание клавиш Ctrl+/;
- SIGHUP - сообщает процессу, что соединение с управляющим терминалом разорвано, отправляется, в основном, системой при разрыве соединения с интернетом;
- SIGTERM - немедленно завершает процесс, но обрабатывается программой, поэтому позволяет ей завершить дочерние процессы и освободить все ресурсы;
- SIGKILL - тоже немедленно завершает процесс, но, в отличие от предыдущего варианта, он не передается самому процессу, а обрабатывается ядром. Поэтому ресурсы и дочерние процессы остаются запущенными.
По умолчанию kill отправляет SIGTERM. Чтобы указать сигнал используется -s.
Опции форматирования:
- -с: отображать информацию планировщика;
- -f: вывести максимум доступных данных, например, количество потоков;
- -F: аналогично -f, только выводит ещё больше данных;
- -l: длинный формат вывода;
- -j, j: вывести процессы в стиле Jobs, минимум информации;
- -M, Z: добавить информацию о безопасности;
- -o, o: позволяет определить свой формат вывода;
- --sort, k: выполнять сортировку по указанной колонке;
- -L, H: отображать потоки процессов в колонках LWP и NLWP;
- -m, m: вывести потоки после процесса;
- -V, V: вывести информацию о версии;
- -H: отображать дерево процессов;
## Манипуляции с правами, пользователями и группами
### chown и chgroup
Изменение владельца и группы файла/папки
```bash=
chown root /etc/passwd
chgrp wheel /etc/passwd
```
### chmod
Изменение прав файла/директории. Исп. из под рута. Синтаксис
```bash=100
chmod опции права /путь/к/файлу
```
Синтаксис настройки прав:
0 - никаких прав;
1 - только выполнение;
2 - только запись;
3 - выполнение и запись;
4 - только чтение;
5 - чтение и выполнение;
6 - чтение и запись;
7 - чтение запись и выполнение.
744 - разрешить все для владельца, а остальным только чтение;
755 - все для владельца, остальным только чтение и выполнение;
764 - все для владельца, чтение и запись для группы, и только чтение для остальных;
777 - всем разрешено все.
Также c помощью chmod можно менять биты suid и guid у файлов.
suid - 1 в начале
guid - 2 в начале
sticky - 4 в начале
```bash=
chmod 4555 file.extension
```
Каждый пользователь имеет право читать и запускать на выполнение с правами владельца файла
### useradd
Создание пользователя (записи в /etc/passwd)
-b - базовый каталог для размещения домашнего каталога пользователя, по умолчанию /home;
-c - комментарий к учетной записи;
-d - домашний каталог, в котором будут размещаться файлы пользователя;
-e - дата, когда учетная запись пользователя будет заблокирована, в формате ГГГГ-ММ-ДД;
-f - заблокировать учетную запись сразу после создания;
-g - основная группа пользователя;
-G - список дополнительных групп;
-k - каталог с шаблонами конфигурационных файлов;
-l - не сохранять информацию о входах пользователя в lastlog и faillog;
-m - создавать домашний каталог пользователя, если он не существует;
-M - не создавать домашнюю папку;
-N - не создавать группу с именем пользователя;
-o - разрешить создание пользователя linux с неуникальным идентификатором UID;
-p - задать пароль пользователя;
-r - создать системного пользователя, не имеет оболочки входа, без домашней директории и с идентификатором до SYS_UID_MAX;
-s - командная оболочка для пользователя;
-u - идентификатор для пользователя;
-D - отобразить параметры, которые используются по умолчанию для создания пользователя. Если вместе с этой опцией задать еще какой-либо параметр, то его значение по умолчанию будет переопределено.
Общий шаблон:
```bash=
useradd -m -d /home/username -G group1,group2 -s /bin/bash username
```
Создаст пользователя с домашней папкой /home/username, оболочкой bash, группами group1,group2 и с именем username
### userdel
Удаляет пользака по имени
### usermod
Изменяет пользака, а именно его группы
-G - дополнительные группы для пользователя;
-a - добавить пользователя в дополнительные группы из параметра -G, а не заменять им текущее значение;
-g - установить новую основную группу для пользователя, такая группа уже должна существовать, и все файлы в домашнем каталоге теперь будут принадлежать именно этой группе.
### groupadd/groupdel/groupmod
Аналогичны командам user*
-f - если группа уже существует, то утилита возвращает положительный результат операции;
-g - установить значение идентификатора группы GID вручную;
-K - изменить параметры по умолчанию автоматической генерации GID;
-o - разрешить добавление группы с неуникальным GID;
-p - задаёт пароль для группы;
-r - указывает, что группа системная;
-R - позволяет изменить корневой каталог.
## Файловые системы
### \(c\)fdisk
НЕ юзать fdisk, тк есть cfdisk с гуёй, в которой все понятно
### mkfs
Создание файловой системы на разделе
```bash=
mkfs.[fs type] [target device]
```
btrfs rules!
### mkswap и swapon
Инициализация раздела подкачки и его включение
### mount
Монтирование файловой системы
```bash=
mount /dev/hda1 /mnt/boot
```
Нужно указывать, в какую папку будет монтироваться раздел. Если вызывать команду mount без аргументов, то выведется информация о всех примонтированных разделах
## Мониторинг информации о системе и ресурсах
### uname
Базовая информация о ядре и системе
| тип информации | аргумент | пример |
|----------------------|----------|-----------------------------------|
| имя ядра | -s | "Linux" |
| имя хоста | -n | "inventor" |
| релиз ядра | -r | "2.4.20-gaming-r1" |
| версия ядра | -v | "#1 Fri Apr 11 18:33:35 MDT 2003" |
| архитектура | -m | "i686" |
| процессор | -p | "AMD Athlon(tm) XP 2100+" |
| платформа | -i | "AuthenticAMD" |
| операционная система | -o | "GNU/Linux" |
### uptime
Вывод времени с момента включения машины
### ip neigh
Показывает с какими компьютерами происходит обмен данными
### ss
sudo ss -tlnp - показывает какие сервисы и с какими портами запущены
### sudo с аргументами
sudo -l - позволяет нам понять, что есть в этом машинки и что пользователь может
### df
Свободное место на дисках.
- -a, --all - отобразить все файловые системы, в том числе виртуальные, псевдо и недоступные;
- -B - изменить размер одного блока перед выводом данных, например, можно использовать BM, чтобы вывести все данные в мегабайтах;
- -h - выводить размеры в читаемом виде, в мегабайтах или гигабайтах;
- -H - выводить все размеры в гигабайтах;
- -i - выводить информацию об inode;
- -k - выводить размеры в килобайтах;
- --output - использовать специальный формат вывода, если не задано, выводит все поля. Доступны такие варианты: 'source', 'fstype', 'itotal', 'iused', 'iavail', 'ipcent', 'size', 'used', 'avail', 'pcent', 'file' и 'target';
- -P - использовать формат вывода POSIX;
- --total - выводить всю информацию про использованное и доступное место;
- -t, --type - выводить информацию только про указанные файловые системы;
- -x - выводить информацию обо всех, кроме указанных файловых систем;