Linux的lsof命令介绍

357 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

lsof

lsof(list open files)可以列出当前系统中进程打开的所有文件,在Linux环境下,我们可以理解为一切(包括网络套接口)皆文件。在实际使用过程中,lsof是一款非常强大的系统监控和系统诊断工具。

lsof -h

显示帮助文档来展示其包含的命令,可以看到其命令还是非常多的,很强大。你可以使用它来获得你系统上设备的信息,你能通过它了解到指定的用户在指定的地点正在碰什么东西,或者甚至是一个进程正在使用什么文件或网络连接。 image.png

注: lsof命令的默认行为是对结果进行"或"运算。因此,如果你正是用-i来拉出一个端口列表,同时又用-p来拉出一个进程列表,那么默认情况下你会获得两者的结果。

一些常见的选项

  • 默认: 没有选项,lsof列出活跃进程的所有打开文件

  • -a: 结果进行"与"运算(而不是"或")

  • -l: 在输出显示用户Id而不是用户名

  • -t: 获得进程id

  • -u: 获取UNIX套接口地址

  • -F: 格式化输出结果

获取网络信息

  • -i 显示所有连接

image.png

  • -i 6 仅获取Ipv6流量

lsof -i 6
  • 仅显示TCP连接(同理可获得UDP连接)

lsof -iTCP
  • 查询指定端口相关的网络信息

通过端口搜索,方便找到端口被占用情况

lsof -i :8080
  • 使用@host来显示指定到主机的链接

lsof -i@10.0.0.1

image.png

  • 使用@host:port 显示基于主机与端口的连接

lsof -i@172.16.12.5:22
  • 找出监听端口

找出正等候连接的端口

lsof -i -sTCP:LISTEN
或者
lsof -i | grep -i LISTEN
  • 找出已建立的连接

lsof -i -sTCP:ESTABLISHED
或者
lsof -i | grep -i ESTABLISHED

用户信息

  • -u显示指定用户打开了什么

lsof -u xxxx
  • 杀死指定用户所做的一切事情

kill -9 `lsof -t -u whoops`

命令和进程

可以查看指定程序或进程由什么启动,这通常会很有用,而你可以使用lsof通过名称或进程ID过滤来完成这个任务。下面列出了一些选项:

使用-c查看指定的命令正在使用的文件和网络连接

lsof -c syslog-ng

使用-p查看指定进程ID已打开的内容

lsof -p 10075 

-t选项只返回PID

lsof -t -c Mail

文件和目录

通过查看指定文件或目录,你可以看到系统上所有正与其交互的资源——包括用户、进程等。

显示与指定目录交互的所有一切

lsof /var/log/messages/

显示与指定文件交互的所有一切

lsof /home/whoops/test.txt

高级用法

tcpdump类似,当你开始组合查询时,它就显示了它强大的功能。

显示whoops连接到1.1.1.1所做的一切

lsof -u whoops -i @1.1.1.1 

同时使用-t和-c选项以给进程发送 HUP 信号

kill -HUP `lsof -t -c sshd`

lsof +L1显示所有打开的链接数小于1的文件

这通常(当不总是)表示某个攻击者正尝试通过删除文件入口来隐藏文件内容。

# lsof +L1

显示某个端口范围的打开的连接

# lsof -i @fw.google.com:2150=2180