wiki/docs/linux/Команды.md
2025-02-09 20:47:57 +03:00

416 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Основные команды для администрирования 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>` - устанавливает пакет
- `sudo apt install ./имя_пакета.deb` - устанавливает .deb пакет
- `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`
- `wc -l <file_name>` - количетсво строк в файле
- `cat <file_name> | column` - для форматирования текста в виде таблицы
### Диски
- `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
### Grep
- `cat <filename> | grep -A 10 "<pattern>"` - вывести 10 строк ПОСЛЕ найденного совпадения
- `cat <filename> | grep -B 10 "<pattern>"` - вывести 10 строк ПЕРЕД найденным совпадения
- `cat <filename> | grep "^<pattern>"` - начинается с `<pattern>`
- `cat <filename> | grep "^<pattern1>.*<pattern2>"` - `.*` любое количество символом между `<pattern1>` и `<pattern2>`
??? info "Квантификатор, он указывает сколько раз в строке встречается символ или группа символов"
- `*` - любое количество символов
- `+` - один и более символов
- `?` - 0 или 1 символ
- `{n}` - встречается n раз
- `cat <filename> | grep "^<pattern1>.*<pattern2>$"` - `<pattern2>` в конце строки (из-за `$`)
- `cat <filename> | grep -P "restrict(ed|ing)"` - ну понятно
??? info "Флаги grep"
Если не работает корректная регулярка, добавить один из этих флагов
- `-P` - Perl совместисые регулярки
- `-E` - расширенные регулярки
- `i` - игнорировать регистр
- `w` - только целые слова
- `x` - совпадение всей строки
- `cat <filename> | grep -P "May 2 08:5(3|4|5):"` - ну понятно
### Логирование
- `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 - все логи ядра)
- `sudo journalctl --disk-usage` - сколько места занимают логи на диске, собираемые journalctl
- `sudo journalctl --vacuum-size=1G` - задаёт максимально допустимый размер для хранимых на диске логов
- `sudo journalctl --vacuum-time=1years` - задаёт максимально допустимое время для хранимых на диске логов
- `tail -f` следит за файлом и выводит новые строки по мере их добавления в файл. Однако, если файл будет удалён и создан заново (например, при ротации логов), `tail -f` перестанет отслеживать файл, потому что он будет считать, что файл исчез.
- `tail -F` делает то же самое, но в случае удаления файла и его создания заново, `tail -F` продолжит отслеживать файл. Это полезно для логов, так как они могут быть перезаписаны, но вы хотите продолжать их отслеживать, несмотря на изменения имени файла или его создание заново.
---
- `/var/log/messages` — общие системные сообщения, включая ошибки ядра, службы и аппаратные события (в CentOS).
- `/var/log/syslog` — аналог messages в Debian/Ubuntu, содержит системные логи и логи демонов.
- `dmesg -T` - логи ядра системы
- `/var/log/dmesg` - логи загрузки ядра (только *загрузки* ядра! dmesg - все логи ядра)
- `/var/log/secure` — логи аутентификации, попыток входа, работы sudo (RHEL/CentOS).
- `/var/log/auth.log` — аналог в Debian/Ubuntu, логи SSH, sudo и других служб аутентификации
#### Logrotate
Logrotate - это системная утилита Linux, которая управляет автоматической ротацией и сжатием лог-файлов.
Пример конфига logrotate
```ini
/var/log/messages {
size 100M # Ротация, если размер превышает 100 МБ
rotate 10 # Хранить до 10 архивов
compress # Сжимать старые файлы
delaycompress # Откладывать сжатие на один цикл
missingok # Игнорировать, если файл отсутствует
notifempty # Пропускать пустые файлы
sharedscripts # Пост-скрипт выполняется один раз для всех лог-файлов
postrotate # HUP позволяет rsyslog подхватить новые файлы логов.
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
}
```
- `logrotate -d /etc/logrotate.d/app` - для проверки конфигурации
- `logrotate -f /etc/logrotate.d/app` - для принудительной ротации логов