## Основные команды для администрирования Linux

### Настройка сервера
- `groups username` - группы пользователя
- `addgroup <groupname>` - добавить группу
- `adduser <username>`- добавить пользователя 
- `usermod -aG <groupname> <username>` - добавить пользователя в группу без удаления его из других групп
- `su -`:  если добавить - (или --login), это переключит вас на пользователя root и загрузит окружение (все переменные окружения будут инициализированы для пользователя root), как если бы вы вошли в систему как root
- `lsb_release -a` или `hostnamectl` - версия ОС (и не только)


### Пакетный менеджер (apt)
- `apt remove --purge <packege_name>` или `apt purge <packege_name>` - удаляет сам пакет и все связанные с ним конфиги
- `apr remove <packege_name>` - удаляет пакет
- `apt autoremove` - используется для удаления пакетов, которые были автоматически установлены в качестве зависимостей для других пакетов, но больше не нужны
- `apt update` - скачивает список пакетов и их версий с серверов репозиториев, но **не устанавливает и не обновляет пакеты**.
- `apt upgrade` - обновляет все установленные пакеты до последних доступных версий, основываясь на информации, полученной с помощью `apt update`, однако эта команда не устанавливает новые пакеты или не удаляет старые. Если для обновления пакета требуются новые зависимости, они не будут установлены.
- `apt full-upgrade` - не только обновляет пакеты, но и может устанавливать новые зависимости и удалять старые пакеты, если это необходимо для завершения обновления
- `sudp apt install <packege_name>` - устанавливает пакет
- `supo apt search <packege_name>` - поиск пакета по имени
- `apt show <packege_name>` - инфо о пакете
- `apt autoclean` - для удаления старых неиспользуемых файлов
- `apt clean` - APT хранит загруженные .deb файлы в кэше на диске, чтобы очистить этот кэш. Эта команда удаляет все файлы в dir `/var/cache/apt/archives/`
- `/etc/apt/sources.list` - основной файл, где перечислены все репозитории. Этот файл указывает, откуда APT будет загружать пакеты.
- `/etc/apt/sources.list.d/` - в этот каталог можно добавлять дополнительные файлы для подключения новых репозиториев.
> Есть ещё `apt-get`, но это более старая команда, которая в основном используется для скриптов, потому что не предусматривает интерактивную работу с системой

!!! note "Про apt" 
    apt работает поверх более низкоуровневого инструмента `dpkg`, который непосредственно устанавливает `.deb` пакеты. 
- `dpkg -i package_name.deb` - для установки `.deb` пакета
- `apt --fix-broken install` - если возникли проблемы с зависимостями


### Пакетный менеджер (dnf, rpm)
- `dnf install https://example.com/package-file.rpm` - установка rpm пакета напрямую из ссылки
- `dnf install <packege_name>` - устанавливает пакет из репозитория
- `dnf remove <packege_name>` - удаляет пакет
- `dnf upgrade` - обновляет систему
- `dnf search <packege_name>` - поиск пакета

- `rpm -ivh <package_name>.rpm` - установка rpm пакета
- `rpm -e <package_name>.rpm` - удаления пакета
- `rpm -Uvh <package_name>.rpm` - обновление пакета, если он не установленЮ он установится
- `rpm -qi <package_name>` - просмотр информации о пакете
- `rpm -V <package_name>` - проверка целостности пакета
- `rpm -ql <package_name>` - список файлов в пакете
- `dnf install <package_name>.rpm` - установка rpm пакета через dnf, dnf будет управлять зависимостями

!!! tip "Лучше использовать высокоуровневый пакетный менеджер (apt, dnf)"
    Высокоуровневые пакетные менеджеры (например, dnf, apt) удобнее и безопаснее, поскольку автоматически управляют зависимостями, работают с репозиториями, проверяют конфликты и целостность пакетов, одним словом, упрощают обновление ПО. При работе с rpm, dpkg требуется самостоятельная работа с зависимостями и есть вероятность накосячить с установкой, а если ПО требует дополнительные библиотеки, их придётся ставить отдельно.


### Сеть
- `ifconfig` - сетевые интерфейсы + статистика
- `ping` - проверка доступности хоста 
- `traceroute` - путь пакетов от сервера к серверу (промежуточные маршрутизаторы) (`mtr` покажет путь в лайве)
- `nslookup`, `dig @<dns-server> <dns-name>` - инфа о DNS сервере
- `cat /etc/ssh/sshd_config | grep Port` - показывает на каком порту открыт ssh
- `ss -tulpn` - информация о текущих сетевых соединениях и портах
- `curl ifconfig.me` - узнать публичный ip машины
- `curl -Lv domain.ru` - получить html страницу (`v` - подробный вывод, `L` - разрешает редиректы)
- `curl -v telnet://127.0.0.1:22` - доступность порта 
- `tcpdump -i any port 9100 -nn` - пакеты через порт 
- `iptables -L` - правила файрвола (показывает все цепочки (chains) и правила для них)
    - `iptables -L -v` - подробный вывод
    - `iptables -L --line-numbers`
    - `iptables -L -t nat` - позволяет указать конкретную таблицу для просмотра. Например, для просмотра правил NAT
??? tip "`ufw` - удобная надстройка над iptables" 
    Чаще используют в Ubuntu и Debian
    ```bash
    # Включаем фаерволл
    sudo ufw enable
    # Отключить фаерволл
    sudo ufw disable
    # Перезагрузить
    ufw reload

    # Не пускать входящий трафик
    ufw default deny incoming
    # Пускать исходящий
    ufw default allow outgoing

    # Разрешить доступ ко всем портам с определённого IP-адреса
    ufw allow from <IPv4>
    # Разрешить доступ к порту
    ufw allow <port>
    # Разрешить доступ к порту с определённого IP-адреса
    sudo ufw allow from <IPv4> to any port <port>
    # Чтобы запретить - deny вместо allow

    # Показать состояние ufw и активные правила
    ufw status verbose
    # Показать правила с нумерацией
    ufw status numbered
    # Удалить правило по номеру
    ufw delete <number>
    
    # Интерфейсы
    sudo ufw allow in on eth0
    sudo ufw allow out on eth0

    # Удалить правило (будут применены настройки по умолчанию)
    ufw delete allow <port>/<protocol> # удалить разрешение
    ufw delete deny <port>/<protocol> # удалить запрет

    # Сброс всех правил
    sudo ufw reset

    # Логи ufw
    sudo tail -f -n 100 /var/log/ufw.log
    # Изменить уровень логирования
    sudo ufw logging <low/medium/high>

    # Разрешить доступ к порту с определённого ip
    sudo ufw allow from <IPv4> to any port <port>

    # Пресеты
    # Вывести список пресетов
    sudo ufw app list

    # Открыть все соединения, которые нужны Nginx
    sudo ufw allow "Nginx Full"
    # Удалить правило для пресета
    sudo ufw delete allow "Nginx Full"
    ```
    
- `iperf3` - для измерения скорости передачи данных
- `speedtest-cli` - спидтест
    - `speedtest-cli --list` - список серверов
    - `speedtest-cli --server SERVER_ID`
- `fuser 9095/tcp` - проверить доступность порта 
- `ethtool enp0s3` - диагностика сетевого интерфейса на физическом уровне (`ethtool enp0s3` - статистика)
- `arp -a` - arp таблица (ip -> mac)
- `ip route` - таблица маршрутизации
- `resolvectl status` - инфо о днс
- `cat /etc/resolv.conf` - инфо о днс
- `ip -4 route get 8.8.8.8` - используется для отображения маршрута, который система выберет для достижения указанного ip (какой интерфейс будет использован, через какой шлюз пойдёт трафик и с какого ip)


### База
- `cp -p` - сохранить атрибуты файлов (время создания, права, владельца)
- `cp -v` - выводить информацию о каждом копируемом файле
- `mv -v` - подробный вывод при перемещении.
- `chmod 644 /etc/passwd` - изменение прав доступа к файлам и директориям
- `chown root:root /etc/hosts` - изменение владельца и группы
- `ps -aux` - выводит список всех процессов с информацией о пользователях, загрузке, времени и командах
- `ps -ef` - полная информация о процессах с идентификаторами владельцев
- `pstree` - дерево процессов
- `ps aux --sort=-%mem | head -n 10` - первые 10 процессов по потреблению памяти
- `kill -9 1234` - принудительное завершене процесса (1234 — PID процесса)
- `top -o %CPU` - сортировка процессов по указанному полю (например, по CPU)
    - `shift + v` в top - процессы в древовидной структуре с отображением дочерних процессов
    - `1` - нагрузка на поток (логическое ядро)
- `useradd -m username` - добавление нового пользователя (`-m` - создание домашнего каталога)
- `passwd username` -  установка или изменение пароля пользователя
- `usermod -aG username` - добавить пользователя в группу `sudo`
- `groupadd developers` - создание новой группы
---
- `ifconfig` - информация о сетевых интерфейсах
- `ss -tulpn` - информация о сетевых соединениях
- `ping` - проверка доступности хоста 
- `traceroute` - через какие маршрутизаторы проходит пакет до хоста 
- `nslookup`, `dig @<dns-server> <dns-name>` - инфа о DNS сервере
- `curl -Lv domain.ru` - получить html страницу
- `curl -v telnet://127.0.0.1:22` - доступность порта 
- `tcpdump -i any port 9100 -nn` - пакеты через этот порт 
---
- `tail -f /var/log/*` - логи (`-f` - обновление в реальном времени)
- `head` - как tail, но head
- `journalctl` - утилита для просмотра логов служб, управляемых `systemd`
    - `-u <service_name>` - просмотр логов конкретной службы
    ```bash
    journalctl -u nginx
    ```
    - `journalctl -u nginx -f` - просмотр логов в реальном времени
    - `journalctl -n 100` - последние 100 строк
    - `journalctl --since "2024-10-03 12:00:00" --until "2024-10-03 14:00:00"` - логи за конкретный период
    - `journalctl -p err` - можно показывать только ошибки
        - emerg (0): Аварийные сообщения.
        - alert (1): Требуют немедленных действий.
        - crit (2): Критические ошибки.
        - err (3): Ошибки.
        - warning (4): Предупреждения.
        - notice (5): Важные события.
        - info (6): Информационные сообщения.
        - debug (7): Отладочные сообщения.
    - `journalctl -xe` 
        - x (или --catalog) — выводит дополнительные объяснения (аннотации) к некоторым сообщениям журнала, помогает понять детали ошибок или предупреждений, предлагая описания и возможные решения, если такие есть.
        - e (или --pager-end) — открывает журнал в режиме постраничного просмотра и сразу прокручивает его до конца, показывая самые последние записи.
- `less -S` - не переносит на новую строку
- `dmesg -T` - логи ядра системы 
- `/var/log/dmesg` - логи загрузки ядра (только *загрузки* ядра! dmesg - все логи ядра)
---
- `df -h` - информация о дисках 
- `df -i` - иноды
- `du` - отображение размера файлов и каталогов
    - `-s` - отображает только итоговый размер
    - `--max-depth=1` - выводит размер каталога и его подкаталогов
- `du -sh /tml` - размер директории
- `smartctl -a /dev/sda` - смарт отчет диска, генерит сам диск 
- `free -m` - оперативная память 
- `cat /proc/meminfo` - подробно про память
- `cat /proc/cpuinfo` - подробно про проц
---
- `tar` - работа с архивами 
    - `-cvf` - создать архив
    - `-xvf` - извлечь архив
    - `-z` - использовать сжатие `gzip`
    ```bash
    tar -xvfz backup.tar.gz /var/www
    ```
- `tar -zxvf apache-activemq-6.1.3-bin.tar.gz -C /opt` - распаковать в каталог
- `tar -zxvf apache-tomcat-9.0*tar.gz -C /opt/_Tomcat/application1-8080 --strip-components=1` - каталог apache-tomcat-9.0* не будет создан


### Система
- `lsof` - Команда lsof (List Open Files) в Linux используется для отображения списка открытых файлов в системе. В Linux (и Unix-подобных системах) практически все является файлом, включая сетевые соединения и устройства. 
    - `lsof` - просмотр всех открытых файлов
    - `lsof -u username` - файлы открытые конкретным пользователем 
    - `lsof -p 1234` - поиска файлов открытых определённым процессом 
    - `lsof -i :80` - соединения по конкретному порту 
    - `lsof /dev/sda1` - файлы использующие определённое устройство или файловую систему
    -  `lsof | grep <filename>` - Если файл заблокирован и его нельзя удалить или переместить, `lsof` покажет, какой процесс его использует
- `strace` - системные вызовы
---
- `killall -s 9 <hello>` - убивает все процессы в названием hello (`-s` - тип сигнала) 
- `w` - залогиненые пользователи и время `uptime`
- `whoami` - имя залогиненного пользователя
- `uptime` - сколько работает система без перезагрузки 
    - `-s` - время запуска
    - `-p` - время работы системы
- `reboot now` - перезагрузка системы
- `shutdown now` - выключить компьютер
- `watch "some command"` - переодически запускает команду

- `lscpu` - информация о процессоре
- `lspci` - информация об устройствах подключенных к pci шине
- `lsusb` - информация об usb-устройствах


### Разное
- `alt .` - перебирает последние аргументы из истории команд (`history`), если аргументов нет, то перебирает сами команды  
- `ctrl R` - поиск команд из `history`
- `    !!    `
- `ctrl A` - перемещение курсора в начало
- `ctrl E` - перемещение курсора в конец
- `ctrl U` - вырезает всё, что СЛЕВА от курсора (`ctrl Y` - вставить)
- `ctrl W` - выразает 1 слова, СЛЕВА от курсора (`ctrl Y` - вставить)
- `ctrl K` - вырезает всё, что СПРАВА от курсора (`ctrl Y` - вставить)
- `cd -` перейти в предыдущую директорию
- `^restart^status` - замена с ... на ... в последней выполненной команде 
- `&` - в конце команды и команды будет выполняться в фоновом режиме
- `nohup <command> &` - если закроем терминал команда продолжит выполняться
- `nl` - как `cat`, но еще выводит номера строк
- `ctrl L` - `clear`
- `reset` - используется для сброса настроек терминала и очистки экрана
--- 
- `cd` - вернуться в домашнюю директорию
- `touch file{4..13}`
- `mkdir dir_{a..f}`
- `cp -iv file1 dir1/file2` - (`-i`) спрашиваем будем ли перезаписывать 
- `cp -nv` - не перезаписывать 
- `cp -a source_file destination_directory/` - Опция `-a` эквивалентна комбинации нескольких опций: `-d` (сохраняет символические ссылки), `-p` (сохраняет права доступа, владельца и временные метки), и `-r` (рекурсивно копирует каталоги).
- `cp -vu` - пропустить совпадающие файлы, а скопировать только файлы новее или отсутствующие
- `cp /etc/fstab{,.bkp}` == `cp /etc/fstab /etc/fstab.bkp`
- `stat file`
    - Размер файла (Size): В байтах.
    - Тип файла: Обычный файл, каталог и т. д.
    - Права доступа (Access): Права на чтение, запись и выполнение для владельца, группы и других пользователей.
    - Идентификаторы пользователя и группы (UID/GID): Идентификатор владельца и группы.
    - Время изменения (Modify): Дата и время последнего изменения содержимого файла.
    - Время последнего доступа (Access): Когда файл был последний раз открыт.
    - Время изменения метаданных (Change): Когда были изменены права или метаданные файла.
    - Номер inode: Уникальный номер файла в файловой системе.
--- 
- `kill -l` - список возможных сигналов
- `/etc/passwd` - инфо о пользователях в системе
- `htop -p ` - процесс на таком-то порту 
- `truncate -s 0 /var/log/messages`
---
- `find / -name <pg_config> 2>/dev/null`
- `grep -A 10 <файл>` - вывести 10 строк после найденного совпадения


### Диски 
- `fdisk -l` 
    - Показывает список всех подключенных устройств (жестких дисков, SSD и т.д.).
    - Отображает размер дисков, типы разделов, точки монтирования.
    - Полезно для диагностики, перед созданием или изменением разделов.
- `lsblk` - показывает дерево всех подключенных устройств, их разделы, точки монтирования. (`-f` - для более детальной информации о файловых системах, `-p` - полные пути к устройствам, `-d` - показывает только диски, без разделов, `-J` - результат в виде json)
- `cfdisk <устройство>` - команда для работы с разделами диска 
- `mkfs.<тип файловой системы> <устройство>` - для создания файловой системы на разделе диска, форматирует указанный раздел с выбранной файловой системой
- `/etc/fstab` - это файл конфигурации в Linux, который содержит информацию о том, какие файловые системы должны автоматически монтироваться при загрузке системы.
!!! tip "Про `fstab`" 
    Каждая строка в `/etc/fstab` описывает один файловый раздел и содержит следующие поля:

    - Файл устройства (например, /dev/sda1 или UUID диска).
    - Точка монтирования (например, /, /home, /mnt/data).
    - Тип файловой системы (например, ext4, ntfs, swap).
    - Опции монтирования (например, defaults, noatime, ro).
    - Параметр для dump (обычно 0, определяет необходимость резервного копирования).
    - Параметр для проверки на ошибки (fsck) (0 — не проверять, 1 — проверять при загрузке).

    Пример строки
    ```
    UUID=3b14dabe-6a1a-4a1b-9e41-3d9b26b6ef1f / ext4 defaults 0 1
    ```
- `blkid` - выводит информацию о всех блочных устройствах, включая UUID
- `mount` - используется для подключения файловых систем (например, жестких дисков, флешек) к определенным точкам монтирования в файловой системе
```bash
mount [OPTIONS] <DEVICE> <MOUNTPOINT>
```
- `mount /dev/sda1 /mnt` - это монтирует раздел /dev/sda1 в директорию /mnt
- `mount -t ext4 /dev/sda1 /mnt` - подключить с указанием типа файловой системы
- `df -Th` - информация о файловых системах и их типах 
- `du -sh * | sort -rh` - размеры файлов и директорий в текущей (по убыванию)
- `lsblk -d -o name,rota` 
    - 1 это HDD (жесткий диск).
    - 0 это SSD (твердотельный накопитель)
> диск с названием sr* это cd привод
- `lsscsi` - отображает устройства, подключенные через интерфейс SCSI