Чемоданчик инструментов — вот что отличает опытного специалиста от новичка. А в вопросах, связанных с администрированием Linux, такой чемоданчик — едва ли не самое важное.
Еще по теме: Легкий браузер для Linux
Программы сисадмина
В этой статье мы не будем говорить о таких вещах, как Nagios, Puppet, Webmin, или изощренных анализаторах логов Apache — обо всем этом вы должны знать и так. Вместо этого мы поговорим о небольших утилитах, способных сделать вашу жизнь системного администратора намного проще.
Tmux
Начнем c основы основ. Как мы все знаем, главный инструмент администрирования Linux — это SSH-клиент, либо из комплекта OpenSSH, либо обособленный, вроде PuTTY или даже приложения для Android. SSH-клиент позволяет открыть удаленную сессию командной строки и спокойно работать с машиной, которая находится за тысячи километров от вас. Проблема только в том, что это одна сессия и она не запоминает состояние.
Tmux решает проблему. Это терминальный мультиплексор, который позволяет открыть множество терминалов в рамках одной SSH-сессии с возможностью закрыть соединение, сохранив состояние.
Работает это так. Вы подключаетесь к удаленной машине с помощью SSH, затем устанавливаете на нее tmux и запускаете его. На экране появляется консоль tmux со строкой состояния внизу и одним запущенным в данный момент терминалом. Вы можете работать с ним так же, как обычно, плюс у вас есть возможность открывать новые терминалы с помощью Ctrl+b c и переключаться между ними с помощью Ctrl+b 0..9 или Ctrl+b p (предыдущий), Ctrl+b n (следующий).
Когда работа будет окончена, нажимаете Ctrl+b d, чтобы отключиться от tmux, и разрываете соединение с сервером. При следующем подключении вы выполняете команду
1 |
$ tmux attach |
и видите все открытые ранее терминалы, запущенные в них приложения, историю команд и так далее. Все ровно так, как во время отключения от tmux. Более того, абсолютно неважно, с какой машины вы зашли во второй раз, сессия tmux будет полностью восстановлена.
Tmuxinator
Tmux позволяет не только открывать терминальные окна в полный экран. Он умеет делить экран по вертикали (Ctrl+b %) и горизонтали (Ctrl+b «). Это можно использовать в том числе для создания чего-то наподобие «экрана мониторинга»: например, вы можете запустить на удаленной машине tmux с тремя открытыми окнами, в одном из которых будет монитор htop, в другом — утилита tail, выводящая последние сообщения из нужного лога, а еще в одном — утилита df, показывающая заполненность файловых систем.
На первый взгляд такой монитор кажется очень удобным, но что, если вам необходимо закрыть его и запустить tmux с обычными полноэкранными окнами, а затем снова открыть монитор? Это можно реализовать с помощью нескольких различных tmux-сессий. Но это тоже не идеальный вариант, потому что на другом сервере вам придется настраивать ту же конфигурацию окон заново.
Tmuxinator решает задачу проще. Он позволяет описать нужную раскладку окон и запускаемые в них приложения в конфигурационном файле. Этот конфиг затем можно использовать для быстрого запуска сессии tmux в любом месте в любое время.
Для начала создаем новый конфиг:
1 |
$ tmuxinator new ИМЯ |
Tmuxinator откроет дефолтовый текстовый редактор, определенный в переменной EDITOR. В конце конфига будут строки, описывающие раскладку окон. Чтобы получить раскладку из примера выше, удалите их и добавьте следующие строки:
1 2 3 4 5 6 7 |
windows: - editor: layout: tiled panes: - sudo tail -f /var/log/vsftpd.log - watch df -h - htop |
Этот конфиг описывает раскладку tmux с одним окном, поделенным на три панели: последние сообщения лога vsftpd, заполненность ФС и htop. Остается только запустить сессию:
1 |
$ tmuxinator start ИМЯ |
Все конфиги хранятся в каталоге ~/.tmuxinator, поэтому их легко перемещать между машинами.
Watch
Вы могли заметить, что в конфиге tmuxinator я использовал команду watch df -h вместо df -h. Это важно, так как сразу после вывода таблицы разделов на экран df завершает свою работу, а нам необходимо мониторить состояние диска постоянно. Именно это и позволяет сделать утилита watch. Каждые две секунды она перезапускает команду df -h, поэтому информация на экране всегда актуальна.
Watch можно использовать для мониторинга практически чего угодно: состояния машины (watch uptime), содержимого файлов (watch cat файл) и каталогов (watch ls -l каталог), можно запускать под управлением watch собственные скрипты. С помощью опции -n ЧИСЛО вы можете изменить интервал перезапуска команды, а с помощью флага -d заставить watch подсвечивать изменения в выводе.
Multitail
Еще одна команда из конфига tmuxinator, о которой стоит упомянуть, — это sudo tail -f /var/log/vsftpd.log. Эта команда выводит последние десять строк лога vsftpd и ждет появления новых. Любой админ должен быть знаком с tail, а также ее аналогом в дистрибутивах, основанных на systemd:
1 |
$ journalctl -f -u vsftpd |
Это такое же базовое знание, как умение переходить по каталогам. Но есть у tail более интересная альтернатива под названием MultiTail. Фактически это тот же tail, но в многооконном варианте. Он позволяет выводить сразу несколько логов, разделяя экран по горизонтали:
1 |
$ sudo multitail /var/log/vsftpd.log /var/log/nginx/access.log |
С systemd и его journald все опять же сложнее:
1 |
$ multitail -l "journalctl -f -u vsftpd" -l "journalctl -f -u nginx" |
Даже еще сложнее:
1 |
$ multitail -l "journalctl -f -u vsftpd | tr -cd '[:space:][:print:]'" -l "journalctl -f -u nginx | tr -cd '[:space:][:print:]' " |
Такой изврат нужен, чтобы удалить из логов специальные символы, которые systemd использует для подсветки строк.
MultiSSH
Вернемся к SSH. Порой одну и ту же команду приходится выполнять на нескольких машинах. Это можно сделать в том числе с помощью стандартных возможностей шелла:
1 2 3 |
for host in 192.168.0.1 192.168.0.2; do ssh $host "uname -a" done |
Либо воспользоваться специальным инструментом, например mssh:
1 2 |
$ gem install mssh $ mssh --hostlist 127.0.0.1,127.0.0.2 "uname -a |
Lsof
Еще один очень важный инструмент любого сисадмина — lsof (LiSt Open Files). Эта утилита позволяет выяснить, какой процесс/приложение открыл те или иные файлы. Запущенная без аргументов, она выводит список всех открытых файлов и процессов. С помощью флагов этот список можно сделать более конкретным. Например, узнать, какие процессы используют файлы указанного каталога:
1 |
$ sudo lsof +D /var/log/ |
Такая возможность может очень пригодиться, когда пытаешься размонтировать файловую систему, но получаешь ошибку Device or Resource Busy. В этом случае достаточно убить процессы, открывшие файлы в указанной ФС, и вы сможете размонтировать ее без всяких проблем. Применив флаг -t, сделать это можно в один проход:
1 2 |
# kill -9 `lsof -t +D /home` # umount /home |
Вывод также можно профильтровать, используя имя нужного приложения или юзера. Например, следующая команда покажет все файлы, открытые процессами, чьи имена начинаются на ssh:
1 |
$ lsof -c ssh |
А такая покажет все файлы, открытые юзером vasya:
1 |
$ lsof -u vasya |
Lsof также можно использовать для листинга всех сетевых подключений:
1 |
$ lsof -i4 |
Листинг можно ограничить определенным портом:
1 |
$ lsof -i4 :80 |
Или получить список всех открытых портов:
1 |
$ lsof -iTCP -sTCP:LISTEN |
Tcpdump
Любому админу приходится решать проблемы работы сетевых служб. И порой в этом деле не обойтись без сниффера, который наглядно покажет, как протекает обмен данными и что в этом процессе может идти не так. Эталоном среди снифферов для Linux считается Wireshark, но на этом выбор не заканчивается. Практически любой дистрибутив Linux по умолчанию включает в себя консольный сниффер tcpdump, с помощью которого можно быстро разобраться в ситуации.
Запущенный без аргументов tcpdump без лишних слов начинает выводить в консоль список всех пакетов, отправленных и принятых на всех интерфейсах машины. С помощью опции -i можно выбрать нужный интерфейс:
1 |
$ sudo tcpdump -i wlp3s0 |
Чтобы ограничить область действия tcpdump только конкретной машиной и портом, можно использовать такую конструкцию:
1 |
$ sudo tcpdump -i wlp3s0 host 192.168.31.1 and port 53 |
Также можно заставить tcpdump выводить не только информацию о пакетах, но и их содержимое:
1 |
$ sudo tcpdump -i wlp3s0 -X host 192.168.0.1 and port 80 |
Если применяется шифрование, в этом нет никакого смысла, но с помощью tcpdump можно анализировать данные, передаваемые с использованием протоколов HTTP и SMTP.
Еще одно интересное умение tcpdump — фильтрация пакетов по содержанию конкретных битов или байтов в заголовках протоколов. Для этого используется такой формат: proto[expr:size], где proto — протокол, expr — смещение в байтах от начала заголовка пакета, а size — необязательное поле, указывающее на длину рассматриваемых данных (по умолчанию 1 байт). Например, чтобы отфильтровать только пакеты с установленным флагом SYN (инициация TCP-рукопожатия), следует использовать такую запись:
1 |
$ sudo tcpdump 'tcp[13]==2' |
Формат отчетов tcpdump — это стандарт, его понимают практически все современные снифферы. Поэтому tcpdump можно использовать для генерации дампа на удаленной машине, а затем отправить его на локальную и провести анализ с помощью того же Wireshark:
1 |
$ ssh root@example.ru tcpdump -w - 'port !22' | wireshark -k -i - |
Ngrep
Tcpdump хорош своей универсальностью и разнообразием возможностей, однако для поиска конкретных данных внутри передаваемых пакетов его использовать не так просто и удобно. С этой задачей гораздо лучше справляется ngrep, предназначенный для отображения сетевых пакетов, удовлетворяющих заданной маске.
Например, чтобы найти параметры, передаваемые методами GET и POST в рамках HTTP-сессии, можно использовать следующую команду:
1 |
$ sudo ngrep -l -q -d eth0 "^GET |^POST " tcp and port 80 |
А так можно проанализировать SMTP-трафик на всех сетевых интерфейсах:
1 |
$ sudo ngrep -i 'rcpt to|mail from' tcp port smtp |
VnStat
Систем учета трафика и накопления статистики существует огромное множество. Нередко они встроены прямо в систему удаленного управления сервером и позволяют проанализировать расходы с помощью наглядных графиков. Но если вы используете консоль и все, что вам нужно, — это быстро узнать статистику по интерфейсам, то лучший инструмент — это vnStat.
VnStat умеет накапливать статистику в непрерывном режиме, сохраняя данные между перезагрузками, а использовать его проще простого. Для начала установи пакет и запусти сервис vnstat:
1 2 |
$ sudo systemctl start vnstat $ sudo vnstat -u |
С этого момента он начнет сбор статистики. Для ее просмотра достаточно выполнить такую команду (wlp3s0 замени именем нужного сетевого интерфейса):
1 |
$ vnstat -i wlp3s0 |
Статистику можно конкретизировать, например вывести почасовую статистику с графиком:
1 |
$ vnstat -h wlp3s0 |
Статистику по дням или месяцам:
1 2 |
$ vnstat -d wlp3s0 $ vnstat -m wlp3s0 |
Используя флаг -t, можно получить информацию о десяти днях с самым большим расходом трафика:
1 |
$ vnstat -t wlp3s0 |
Чтобы проследить за текущей активностью на сетевом интерфейсе, vnStat можно запустить в live-режиме:
1 |
$ vnstat -l -i wlp3s0 |
В этом случае он будет показывать скорость передачи данных в текущий момент, а после завершения работы выведет статистику за все время live-мониторинга.
Iptraf-ng
Iptraf-ng — еще один удобный инструмент мониторинга сетевых интерфейсов. Как и vnStat, он позволяет получить детальную статистику по использованию канала, но наиболее полезная функция — реалтайм-мониторинг трафика.
Iptraf в наглядной форме показывает, с какими хостами идет обмен данными в текущий момент, количество переданных пакетов и их объем, а также флаги и ICMP-сообщения. Для получения доступа к этой информации следует выбрать пункт меню IP traffic monitor на главном экране.
NetHogs
VnStat и iptraf удобны, когда дело касается получения данных для всего интерфейса в целом. Но что, если вам необходимо узнать, какие конкретно приложения в текущий момент обмениваются данными с удаленными хостами?
В этом поможет утилита NetHogs. Это своего рода аналог утилиты top/htop для мониторинга сети. Вы устанавливаете утилиту, а потом запускаете ее, указав нужный сетевой интерфейс:
1 |
$ sudo nethogs wlp3s0 |
На экране появляется список приложений, наиболее часто обменивающихся данными с удаленными машинами.
Iotop
Раз уж мы заговорили об аналогах top, то нельзя не упомянуть iotop. Эта утилита позволяет увидеть, какие процессы выполняют операции записи/чтения диска. Запускать ее лучше с флагом —only, иначе, кроме тех процессов, что выполняют ввод/вывод в данный момент, она также покажет часть других процессов, которые могут спать:
1 |
$ sudo iotop --only |
Nmon
Пришло время собрать все вместе. Nmon объединяет возможности многих рассмотренных утилит и позволяет в реальном времени получать статистику использования процессора, памяти, ввода/вывода, работы ядра и другие данные.
Nmon — консольное приложение с псевдографическим интерфейсом. Работает оно так: вы запускаете nmon с правами root, а затем добавляете на экран нужную вам информацию. Например, чтобы добавить на экран сведения о загруженности процессора, следует нажать c, заполненность оперативной памяти — m, ввод/вывод — d, сеть — n, процессы — t, файловые системы — j. Так можно создать собственную конфигурацию монитора, который будет отображать только то, что нужно вам.
Одной строкой
В этой статье я постарался обойти стороной инструменты, которые уже должны быть вам известны. Но если вы все-таки о них не знаете — вот краткий список того, что может пригодиться:
- top/htop — монитор процессов, показывает тех, кто больше всего грузит процессор;
- scp — утилита копирования файлов с удаленной машины и на нее по SSH;
- Nmap — сканер портов, позволяет провести быстрый поверхностный пентест (о нем у нас уже была подробная статья);
- netcat — сетевой швейцарский нож, позволяет в том числе вручную подключаться к серверам, работающим с plain text протоколами: HTTP, SMTP;
- dd — утилита для блочного копирования данных, с нее можно снять дамп ФС;
- mc — консольный двухпанельный файловый менеджер.
Вместо заключения
Здесь следовало бы в очередной раз сказать о том, что это только верхушка айсберга, что у каждого админа свои инструменты, обязательно приплести гибкость Linux и так далее и тому подобное. Но эта статья всего лишь описывает набор хороших инструментов, которые сделают вашу жизнь проще.
Еще по теме: Как пользоваться редактором Vim