29 июля 2019

Справочник основных команд Linux с примерами

1 Общая информация

Содержимое

1.1 Основные команды

1.2 Объединение команд

1.3 Специальные символы (групповые операции)

В именах файлов нельзя использовать:
/ — использовать запрещено
— — нельзя ипользовать в начале имени файла или каталога
{}, *, ?, ‘, «, [ , ], \, >, <, |, &, пробел — каждый из этих символовдолжен быть предварен \. Применять не рекомендуется.

В конфигурационных файлах:
# — комментарий
// — комментарий

1.4 Просмотр содержимого файлов

1.5 nano

nano — редактор файлов, более дружелюбный чем vim 😉

  •  Ctrl-X — закрыть редактор
  •  Ctrl-O — сохранить
  •  Ctrl-C — номер строки\текущая позиция
  •  Ctrl-W — поиск
  •  Ctrl-W затем Ctrl-T — переход к строке №
  •  Ctrl-K — вырезать строку
  •  Ctrl-U — вставить из буфера
  •  Alt-A — выделение (вне X)
  •  Alt-6 — копировать в буфер

1.6 vim

vim — редактор файлов, более дружелюбный чем nano 😉

  •  ZQ — закрыть редактор
  •  ZZ — закрыть и сохранить

1.7 tmux

tmux — аналог screen с одновременным вводом команд в несколько окон

  •  ZZ — закрыть редактор
  •  ZQ — закрыть и сохранить

2 Система

2.1 Загрузка

Последовательность при загрузке:

Инициализация BIOS => Загрузчик (grub) => Инициализация ядра (kernel initialization) => выполнение init -> {/etc/rc.d/rc.sysinit, /etc/rc.d/rc, /etc/rc.d/rc[0-6].d/, /etc/rc.d/rc.local} => virtual consoles => X

=> Инициализация BIOS:

Определение переферийных устройств и устройств для загрузки. BIOS читает и выполняет инструкцию расположенную в первом секторе загрузочного устройства. Обычно это первые 512 bytes жесткого диска.

=> Загрузчик:

Первоначальный загрузчик находит и загружает программу загрузки 2 этапа (stage 2) и передаёт ей управление (grub); используется BIOS API; обычное место загрузчика 2 этапа — /boot/. Загрузчик 2 этапа выбирает, находит и загружает ядро и RAM диск (initrd) в память; grub читает конфигурацию из /boot/grub/grub.conf. grub.

=> Инициализация ядра:

Обнаружение устройств. Инициализация драйверов устройств. Монтирование корневой файловой системы в режиме только чтения (read-only). Запуск процесса init.

=> Выполнение init:

init читает /etc/inittab (как загружать систему для каждого runlevel). Определяется run level, директории для запуска скриптов, стартует /etc/rc.d/rc.sysinit: udev, selinux, устанавливаются параметры ядра в /etc/sysctl.conf, устанавливаются часы, загружается keymap, подключается swap, устанавливается hostname, проверяется и перемонтируется корневая файловая система в режиме чтения-записи.

2.2 Hardware

Версия системы, дистрибутив

Оборудование определенное ядром

2.3 Ресурсы и статистика

Ресурсы RAM и HDD

Статистика

2.4 Ограничения

Ограничения shell/script

Ограничения user/process

Ограничения на всю систему

Отключаем ответы сервера на ping

2.5 Runlevels

Ядро стартует init, init читает /etc/inittab и запускает rc, который в свою очередь стартует скрипты определенного уровня (runlevel). Скрипты находятся в /etc/init.d и ссылаются (линкуются) с /etc/rc.d/rcN.d где N номер runlevel
Уровень запуска по умолчанию указывается в /etc/inittab, обычно это 3 или 5.

Уровень запуска можно быстро поменять с init

chkconfig — конфигурирует какие программы будут запускаться при запуске OS с определенным runlevel

В Debian и основанных на Debian дистрибутивах используется update-rc.d для управления скриптами runlevels . По умолчанию стартует в 2,3,4,5 и выключается в 0,1 и 6.

2.6 Восстановить пароль root

Вариант 1Когда стартует grub, появляется возможность выбора режима загрузки в grub_boot_screen (иногда при загрузке нужно нажать F4)
1.Нажимем  <пробел> — попадаем в меню выбора вариантов загрузки kernel и initrd.
2.Нажимаем F <e> — для редактирования режима загрузки и дописывем S (загрузка в single user mode).

3.Нажимаем F <b> для загрузки с установленным параметром.
4.Выполняем команду и вводим нужный пароль.

Вариант 2В момент загрузки grub, задаем:

Ядро примонтирует корневой раздел, init запустит shell. Выполняем:

Вариант 31.Загружаемся с внешнего носителя в rescue mode (liveCD или installation CD).
2.Находим корневой раздел с помошью fdisk.
3.Выполняем:

2.7 kernel (update kernel)

Варианты ядра для x86:

1.Regular: несколько процессоров, максимально 4GB RAM
2.PAE: 32 процессора, 16GB RAM
3.Xen: поддержка виртуализации

Варианты ядра для x86_64:

1.Regular: 64 процессора, максимально 256GB RAM
2.Xen: поддержка виртуализации
Ядро обычно устанавливается в /boot/vmlinuz-*

Некоторые устройства:

2.8 grub

2.9 Пользователи

В /etc/shadow хранится пара: hash пароля и логин.

2.10 Память

Резидентная память — память в оперативке
Анонимная память (anon) — память без привязки к файлу
Page fault — обращение к памяти, trap


Все операции чтения и записи работают через пейджкэшь
pages recliming — освобождение памяти(sync, disareablw, swap, unreclaim)
LRU листы — организация очередей в cache может быть active innactive (meminfo)
page fault minor — выделение без чтения с диска
page fault major — с чтением диска

3 Процессы

3.1 Просмотр процессов

<PID> — уникальный номер(идентификатор) процесса

Приоритеты

Изменить приоритет запущенного процесса можно с renice. Отрицательные числа имеют наивысший приоритет. Границы от -20 до 20

Приоритет запускаемых процессов устанавливаем с nice.

nice меняет планировщик CPU, ionice меняет планировщик I/O дисков.

Последняя команда удобна для отладки и компиляции больших проектов. Кождая команда запущенная из этого shell будет иметь подобный приоритет (приоритет $$, если $$ PID shell).

Background/Foreground

Процесс запущенный в shell может быть убран на задний план(Background), а потом вызван на передний план(Foregroun) нажатием F <Ctrl>+<Z>. Запускайте процесс с nohup, чтоб он продолжил работу, когда shell будет закрыт.

Top, htop

Top — выводит информацию в реальном времени о запущенных процессах. Htop — продвинутая версия top, ставится из репозиториев.
F<u> [username] Показывает процессы принадлежащие пользователю username
F<k> [pid] Убить процесс с pid
F<1> Покажет статистику использования процессоров
F<R> Сортировка

Kill, signals

Сигналы:

Файловая система

Права

4.2 Информация о дисках

4.3 Точки монтиования, разделы, использование дисков

4.4 Блокировка файлов, кто использует файлы?

Найти открытые файлы, для Xorg:

Файл с inum 212042 нашелся в /var:

Поиск открытых файлов в точках монтирования с fuser или lsof

Приложение:

Файл:

4.5 Mount/remount

4.6 Увеличиваем SWAP

Иногда нужно увеличить swap, прямо сейчас, на лету

4.7 Монтируем SMB share

cifs использует ip или DNS имя

Если используется mount.cifs, то можно хранить учетные данные в файле /home/user/.smb:

Монтируем:

4.8 Монтируем image (образ)

4.9 Создание и запись ISO образа

Без conv=notrunc содержимое будет меньше объема диска, если данные не занимают весь диск (DVD запишем на CD).

Используем mkisofs для создания CD/DVD образа из файлов в папке. Для переодоления ограничений на имена файлов: -r разрешает Rock Ridge расширения для UNIX истем, -J разрешает Joliet расширения используемые Microsoft ОС. -L разрешает имена согласно ISO9660.

Запись:

Конвертируем Nero .nrg файл в .iso

4.10 Монтируем образ (файл как образ)

/dev/zero быстрее urandom, но менее безопасный.

4.11 Memdisk

Tmpfs очень быстрая файловая система для IO приложений. Создадим 64 MB раздел, смонтируемый в /memdisk:

4.12 Производительность дисков

5 Сеть

5.1 Устранение ошибок

Работа с NIC

eth0 из shell

5.2 Routing

Добавить/удалить маршрут

5.3 Дополнительный IP

5.4 Сменить MAC

Wireless:

5.5 Занятые порты

5.6 Firewall

5.7 Разрешить роутинг

5.8 NAT

Проброс портов можно отменить, заменив в правиле -A на -D.

5.9 DNS

Настройки DNS храняться в /etc/resolve.conf:

dig — утилита для тестирования DNS. В качестве DNS сервера используем свободный google dns с ip: 8.8.8.8

Некоторые полезные запросы:

Имя по IP адресу (in-addr.arpa. , обратная зона). Используется dighost and nslookup:

Для локального преобразовния имен (в рамках системы) можно использовть файл /etc/hosts:

5.10 DHCP

Интерфейс используемый по умолчанию — eth0

Полная информация о аренде:

5.11 Анализ трафика

Bmon — консольный монитор загрузки сетевых интерфейсов.

Sniff с tcpdump

Важные опции:
-A Отображает каждый пакет в открытом виде (текст), без заголовка
-X Показывает пакеты в hex и ASCII
-l Вывод в буффер
-D Печать всех доступных интерфейсов (# tcpdump -D)

Nmap

nmap — сканер портов с возможностью определения OS.

5.12 QoS

Ограничение скорости отдачи (Limit upload)

Целесообразно использовать для взаимодействия с DSL устройствами и различными модемами для согласования скорости.

Качество обслуживания (QoS)

tc — используем для приортета VoIP. Пусть VoIP спользует udp на портах 10000:11024 и интерфейс eth0. Команды в примере зададут качество обслуживания для 3 очередей и выделят VoIP для очереди 1 с QoS 0x1e (установлены все биты). По умолчанию потоков в очереди 3 и QoS Minimize-Delay поток в очереди 2.

Статус и удаление QoS

Расчет диапазона портов и маски:tc фильтр определяет диапазон портов с портом и маской, которые мы будемем использовать для расчета. Определим 2^N границы диапазона портов, расчитаем диапазон и переведем в HEX. Это и есть маска. Например для 10000 -> 11024, диапазон 1024.

5.13 NIS

5.14 Netcat (nc)

Создаёт или читает/пишет TCP/IP соединения

Передать файл

Копирование файлов по сети напрямую по tcp. Копирование быстрое и не нужно создвать ftp, smb и т.д, мы просто делаем файлы доступными по сети. Пусть 192.168.1.1 IP сервера.

Сканер портов

Чат

Hacks

6 SSH SCP

6.1 Public key аутентификация

Аутентификация — подтверждение подлинности; установление соответствия лица названному им идентификатору.
Авторизация — процесс предоставления определенному лицу прав на выполнение некоторых действий.
Идентификация — присвоение субъектам и объектам идентификатора и/или сравнение идентификатора с перечнем присвоенных идентификаторов.

Используем ssh-keygen для создания пары ключей. ~/.ssh/id_dsa приватный ключ, ~/.ssh/id_dsa.pub публичный ключ.
Копируем публичный ключ на сервер и добовляем его в файл ~/.ssh/authorized_keys2 в вашу домашнюю папку.

Соединяемся с хостом без пароля используя public key аутентификацию

6.2 Проверка подписи (fingerprint)

При первом логине на хост, ssh сппросит сохранить ли подпись хоста и является ли этот хост доверенным. Если мы сомневаемся и подозреваем хост в man-in-the-middle attack, то администратор хоста, может отправить вам подпись для сравнения. Получить ей можно с помощью команды ssh-keygen -l

6.3 Безопасная передача файлов

6.4 Туннелирование (Tunneling)

SSH туннелирование позволяет перенаправлять порты через SSH соединения, тем самым обеспечивая трафик и доступ к портам, которые иначе были бы заблокированы. Работает только для TCP.

Прямое перенаправление на шлюз

Нужно получить доступ к CVS (порт 2401) и http (порт 80), запущенных на удаленном хосте. Мы подключаем к локальному порту 2401, соответствующий порт удаленного хоста, а для доступа к удаленному порту 80 используем локальный порт 8080. Единожды открыв ssh сессию, все соответствующие сервисы удаленного хоста, будут доступны на локальных портах.

Форвардинг портов Netbios и RDP

Теперь SMB шара доступна по адресу \\127.0.0.1\, но только если отключена локальные шара, поскольку локальная шара тоже использует 139 порт. Что-бы иметь возможность оставить локальные расшаренные русурсы включенными, нужно создать новый виртуальный интерфейс с новым IP адресом для создания туннеля, SMB шара будет подключена через этот IP адрес. Кроме того, локальный RDP уже использует порт 3389, поэтому мы выбираем 3388. Для приведенного ниже примера, будем использовать виртуальный IP адрес 10.0.0.1.
Создаем loopback интерфейс с IP адресом 10.1.1.1:

Подключение клиентов, находящихся за NAT

Есть две машины, находящиеся за NAT шлюзом, клиенты имеют доступ к Linux-шлюзу по ssh. Поскольку будут использованы порты, выше 1024, root доступ не понадобится. На шлюзе мы используем порт 2022.

Подключение к рабочему столу, расположенному за NAT

Нужно получить доступ к Windows клиенту с VNC слушающем на 5900 порту.

Multi-hop ssh tunnel

Мы не можете получить прямой доступ к ssh сервера,а возможно это только через промежуточные хосты(например из-за проблем с маршрутизацией), но получить соединение клиент-сервер необходимо, к примеру что-бы скопировать файлы через SCP или пробросить порт для SMB. Сделать это можно, организовав туннель из цепочки хостов. Допустим нам нужно перебросить ssh порт клиента к серверу, в два скачка. Когда туннель будет создан, будет возможно прямое подключение клиент — сервер.Создание туннеля: cli -> host_1 -> host_2 -> сервер and dig tunnel 5678

client -> server используя туннель и порт 5678

Автосоединение (Autoconnect)

/home/admin/port_forward.sh

crontab -e

6.5 SSH tricks

Постоянное соединение:

Port Knocking

[options]

logfile = /var/log/knockd.log [openSSH] sequence = 3000,4000,5000 seq_timeout = 5 command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 5000,4000,3000 seq_timeout = 5 command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT tcpflags = syn

7 VPN с SSH

7.1 P-2-P | 7.2 Lan-2-Lan

OpenSSH поддерживает устройства tun/tap, позволяющие создавать шифрованный туннель. Плюс протокола SSH в том, что для реализации не нужно устанавливать и настраивать дополнительный софт, минус — низкая производительность на медленных линиях.

В /etc/ssh/sshd_config, должны стоять опции:

7.1 P-2-P

Соединим два хоста client и server. Соединение инициирует client к server, при этом он должен обладать правами root. Конечные адреса туннеля 10.0.0.1 (server) и 10.0.0.2 (client), кроме того мы создаем устройство tun1.

7.2 Lan-2-Lan

Есть две сети, их нужно соединить, сеть А с адресом 192.168.51.0/24 и сеть Б с адресом 192.168.16.0/24. 192.168.51.0/24 (сеть A)|шлюз A <-> шлюз Б|192.168.16.0/24 (сеть Б)

8 Backup

8.1 rsync

rsync используется для удаленного копирования (локально тоже используется) или синхронизации файлов и каталогов. Может практически целиком заменить cp и scp, поддерживает сжатие и рекурсию, прерванные передачи можно перезапустить.

Копируем через сет с компрессией. По-умолчанию, Rsync использует для передачи протокол SSH в том числе и с ключами, если таковые имеются. Символ «:» используется как в SCP.

Исключить из процесса удаленного копирования директорию tmp в /home/user/ и сохранить иерархию, удаленная директория будет иметь структуру /backup/home/user/:

Можно использовать rsync с «::», это гораздо быстрее, но трафик не шифруется. Местонахождение папки для резервного копирования (например /backup) можно настроить в файле /etc/rsyncd.conf. Переменная RSYNC_PASSWORD служит для того, что-бы избежать необходимости ввода пароля вручную.

8.2 tar

tar — архивирование файлов и директорий. Сам по себе tar, это не сжатый архив, сжатые архивы имеют расширения .tgz или .tar.gz (gzip) или .tbz (bzip2).

Создание архива tar:

Распаковать архив tar:

Полезно:

8.3 dd

dd ( disk dump или destroy disk ) — используется для копирования (конвертирования) дисков, разделов, и прочих операций копирования.

Синтаксис:

Размер входных данных по-умолчанию 512 байт (1 блок). Увеличение размера блока ускоряет процесс копирования, но требует больше памяти.

Резервное копирование и восстановление

Recover

dd считывает раздел поблочно, если на диске предположительно есть проблемы, нужно использовать опцию conv=sync,noerror, при этом dd будет пропускать битые блоки и записывать нули на диск назначения. Поэтому важно, установить размер блока, равным, или меньшим, чем размер блока на диске. Вполне подходящим будет размер блока в 1 килобайт, установить размер на входе и выходе можно опцией bs=1k. Если на диске имеются сбойные сектора, но основные данные нужно сохранить с данного раздела, можно создать файл образа, смонтировать образ и копировать данные на новый диск. С установленной опцией noerror, dd пропустит поврежденные блоки, записав на их место нули, при этом, потеряны будут, только данные, содержавшиеся в сбойных секторах диска.

Удаление данных

MBR

MBR содержит код загрузчика и таблицу разделов. Первый 466 байт отводятся под загрузчик, 466-512 байт под таблицу размещения разделов.

9 sudo

sudo — повысить уровень привелегий, дать права на выполнение, без выдачи пароля на root.

sudo конфигурируется в файле /etc/sudoers или с помощью команды visudo

/etc/sudoers:

10 Управление пакетами

10.1 yum rpm apt-get

yum устанавливает пакет и все зависимости (пакеты|библиотеки) для его работы из репозиториев.

Работа с пакетами, без разрешения зависимостей:

10.2 репозитории

Создаем файл заканчивающийся на .repo в /etc/yum.repos.d/ (Для дистрибутивов с yum):