Показать статистику
0 голосов
от (560 баллов)
редактировать от
Добрый день. Как использовать утилиту lsof для просмотра открытых сетевых сокетов и усиления своей сетевой безопасностью?
2.4тыс. просмотров 1 ответов

1 Ответ

0 голосов
от (26.4тыс. баллов)
редактировать от

Имя lsof означает «Список открытых файлов» и предоставляет информацию обо всех файлах, открытых каким-либо процессом. Открытые файлы могут относиться к нескольким типам файлов, включая обычные файлы, каталоги, сетевые потоки, выполнение ссылок, блочные файлы и так далее. Наиболее распространенное использование lsof - отладка системных проблем. Сетевые администраторы Linux также полагаются на lsof при устранении неполадок в сети. Рассмотрим самые распространенные и  чрезвычайно полезные примеры lsof, чтобы помочь пользователям изучить эту команду более подробно.

Наиболее используемые команды Isof в Linux

Поскольку файловая система Linux рассматривает все в вашей системе как файл, обязательно иметь лучший контроль над вашими файлами. Утилита lsof позволяет вам сделать это и предоставляет гораздо больше дополнительной информации, полезной при отладке. Сетевые администраторы могут использовать lsof для просмотра открытых сетевых сокетов и усиления своей сетевой безопасности, используя эту информацию.

команда lsof в Linux

Список всех открытых файлов

В простейшем случае lsof распечатывает все открытые в данный момент файлы. Не паникуйте, когда увидите кучу неизвестных файлов. Это системные файлы, созданные базовыми процессами и ядром Linux. Выходная информация делится на несколько столбцов, таких как COMMAND, PID, USER, FD и TYPE.

$ lsof
$ lsof | less

COMMAND обозначает программу, которая вызвала файл, PID обозначает идентификатор процесса, TYPE представляет тип файла, а FD - дескриптор файла. Вы узнаете о них больше по мере прохождения этого руководства.

Не выводить блоки ядра

Выходные данные вышеупомянутой команды содержат много block files, которые открываются ядром и не имеют большого смысла для большинства нетехнических пользователей. К счастью, lsof позволяет нам подавлять эти файлы с помощью опции -b .

$ lsof -b

Теперь lsof будет избегать перечисления блоков ядра и гарантирует, что такие команды, как stat , lstat и readlink, будут работать без проблем. Этот параметр следует использовать при работе с низкоуровневыми системными файлами и т. д.

Список файлов на основе имени пользователя

Мы можем легко перечислить все открытые файлы для конкретного пользователя с помощью команды lsof Linux. Просто добавьте опцию -u , а затем имя пользователя.

$ lsof -u abc

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

$ lsof -u aaa,bbb,ccc

Теперь в нем будут перечислены файлы, открытые тремя гипотетическими пользователями. Вы также можете добавить оператор ^(negation) перед именем пользователя. Это заставит lsof пропустить файлы, которые открыты этими пользователями.

$ lsof -u ^xyz

Список сетевых файлов

Сетевые файлы - это файлы, связанные со стеком TCP / IP, а именно сокеты. Вы можете использовать опцию -i, чтобы вывести список всех открытых сетевых файлов, используя lsof.

$ lsof -i

Он напечатает все сетевые файлы вместе с их типом и соответствующими протоколами. Используйте -i4 или -i6 для просмотра списка файлов IPv4 и IPv6.

$ lsof -i4
$ lsof -i6

Список всех сессий TCP / UDP

Приведенные ниже команды демонстрируют, как использовать lsof для распечатки всех открытых в настоящее время процессов TCP и UDP. TCP или Transmission Control Protocol - это протокол связи, используемый современными сетями. Чтобы вывести список всех процессов TCP, используйте следующую команду.

$ lsof -i TCP

UDP или User Datagram Protocol - это протокол без сохранения состояния, используемый для передачи данных с малой задержкой. Вы можете использовать следующую команду для вывода списка всех процессов UDP с помощью lsof.

$ lsof -i UDP

Список процессов, запущенных на определенных портах

Опция -i также позволяет администраторам перечислять все файлы, которые запускаются на определенном порту. Это полезно при устранении неполадок в сети и позволяет администраторам определять надежные правила Linux iptables .

$ lsof -i TCP:22

Эта команда выведет список процессов, которые выполняются на TCP-порте 22. Демон ssh обычно работает на порте 22. Вы также можете проверить другие порты. Команда ниже ищет все процессы, работающие на порте 443.

$ lsof -i TCP:443

Перечислите процессы, запущенные в диапазоне портов

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

$ lsof -i TCP:1-1024

Теперь lsof будет искать процессы, запущенные на любом порту TCP в диапазоне 1-1024, и перечислять все активные файлы, созданные этими процессами.

image

Список файлов с использованием PID

PID или ID процесса - это уникальный идентификатор, используемый для маркировки процессов операционной системы. Команда lsof позволяет администраторам искать и выводить список файлов на основе их PID. Команда ниже перечисляет все файлы, связанные с идентификатором процесса 1.

$ lsof -p 1

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

$ lsof -p 1,2,3,^111

Эта команда выведет список всех файлов, открытых процессами 1, 2 и 3. Она пропустит те файлы, которые были открыты процессом 111.

Список файлов определенной файловой системы

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

$ lsof /proc
$ lsof /run/
$ lsof /sys/

Каталог /proc содержит информацию об активных запущенных процессах. Вы можете легко проверить эту информацию, используя lsof в дистрибутивах Linux и BSD.

Список доменных сокетов Unix

Утилита lsof позволяет нам выводить список всех файлов сокетов Unix или сокетов IPC (межпроцессное взаимодействие). Эти файлы позволяют хосту взаимодействовать с другими процессами на машине. Взгляните на приведенный ниже пример, чтобы увидеть, как это работает.

$ lsof -U

Чтобы найти все файлы сокетов Unix с разными идентификаторами процесса, используйте следующую команду lsof.

$ lsof -U -a -p 18250

Замените 18250 на PID процесса, который вы хотите посмотреть. Он представит все доменные сокеты Unix, содержащие один и тот же PID.

Список всех активных PID

Утилита lsof также позволяет администраторам перечислять все запущенные в данный момент процессы, используя их PID. Это полезно в ряде ситуаций, таких как передача результата в команду Linux kill и так далее.

$ lsof -t
$ lsof -t -i

Первая команда просто выполняет обычный lsof, а затем пропускает все выходные поля, кроме PID. Второй вариант отображает PID только сетевых процессов. Мы можем просто выполнить поиск определенного PID и передать его другим командам.

Список файлов на устройстве

Файлы устройств - это особый тип файлов в системах Linux и BSD . Они обычно действуют как интерфейс для различных драйверов устройств и не ведут себя как обычные файлы. В следующем примере показано, как составить список всех открытых файлов определенного устройства.

$ lsof /dev/sda9 | less

Вы можете перечислить свои блочные устройства с помощью команды lsblk . Большинство современных дистрибутивов Linux хранят эти файлы в каталоге /dev .

Список файлов терминала

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

$ lsof /dev/tty*
$ lsof /dev/tty2
$ lsof /dev/ttyS0

Первая команда выводит список открытых файлов для всех управляющих терминалов, тогда как вторая команда предназначена для конкретной консоли. В последнем примере перечислены файлы, связанные с вашим последовательным портом (/dev/ttyS0).

от (26.4тыс. баллов)
редактировать от
0

Список открытых файлов в каталогах

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

$ lsof +D Documents
$ sudo lsof +D ~/

Первая команда выводит список всех открытых файлов в каталоге Documents. Вторая команда выводит список всех открытых файлов в домашнем каталоге и его подкаталогах. Вторая команда будет работать даже без sudo,  но покажет некоторые предупреждения в выводе.

Рекурсивный список открытых файлов в каталогах

Приведенная выше команда будет отображать только файлы, которые открыты в каталоге документов. Он не будет отображать открытые файлы в подкаталогах документов. К счастью, lsof предоставляет еще одну удобную опцию, чтобы включить это. Посмотрите на приведенный ниже пример для лучшего понимания этой опции.

$ lsof +d Documents
$ sudo lsof +d ~/

Эта команда отобразит все открытые файлы в каталоге Documents, а затем опустится в подкаталоги, если таковые имеются. Обратите внимание, что это может занять очень много времени, если Документы большие и имеют много подкаталогов.

Список открытых файлов на основе процесса

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

$ lsof -c chrome

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

image

Список ID родительского процесса (PPID)

Утилита lsof позволяет администраторам перечислять идентификационный номер родительского процесса (PPID) вместе с обычными полями вывода. Вам нужно будет передать опцию -R, чтобы включить это, как показано ниже.

$ lsof -R
$ lsof -p [PID HERE] -R

Первая команда выводит все текущие активные процессы вместе с информацией о PPID. Последняя команда берет номер PID и отображает PPID для этого процесса.

Список PID, которые открыли файл

Следующая команда перечисляет все идентификаторы процессов, которые открыли определенный файл. Здесь мы используем опцию -t, представленную ранее.

$ lsof -t /usr/share/mime/mime.cache

Поскольку опция -t предоставляет только PID, мы используем ее для получения ожидаемого результата. Эта команда выведет список всех идентификаторов процессов, которые открыли документ /usr/share/mime/mime.cache .

Список файлов на основе файловых дескрипторов

Мы можем дать команду lsof составить список открытых файлов на основе файловых дескрипторов. Следующая команда показывает, как найти все открытые в настоящее время файлы, для которых поле FD (дескриптор файла) установлено как cwd (текущий рабочий каталог).

$ lsof -d cwd
$ lsof -u xyz -d cwd -a

Первая команда выведет каждый открытый файл в текущем рабочем каталоге. Вторая команда выводит список файлов, которые принадлежат пользователю xyz. Для этого бита требуется опция -a , и команда не будет работать должным образом без этой опции.

Показать вывод для других программ

Команда lsof позволяет администраторам производить вывод для анализа с помощью внешних инструментов, таких как awk, Perl и язык программирования C. Вам нужно будет передать опцию -F вместе со списками символов для идентификации поля.

$ lsof -F
$ lsof -FucsS

Первая команда создает полезный вывод, который можно сохранить с помощью оператора перенаправления ( > ) и проанализировать позже. Во втором примере изменяется вывод для размещения дополнительных данных, таких как имя команды процесса, идентификатор пользователя, идентификация потока и размер.

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

Часто lsof не может найти некоторые элементы, запрошенные пользователем. Найти эти предметы довольно сложно, поскольку продукция lsof очень обширна. К счастью, опция -V позволяет lsof распечатывать эти элементы очень удобно.

$ lsof -V
$ lsof -c ssh -c http -V
$ lsof -p 12312312 -V

В первом примере будут перечислены все такие файлы, которые lsof не смог найти. Второй пример можно использовать для определения наличия каких-либо команд процесса, имена которых начинаются с ssh или http. Последний пример иллюстрирует использование -V для идентификаторов процессов.

Показать информацию о TCP / TPI

По умолчанию lsof предоставляет мало информации о соединениях TCP / TPI. Предоставляет только отчеты о состояниях соединения. Однако мы можем использовать опцию -T для включения дополнительных функций отчетности, как показано ниже.

$ lsof -i -Tq
$ lsof -i -Tqs

Первая команда покажет длину очереди (q) в своем выводе. Вторая команда покажет состояние соединения вместе с длиной очереди. По умолчанию это -Ts, и когда вы используете только -T , он отключит все отчеты TCP/TPI.

Отключить преобразование номера порта

Опция -P позволяет администраторам отключать преобразование номеров портов в имена при поиске сетевых файлов или сокетов Unix. Это может сэкономить значительное количество времени, когда таких файлов слишком много.

$ lsof -i -Tqs -P

Вы можете сравнить время, затрачиваемое этой командой, со временем, затраченным той же командой, но без опции -P . Для этой цели мы будем использовать стандартный инструмент Linux для терминала.

$ time lsof -i -Tqs
$ time lsof -i -Tqs -P

Время выполнения сокращается примерно до ⅙

Отключить преобразование имени хоста

Как и имена портов, мы также можем отключить преобразование имени хоста из сетевых номеров. Это также приведет к значительному увеличению производительности, как вы увидите. Команда time снова пригодится для доказательства этого.

$ lsof -i -n

На этот раз lsof не будет преобразовывать номера сетей в имена хостов. Используйте следующие команды, чтобы проверить изменение скорости выполнения.

$ time lsof -i
$ time lsof -i -n
$ time lsof -i -n -P

Включить режим повтора

Команда lsof в Linux предоставляет удобный режим повтора для мониторинга оперативных операций без выхода из консоли вывода. Посмотрите на приведенные ниже примеры, чтобы узнать это более подробно.

$ lsof -r 5 -i UDP

Этот команда будет выводить все текущие соединения UDP через каждые 5 секунд , пока вы не завершить команду, используя Ctrl + C. Вы также можете использовать опцию + r , которая автоматически завершит.

$ lsof +r 5 -i UDP

Список всех процессов, прослушивающих порты TCP

Мы можем перечислить все процессы, которые прослушивают порты TCP, используя утилиту lsof. Для этой задачи мы будем использовать несколько уже показанных параметров. Посмотрите на приведенный ниже пример, чтобы понять, как это работает.

$ lsof -nP -i TCP -s TCP:LISTEN

Эта команда отключает преобразование имен хостов и имен портов с помощью параметров -n и -P , которые объединяются вместе. Опция -s сообщает lsof, что нас интересуют только процессы, которые прослушивают порты TCP.

Список процессов на основе протоколов

Мы также можем определить конкретные протоколы, которые нас интересуют. Быстрый просмотр приведенных ниже команд поможет вам понять это гораздо лучше.

$ lsof -i TCP:https
$ lsof -i UDP:ntp

Первая команда показывает все файлы TCP, которые используют порт https, который по умолчанию равен 443. Последняя команда показывает все файлы UDP, которые используют порт NTP (сетевой протокол времени). Следующая команда отображает все такие файлы UDP, которые используют соединения IPv4.

$ lsof -i4 -a -i UDP:ntp
от (26.4тыс. баллов)
0

Показать общее количество соединений TCP / UDP

Мы можем использовать некоторые традиционные терминальные инструменты, такие как grep и awk, чтобы распечатать общее количество активных соединений TCP или UDP. Команда ниже демонстрирует этот lsof вместе с awk, sort и uniq.

$ lsof -i | awk '{print $8}' | sort | uniq -c | grep 'TCP\|UDP'

Здесь мы использовали несколько команд для выполнения нашей задачи. Часть awk выводит секцию NODE вывода, предоставленного lsof, uniq подсчитывает количество строк, а grep ищет заданные шаблоны. Посетите руководство по командам Linux grep, чтобы узнать больше о поиске шаблонов.

Список установленных сетевых подключений

Команда ниже показывает, как получить все установленные сетевые подключения, используя стандартные инструменты Linux. Сначала мы перечислим все сетевые файлы, а затем извлечем конкретные данные из вывода, предоставленного lsof, используя awk и grep.

$ lsof -i -nP | grep ESTABLISHED | awk '{print $1, $9}' | sort -u

Опция -nP отключает преобразование имен хостов и портов. Она используется для ускорения всего процесса и не является обязательной.

Список всех активных соединений SSH

Мы также можем перечислить все ssh-соединения, сделанные из / в нашу систему, используя lsof и grep. Взгляните на следующие примеры, чтобы увидеть, как это работает.

$ lsof -i TCP | grep ssh | grep ESTABLISHED
$ lsof -nP -iTCP -sTCP:ESTABLISHED | grep SSH

Обе вышеперечисленные команды работают примерно одинаково. Однако последняя работает быстрее из-за использования некоторых флагов запрета, таких как -n и -P .

Список процессов на основе доступа к файлам

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

$ lsof `which lsof`
$ lsof `which kate`

Таким образом, просто передавая конкретный файл в lsof с помощью обратных кавычек, мы можем сделать это. Вы можете заменить любой из перечисленных файлов файлами, которые вы хотите проверить, и получить список процессов, которые обращаются к нему. Используйте параметр -t, чтобы получить только PID.

$ lsof -t `which chrome`
$ lsof -t `which nmap`

Убить процессы, которыми владеет пользователь

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

$ sudo kill -9 `lsof -t -u ABC`

Вы должны заменить ABC фактическим именем пользователя для успешного уничтожения процессов, порожденных этим пользователем. В этих дистрибутивах Linux  , а также в BlackArch Linux , вам понадобятся привилегии sudo, если вы хотите уничтожить процессы других пользователей.

Отображение файлов с использованием регулярных выражений

Утилита lsof позволяет администраторам фильтровать информацию, используя шаблоны регулярных выражений. Вам нужно будет поместить указанный шаблон в две косые черты (/), чтобы сделать эту работу. Например, в приведенном ниже примере будут перечислены все команды, содержащие более шести символов.

$ lsof -c /^......*/

Обратите внимание, что косая черта обязательна при использовании регулярных выражений с lsof. Каждая из шести точек представляет один символ, тогда как звездочка (*) обозначает, что любое число после этих шести символов является приемлемым.

Список процессов, используемых NFS

Мы можем легко перечислить все процессы, которые занимают ресурсы NFS (Network File System) на нашем сервере. Команда lsof в Linux предоставляет параметр -N для этой задачи. Смотрите пример ниже, чтобы понять это более подробно.

$ lsof -N

Выходные данные этой команды будут содержать информацию, такую как идентификаторы процессов вместе с их точкой монтирования. Эти данные очень легко извлечь с помощью команды grep и помогают уменьшить проблемы, связанные с решениями Linux NAS и SAN .

Список использованных, но удаленных файлов

Команда lsof позволяет нам определить, какие файлы использовались некоторыми процессами ранее и в настоящее время удалены. Это удобно в ряде ситуаций, например, при проверке места на диске с помощью команды Linux df

$ lsof /var/log | grep -i "deleted«»

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

Подсчет количества записей

Поскольку вывод lsof содержит много записей, их часто сложно визуализировать. Мы можем легко подсчитать количество строк, присутствующих в этих выходных данных, передав эти данные в удобный и полезный инструмент Linux под названием wc. Посмотрите на приведенный ниже пример, чтобы увидеть, как это работает.

$ lsof | wc -l
$ lsof -t -i -nP | wc -l

Включить / отключить предупреждающие сообщения

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

$ lsof -t -i -nP -w

Опция -w подавит любые потенциальные предупреждения. Вы должны использовать опцию + w для повторного включения этой функции.

$ lsof -t -i -nP +w

Таким образом, мы можем установить параметр предупреждения по мере необходимости. Это часто полезно, когда используется вместе со скриптами оболочки Linux .

Показать информацию о версии

Утилита lsof может иметь некоторые различия между вариантами Linux и BSD. Мы можем перечислить информацию о версии lsof на этих машинах и увидеть полезную информацию, такую как номер редакции, дата компиляции, версия компилятора и так далее.

$ lsof -v

Она также показывает нам все параметры конфигурации, используемые для создания двоичного конечного продукта. Кроме того, значения флагов компилятора и загрузчика полезны как для системных разработчиков, так и для администраторов.

Показать страницу справки

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

$ lsof --help

Эта страница возвращает все возможные комбинации параметров lsof и полезна как для начинающих, так и для опытных пользователей Linux.

Показать страницу руководства

Руководство содержит подробное обсуждение утилиты lsof и подробно объясняет доступные параметры. Вам обязательно следует обратиться к этому руководству, если вы новый пользователь Linux и не имеете опыта работы с lsof или подобными терминальными командами Linux.

$ man lsof

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

Подводя итог

Команда lsof в Linux - это замечательный инструмент мониторинга, который позволяет администраторам визуализировать, как процессы используют различные файлы. Хотя этот инструмент кажется многим сложным, использование этого инструмента ничем не отличается от других традиционных инструментов командной строки.

Мы рассмотрели практичные примеры, которые должны вам помочь начать работу с этим инструментом. Теперь вы сможете справиться с lsof самостоятельно.


...