lsof — это уникальный инструмент сисадминов/безопасников.
Я использую его чаще всего для получения информации о сетевом подключении в системе, но это только начало для этого мощного и слишком малоизвестного приложения.
Инструмент точно называется lsof, потому что он «выводит список открытых файлов».
И помните, в UNIX почти все (включая сетевой сокет) является файлом.
Интересно, что lsof также является командой Linux/Unix с большинством переключателей.
У него их так много, что нужно использовать как минусы, так и плюсы.
usage: [-?abhlnNoOPRstUvV] [+|-c c] [+|-d s] [+D D] [+|-f[cgG]][-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+|-M] [-o [o]][-p s] [+|-r [t]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Как видите, у lsof действительно потрясающее количество опций.
Вы можете использовать его для получения информации об устройствах в вашей системе, о том, что касается конкретного пользователя в любой заданной точке, или даже о том, какие файлы или сетевое подключение использует процесс.
Для меня lsof полностью заменяет netstat и ps.
В нем есть все, что я могу получить от этих инструментов, и многое, многое другое.
Итак, давайте посмотрим на некоторые из его основных возможностей:
Ключевые параметры
Важно понять несколько ключевых моментов о том, как работает lsof.
Наиболее важно, когда вы передаете ему параметры, по умолчанию используется все результаты (ИЛИ).
Поэтому, если вы выбираете список портов с -i, а также список процессов с -p, вы по умолчанию получите оба результата.
Вот еще несколько подобных моментов:
по умолчанию: без параметров lsof выводит список всех открытых файлов для активных процессов
группировка: можно группировать параметры, например, -abC, но вы должны следить за тем, какие опции принимают параметры
-a: И результаты (вместо ИЛИ)
-l: показать идентификатор пользователя вместо имени пользователя в выводе
-h: получить помощь
-t: получить только идентификаторы процессов
-U: получить адрес сокета UNIX
-F: вывод готов к другой команде, которую можно отформатировать различными способами, например, -F pcfn (для идентификатора процесса, имени команды, дескриптора файла и имени файла с нулевым терминатором)
Получение информации о сети
Как я уже сказал, один из моих основных вариантов использования lsof — это получение информации о том, как моя система взаимодействует с сетью.
Вот несколько основных моментов для получения этой информации:
Показать все соединения с -i
Некоторым нравится использовать netstat для получения сетевых подключений, но я предпочитаю использовать для этого lsof.
Дисплей показывает вещи в интуитивно понятном для меня формате, и мне нравится знать, что и оттуда, а также я могу просто изменить свой синтаксис и получить больше информации, используя ту же команду.
# lsof -i
COMMANDPID USER FD TYPE DEVICE SIZE NODE NAMEdhcpcd 6061 root 4u IPv4 4510 UDP *:bootpcsshd 7703 root 3u IPv66499 TCP *:ssh (LISTEN)sshd 7892 root 3u IPv66757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
Получить только трафик IPv6 с -i 6
# lsof -i 6
Показать только TCP-соединения (работает так же для UDP)
Вы также можете отображать только соединения TCP или UDP, указав протокол сразу после -i.
# lsof -iTCP
COMMANDPID USER FD TYPE DEVICE SIZE NODE NAMEsshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
Показать сеть, связанную с определенным портом, используя -i: порт
# lsof -i :22
COMMANDPID USER FD TYPE DEVICE SIZE NODE NAMEsshd 7703 root 3uIPv6 6499 TCP *:ssh (LISTEN)sshd 7892 root 3uIPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
Показать соединения с конкретным хостом, используя @host
Это очень полезно, когда вы проверяете, есть ли у вас открытые соединения с данным хостом в сети или в Интернете.
# lsof -i@172.16.12.5
sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->172.16.12.5:49901 (ESTABLISHED)
Показать соединения на основе хоста и порта, используя @host: port
Вы также можете комбинировать отображение информации по хосту и порту.
# lsof -i@172.16.12.5:22
sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
Найти прослушиваемые порты
Найдите порты, ожидающие соединения.
# lsof -i -sTCP:LISTEN
Вы также можете сделать это, набрав «LISTEN».
# lsof -i | grep -i LISTEN
iTunes 400 daniel 16uIPv4 0x45752280t0 TCP *:daap (LISTEN)
Найти установленные соединения
Вы также можете показать любые соединения, которые уже закреплены.
# lsof -i -sTCP:ESTABLISHED
Вы также можете сделать это, просто выполнив поиск «ESTABLISHED» в выводе с помощью grep.
# lsof -i | grep -i ESTABLISHED
firefox-b 169 daniel49u IPv4 0t0 TCP 1.2.3.3:1863->1.2.3.4:http (ESTABLISHED)
Информация о пользователе
Вы также можете получить информацию о различных пользователях и о том, что они делают в системе, включая их активность в сети, их взаимодействие с файлами и т. д.
# lsof -u daniel
-- snipped --Dock 155 danieltxt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylibDock 155 danieltxt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylibDock 155 danieltxt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylibDock 155 danieltxt REG 14,2132008 823505 /usr/lib/libgcc_s.1.dylibDock 155 danieltxt REG 14,2212160 823214 /usr/lib/libauto.dylib-- snipped -
Показать, что делают все пользователи, кроме определенного пользователя, используя -u ^ user
# lsof -u ^daniel
-- snipped --Dock 155 jimtxt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylibDock 155 jimtxt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylibDock 155 jimtxt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylibDock 155 jimtxt REG 14,2132008 823505 /usr/lib/libgcc_s.1.dylibDock 155 jimtxt REG 14,2212160 823214 /usr/lib/libauto.dylib-- snipped --
Остановить «убить» все, что делает данный пользователь
Приятно иметь возможность уничтожать все, что запускается данным пользователем.
# kill -9 `lsof -t -u daniel`
Команды и процессы
Часто бывает полезно узнать, чем занимается данная программа или процесс, и с помощью lsof вы можете сделать это по имени или по идентификатору процесса.
Вот несколько вариантов:
# lsof -c syslog-ng
COMMANDPID USER FD TYPE DEVICESIZE NODE NAMEsyslog-ng 7547 rootcwdDIR3,34096 2 /syslog-ng 7547 rootrtdDIR3,34096 2 /syslog-ng 7547 roottxtREG3,31135241064970 /usr/sbin/syslog-ng-- snipped --
Посмотрите, что у данного идентификатора процесса открытj, используя -p
# lsof -p 10075
-- snipped --sshd10068 rootmemREG3,3 34808 850407 /lib/libnss_files-2.4.sosshd10068 rootmemREG3,3 34924 850409 /lib/libnss_nis-2.4.sosshd10068 rootmemREG3,3 26596 850405 /lib/libnss_compat-2.4.sosshd10068 rootmemREG3,3200152 509940 /usr/lib/libssl.so.0.9.7sshd10068 rootmemREG3,3 46216 510014 /usr/lib/liblber-2.3sshd10068 rootmemREG3,3 59868 850413 /lib/libresolv-2.4.sosshd10068 rootmemREG3,3 1197180 850396 /lib/libc-2.4.sosshd10068 rootmemREG3,3 22168 850398 /lib/libcrypt-2.4.sosshd10068 rootmemREG3,3 72784 850404 /lib/libnsl-2.4.sosshd10068 rootmemREG3,3 70632 850417 /lib/libz.so.1.2.3sshd10068 rootmemREG3,39992 850416 /lib/libutil-2.4.so-- snipped --
Опция -t возвращает только PID
# lsof -t -c Mail
350
Файлы и каталоги
Просматривая данный файл или каталог, вы можете увидеть, что с ним взаимодействует в системе, включая пользователей, процессы и т. д.
# lsof /var/log/messages/
COMMANDPID USER FD TYPE DEVICE SIZE NODE NAMEsyslog-ng 7547 root4w REG3,3 217309 834024 /var/log/messages
Показать все, что взаимодействует с данным файлом
# lsof /home/daniel/firewall_whitelist.txt
Расширенное использование
Подобно tcpdump, мощность lsof действительно проявляется, когда вы начинаете комбинировать запросы.
# lsof -u daniel -i @1.1.1.1
bkdr 1893 daniel 3uIPv6 3456 TCP 10.10.1.10:1234->1.1.1.1:31337 (ESTABLISHED)
Совместное использование параметров -t и -c для процессов HUP
# kill -HUP `lsof -t -c sshd`
Показать открытые соединения с диапазоном портов
# lsof -i @fw.google.com:2150=2180
Заключение
Эти примеры просто нацарапывают на поверхности функциональности lsof.
Для полной справки, запустите man lsof или проверьте онлайн-версию.
Я надеюсь, что статья была полезна для вас, и, как всегда, комментарии и исправления приветствуются.
0 Комментарии