👪 Команда lsof Linux учебник для начинающих

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

 

COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME

dhcpcd 6061 root 4u IPv4 4510 UDP *:bootpc

sshd 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)

 

Получить только трафик IPv6 с -i 6

 

lsof -i 6

 

Показать только TCP-соединения (работает так же для UDP)

Вы также можете отображать только соединения TCP или UDP, указав протокол сразу после -i.

 

lsof -iTCP

 

COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME

sshd 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

 

COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME

sshd 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)

 

Показать соединения с конкретным хостом, используя @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   16u  IPv4 0x4575228  0t0 TCP *:daap (LISTEN)

 

Найти установленные соединения

Вы также можете показать любые соединения, которые уже закреплены.

 

lsof -i -sTCP:ESTABLISHED

 

Вы также можете сделать это, просто выполнив поиск «ESTABLISHED» в выводе с помощью grep.

 

lsof -i | grep -i ESTABLISHED

 

firefox-b 169 daniel  49u IPv4 0t0 TCP 1.2.3.3:1863->1.2.3.4:http (ESTABLISHED)

 

Информация о пользователе

Вы также можете получить информацию о различных пользователях и о том, что они делают в системе, включая их активность в сети, их взаимодействие с файлами и т. д.

 

lsof -u daniel

 

-- snipped --

Dock 155 daniel  txt REG   14,2   2798436   823208 /usr/lib/libicucore.A.dylib

Dock 155 daniel  txt REG   14,2   1580212   823126 /usr/lib/libobjc.A.dylib

Dock 155 daniel  txt REG   14,2   2934184   823498 /usr/lib/libstdc++.6.0.4.dylib

Dock 155 daniel  txt REG   14,2    132008   823505 /usr/lib/libgcc_s.1.dylib

Dock 155 daniel  txt REG   14,2    212160   823214 /usr/lib/libauto.dylib

-- snipped -

 

Показать, что делают все пользователи, кроме определенного пользователя, используя -u ^ user

 

lsof -u ^daniel

 

-- snipped --

Dock 155 jim  txt REG   14,2   2798436   823208 /usr/lib/libicucore.A.dylib

Dock 155 jim  txt REG   14,2   1580212   823126 /usr/lib/libobjc.A.dylib

Dock 155 jim  txt REG   14,2   2934184   823498 /usr/lib/libstdc++.6.0.4.dylib

Dock 155 jim  txt REG   14,2    132008   823505 /usr/lib/libgcc_s.1.dylib

Dock 155 jim  txt REG   14,2    212160   823214 /usr/lib/libauto.dylib

-- snipped --

 

Остановить “убить” все, что делает данный пользователь

Приятно иметь возможность уничтожать все, что запускается данным пользователем.

 

kill -9 `lsof -t -u daniel`

 

Команды и процессы

Часто бывает полезно узнать, чем занимается данная программа или процесс, и с помощью lsof вы можете сделать это по имени или по идентификатору процесса.

Вот несколько вариантов:

 

lsof -c syslog-ng

 

COMMAND    PID USER   FD   TYPE     DEVICE    SIZE       NODE NAME

syslog-ng 7547 root  cwd    DIR    3,3    4096   2 /

syslog-ng 7547 root  rtd    DIR    3,3    4096   2 /

syslog-ng 7547 root  txt    REG    3,3  113524  1064970 /usr/sbin/syslog-ng

-- snipped --

 

Посмотрите, что у данного идентификатора процесса открытj, используя -p

 

lsof -p 10075

 

-- snipped --

sshd    10068 root  mem    REG    3,3   34808 850407 /lib/libnss_files-2.4.so

sshd    10068 root  mem    REG    3,3   34924 850409 /lib/libnss_nis-2.4.so

sshd    10068 root  mem    REG    3,3   26596 850405 /lib/libnss_compat-2.4.so

sshd    10068 root  mem    REG    3,3  200152 509940 /usr/lib/libssl.so.0.9.7

sshd    10068 root  mem    REG    3,3   46216 510014 /usr/lib/liblber-2.3

sshd    10068 root  mem    REG    3,3   59868 850413 /lib/libresolv-2.4.so

sshd    10068 root  mem    REG    3,3 1197180 850396 /lib/libc-2.4.so

sshd    10068 root  mem    REG    3,3   22168 850398 /lib/libcrypt-2.4.so

sshd    10068 root  mem    REG    3,3   72784 850404 /lib/libnsl-2.4.so

sshd    10068 root  mem    REG    3,3   70632 850417 /lib/libz.so.1.2.3

sshd    10068 root  mem    REG    3,3    9992 850416 /lib/libutil-2.4.so

-- snipped --

 

Опция -t возвращает только PID

 

lsof -t -c Mail

 

350

 

Файлы и каталоги

Просматривая данный файл или каталог, вы можете увидеть, что с ним взаимодействует в системе, включая пользователей, процессы и т. д.

 

lsof /var/log/messages/

 

COMMAND    PID USER   FD   TYPE DEVICE   SIZE   NODE NAME

syslog-ng 7547 root    4w   REG    3,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 3u  IPv6 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 или проверьте онлайн-версию.

Я надеюсь, что статья была полезна для вас, и, как всегда, комментарии и исправления приветствуются.