lsof 命令详解

| 选择喜欢的代码风格  

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

lsof 命令安装:


-bash: lsof: command not found

#Debian
apt-get install lsof

#Ubuntu
apt-get install lsof

#Alpine
apk add lsof

#Arch Linux
pacman -S lsof
 
#Kali Linux
apt-get install lsof

#CentOS
yum install lsof

#Fedora
dnf install lsof

#OS X
brew install lsof

#Raspbian
apt-get install lsof

#Docker
docker run cmd.cat/lsof lsof

lsof 命令补充说明:


lsof (list open files)命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 命令需要访问核心内存和各种文件,所以需要 root 用户执行

在 Linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。

lsof 命令语法:


lsof (选项)

lsof 命令选项:


-a:列出打开文件存在的进程;
-c<进程名>: 列出指定进程所打开的文件;
-g: 列出GID号进程详情;
-d<文件号>: 列出占用该文件号的进程;
+d<目录>: 列出目录下被打开的文件;
+D<目录>: 递归列出目录下被打开的文件;
-n<目录>: 列出使用NFS的文件;
-l: 在输出显示用户ID而不是用户名
-i<条件>: 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>: 列出指定进程号所打开的文件;
-u: 列出UID号进程详情;
-h: 显示帮助信息;
-t: 仅获取进程ID;
-U: 获取UNIX套接口地址;
-F: 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
-v: 显示版本信息。

lsof 命令实例:


lsof 使用 -i 显示所有连接:

lsof -i

COMMAND     PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
ntpd        502   ntp   16u  IPv4    14021      0t0  UDP *:ntp 
ntpd        502   ntp   17u  IPv6    14022      0t0  UDP *:ntp 
ntpd        502   ntp   18u  IPv4    11251      0t0  UDP localhost:ntp 
ntpd        502   ntp   19u  IPv6    11252      0t0  UDP localhost:ntp 
ntpd        502   ntp   21u  IPv4    15821      0t0  UDP TestMaster:ntp 
ntpd        502   ntp   22u  IPv6    15822      0t0  UDP TestMaster:ntp 
dhclient    698  root    6u  IPv4    15808      0t0  UDP *:bootpc 

lsof 使用 -i 6 仅获取 IPv6 流量:

lsof -i 6

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

lsof  -iTCP

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

lsof -i:3306

COMMAND  PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
mysqld  1324 mysql   19u  IPv6    18088      0t0  TCP *:mysql (LISTEN)
...

lsof 其他奇淫巧技:

# lsof 使用 @host 来显示指定到指定主机的连接
lsof  -i@172.16.12.5

# lsof 使用 @host:port 显示基于主机与端口的连接
lsof  -i@172.16.12.5:22

# lsof 找出正等候连接的端口,你也可以 grep “LISTEN” 来完成该任务。
lsof  -i -sTCP:LISTEN
lsof  -i |  grep  -i LISTEN

# lsof 找出已建立的连接, 也可以通过 grep 搜索 “ESTABLISHED” 来完成该任务
lsof  -i -sTCP:ESTABLISHED

lsof 使用 -u 显示指定用户打开了什么:

lsof -u root

COMMAND     PID USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1 root  cwd       DIR              253,1      4096         64 /
systemd       1 root  rtd       DIR              253,1      4096         64 /
systemd       1 root  txt       REG              253,1   1612152       1521 /usr/lib/systemd/systemd
systemd       1 root  mem       REG              253,1     20112    6326639 /usr/lib64/libuuid.so.1.3.0
systemd       1 root  mem       REG              253,1    261456    6326650 /usr/lib64/libblkid.so.1.1.0
systemd       1 root  mem       REG              253,1     90248    6326913 /usr/lib64/libz.so.1.2.7
systemd       1 root  mem       REG              253,1    157424    6326920 /usr/lib64/liblzma.so.5.2.2
systemd       1 root  mem       REG              253,1     23968    6333378 /usr/lib64/libcap-ng.so.0.0.0
systemd       1 root  mem       REG              253,1     19896    6333372 /usr/lib64/libattr.so.1.1.0
systemd       1 root  mem       REG              253,1     19288    6293392 /usr/lib64/libdl-2.17.so
systemd       1 root  mem       REG              253,1    402384    6322358 /usr/lib64/libpcre.so.1.2.0
systemd       1 root  mem       REG              253,1   2151672    6293390 /usr/lib64/libc-2.17.so
systemd       1 root  mem       REG              253,1    141968    6747254 /usr/lib64/libpthread-2.17.so
systemd       1 root  mem       REG              253,1     88776    6367865 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd       1 root  mem       REG              253,1     43776    6747346 /usr/lib64/librt-2.17.so
systemd       1 root  mem       REG              253,1    273616    6326930 /usr/lib64/libmount.so.1.1.0
systemd       1 root  mem       REG              253,1     91800    6333720 /usr/lib64/libkmod.so.2.2.10
systemd       1 root  mem       REG              253,1    127096    6326632 /usr/lib64/libaudit.so.1.0.0
...

# 列出除了 root 以外用户打开的文件
lsof -u ^root 

# kill + lsof 杀死指定用户所做的一切事情
kill  -9  `lsof -t -u commandnotfound`

lsof 显示 commandnotfound 连接到 1.1.1.1 所做的一切

lsof  -u commandnotfound -i @1.1.1.1

lsof 命令扩展阅读:




lsof 命令评论