用 lsof 替代 netstat 和 ps

lsof

关键选项

  • 默认 : 没有选项,lsof列出活跃进程的所有打开文件
  • 组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
  • -a : 结果进行“与”运算(而不是“或”)
  • -l : 在输出显示用户ID而不是用户名
  • -h : 获得帮助
  • -t : 仅获取进程ID
  • -U : 获取UNIX套接口地址
  • -F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)

获取网络信息

使用 -i 显示所有连接

# lsof -i

使用 -i 6 仅获取IPv6流量

# lsof -i 6

仅显示 TCP 连接(同理可获得UDP连接)

# lsof -iTCP

使用 -i:port 来显示与指定端口相关的网络信息

# lsof -i :22

使用 @host 来显示指定到指定主机的连接

在检查是否开放连接到网络中或互联网上某个指定主机的连接时十分有用。

# lsof -i@172.16.12.5

使用 @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 daniel

使用 -u user 来显示除指定用户以外的其它所有用户所做的事情

# lsof -u ^daniel

杀死指定用户所做的一切事情

消灭指定用户运行的所有东西

# kill -9 `lsof -t -u daniel`

命令和进程

查看指定程序或进程由什么启动,使用lsof通过名称或进程ID过滤来完成这个任务

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

# lsof -c syslog-ng

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

# lsof -p 10075

-t 选项只返回 PID

# lsof -t -c Mail

文件和目录

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

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

# lsof /var/log/messages/

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

# lsof /home/daniel/firewall_whitelist.txt

高级用法

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

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

# lsof -u daniel -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