命令简介

lsof 命令用于显示 Linux 系统当前已打开的所有文件列表。查看进程或系统打开的文件会给调试带来极大的帮助。下面简单地介绍 lsof 常使用的功能。

lsof (list open files)命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP),还可以用于找回/恢复被删除的文件。lsof 命令需要访问核心内存和各种文件,所以需要具备 root 超级管理员权限的用户才能执行此命令。

语法格式

lsof [Options]

选项说明

-a         #显示打开文件的进程
-c<进程名>  #显示指定进程所打开的文件
-g         #显示GID号进程详情
-d<文件号>  #显示占用该文件号的进程
+d<目录>   #显示目录下被打开的文件
+D<目录>   #递归列出目录下被打开的文件
-n<目录>   #显示使用NFS的文件
-l        #在输出显示用户ID而不是用户名
-i<条件>   #输出符合条件的进程
-p<进程号> #输出指定进程号所打开的文件
-u   #显示指定UID号进程详情
-h   #显示帮助信息
-t   #仅获取进程ID
-U   #获取UNIX套接口地址
-F   #格式化输出结果
-v   #显示版本信息

应用举例

显示所有连接

[root@CentOS7-1 ~]# lsof -i
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd   629  chrony    5u  IPv4  16952      0t0  UDP localhost:323 
chronyd   629  chrony    6u  IPv6  16953      0t0  UDP localhost:323 
sshd      866    root    3u  IPv4  19638      0t0  TCP *:ssh (LISTEN)
sshd      866    root    4u  IPv6  19647      0t0  TCP *:ssh (LISTEN)
master    976    root   13u  IPv4  20415      0t0  TCP localhost:smtp (LISTEN)
master    976    root   14u  IPv6  20416      0t0  TCP localhost:smtp (LISTEN)
netdata 18325 netdata    4u  IPv4 114083      0t0  TCP *:dnp-sec (LISTEN)
netdata 18325 netdata    5u  IPv6 114084      0t0  TCP *:dnp-sec (LISTEN)
netdata 18325 netdata   36u  IPv6 114297      0t0  UDP localhost:8125 
netdata 18325 netdata   37u  IPv4 114298      0t0  UDP localhost:8125 
netdata 18325 netdata   38u  IPv6 114302      0t0  TCP localhost:8125 (LISTEN)
netdata 18325 netdata   39u  IPv4 114303      0t0  TCP localhost:8125 (LISTEN)
sshd    18968    root    3u  IPv4 118704      0t0  TCP CentOS7-1:ssh->192.168.1.93:62148 (ESTABLISHED)

只显示IPV6的连接信息

[root@CentOS7-1 ~]# lsof -i 6
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd   629  chrony    6u  IPv6  16953      0t0  UDP localhost:323 
sshd      866    root    4u  IPv6  19647      0t0  TCP *:ssh (LISTEN)
master    976    root   14u  IPv6  20416      0t0  TCP localhost:smtp (LISTEN)
netdata 18325 netdata    5u  IPv6 114084      0t0  TCP *:dnp-sec (LISTEN)
netdata 18325 netdata   36u  IPv6 114297      0t0  UDP localhost:8125 
netdata 18325 netdata   38u  IPv6 114302      0t0  TCP localhost:8125 (LISTEN)

只显示IPV4的连接信息

[root@CentOS7-1 ~]# lsof -i 4
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd   629  chrony    5u  IPv4  16952      0t0  UDP localhost:323 
sshd      866    root    3u  IPv4  19638      0t0  TCP *:ssh (LISTEN)
master    976    root   13u  IPv4  20415      0t0  TCP localhost:smtp (LISTEN)
netdata 18325 netdata    4u  IPv4 114083      0t0  TCP *:dnp-sec (LISTEN)
netdata 18325 netdata   37u  IPv4 114298      0t0  UDP localhost:8125 
netdata 18325 netdata   39u  IPv4 114303      0t0  TCP localhost:8125 (LISTEN)
sshd    18968    root    3u  IPv4 118704      0t0  TCP CentOS7-1:ssh->192.168.1.93:62148 (ESTABLISHED)

仅显示TCP连接

[root@CentOS7-1 ~]# lsof -i tcp
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      866    root    3u  IPv4  19638      0t0  TCP *:ssh (LISTEN)
sshd      866    root    4u  IPv6  19647      0t0  TCP *:ssh (LISTEN)
master    976    root   13u  IPv4  20415      0t0  TCP localhost:smtp (LISTEN)
master    976    root   14u  IPv6  20416      0t0  TCP localhost:smtp (LISTEN)
netdata 18325 netdata    4u  IPv4 114083      0t0  TCP *:dnp-sec (LISTEN)
netdata 18325 netdata    5u  IPv6 114084      0t0  TCP *:dnp-sec (LISTEN)
netdata 18325 netdata   38u  IPv6 114302      0t0  TCP localhost:8125 (LISTEN)
netdata 18325 netdata   39u  IPv4 114303      0t0  TCP localhost:8125 (LISTEN)
sshd    18968    root    3u  IPv4 118704      0t0  TCP CentOS7-1:ssh->192.168.1.93:62148 (ESTABLISHED)

仅显示UDP连接

[root@CentOS7-1 ~]# lsof -i udp
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chronyd   629  chrony    5u  IPv4  16952      0t0  UDP localhost:323 
chronyd   629  chrony    6u  IPv6  16953      0t0  UDP localhost:323 
netdata 18325 netdata   36u  IPv6 114297      0t0  UDP localhost:8125 
netdata 18325 netdata   37u  IPv4 114298      0t0  UDP localhost:8125

显示指定端口的连接信息

[root@CentOS7-1 ~]# lsof -i :22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      866 root    3u  IPv4  19638      0t0  TCP *:ssh (LISTEN)
sshd      866 root    4u  IPv6  19647      0t0  TCP *:ssh (LISTEN)
sshd    18968 root    3u  IPv4 118704      0t0  TCP CentOS7-1:ssh->192.168.1.93:62148 (ESTABLISHED)
[root@CentOS7-1 ~]# lsof -i :80
[root@CentOS7-1 ~]# lsof -i :62148
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    18968 root    3u  IPv4 118704      0t0  TCP CentOS7-1:ssh->192.168.1.93:62148 (ESTABLISHED)

列由某个用户打开的进程或文件

[root@CentOS7-1 ~]# lsof -u root | head -5
COMMAND     PID USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1 root  cwd       DIR              253,0       262         64 /
systemd       1 root  rtd       DIR              253,0       262         64 /
systemd       1 root  txt       REG              253,0   1628608   16959493 /usr/lib/systemd/systemd
systemd       1 root  mem       REG              253,0     20064    1679454 /usr/lib64/libuuid.so.1.3.0
#列出除了root以外用户打开的文件
[root@CentOS7-1 ~]# lsof -u ^root | head
COMMAND     PID   TID    USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
polkitd     618       polkitd  cwd       DIR              253,0      262         64 /
polkitd     618       polkitd  rtd       DIR              253,0      262         64 /
polkitd     618       polkitd  txt       REG              253,0   120432   17108633 /usr/lib/polkit-1/polkitd
polkitd     618       polkitd  mem       REG              253,0    61560      18290 /usr/lib64/libnss_files-2.17.so
polkitd     618       polkitd  mem       REG              253,0    68192      40949 /usr/lib64/libbz2.so.1.0.6
polkitd     618       polkitd  mem       REG              253,0    99952     324334 /usr/lib64/libelf-0.176.so
polkitd     618       polkitd  mem       REG              253,0    19896      46144 /usr/lib64/libattr.so.1.1.0
polkitd     618       polkitd  mem       REG              253,0    20064    1679454 /usr/lib64/libuuid.so.1.3.0
polkitd     618       polkitd  mem       REG              253,0   265576      20649 /usr/lib64/libblkid.so.1.1.0

显示指定的连接信息

#显示指定到指定主机的连接
[root@CentOS7-1 ~]# lsof -i@192.168.1.100
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    18968 root    3u  IPv4 118704      0t0  TCP CentOS7-1:ssh->192.168.1.93:62148 (ESTABLISHED)
#显示指定到指定主机端口的连接
[root@CentOS7-1 ~]# lsof -i@192.168.1.100:22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    18968 root    3u  IPv4 118704      0t0  TCP CentOS7-1:ssh->192.168.1.93:62148 (ESTABLISHED)

显示某些状态的端口信息

#找出处于监听状态的端口
[root@CentOS7-1 ~]# lsof -i -sTCP:LISTEN
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      866    root    3u  IPv4  19638      0t0  TCP *:ssh (LISTEN)
sshd      866    root    4u  IPv6  19647      0t0  TCP *:ssh (LISTEN)
master    976    root   13u  IPv4  20415      0t0  TCP localhost:smtp (LISTEN)
master    976    root   14u  IPv6  20416      0t0  TCP localhost:smtp (LISTEN)
netdata 18325 netdata    4u  IPv4 114083      0t0  TCP *:dnp-sec (LISTEN)
netdata 18325 netdata    5u  IPv6 114084      0t0  TCP *:dnp-sec (LISTEN)
netdata 18325 netdata   38u  IPv6 114302      0t0  TCP localhost:8125 (LISTEN)
netdata 18325 netdata   39u  IPv4 114303      0t0  TCP localhost:8125 (LISTEN)
##找出处于已连接状态的端口
[root@CentOS7-1 ~]# lsof -i -sTCP:ESTABLISHED
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    18968 root    3u  IPv4 118704      0t0  TCP CentOS7-1:ssh->192.168.1.93:62148 (ESTABLISHED)

终止用户行为

[root@CentOS7-1 ~]# lsof -u mingongge
COMMAND   PID      USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
bash    20369 mingongge  cwd    DIR  253,0        82   462615 /home/mingongge
bash    20369 mingongge  rtd    DIR  253,0       262       64 /
bash    20369 mingongge  txt    REG  253,0    964536 50333070 /usr/bin/bash
bash    20369 mingongge  mem    REG  253,0 106172832 50333042 /usr/lib/locale/locale-archive
bash    20369 mingongge  mem    REG  253,0     61560    18290 /usr/lib64/libnss_files-2.17.so
bash    20369 mingongge  mem    REG  253,0   2156240    18266 /usr/lib64/libc-2.17.so
bash    20369 mingongge  mem    REG  253,0     19248    18273 /usr/lib64/libdl-2.17.so
bash    20369 mingongge  mem    REG  253,0    174576    20696 /usr/lib64/libtinfo.so.5.9
bash    20369 mingongge  mem    REG  253,0    163312  1679434 /usr/lib64/ld-2.17.so
bash    20369 mingongge  mem    REG  253,0     26970 16806930 /usr/lib64/gconv/gconv-modules.cache
bash    20369 mingongge    0u   CHR  136,1       0t0        4 /dev/pts/1
bash    20369 mingongge    1u   CHR  136,1       0t0        4 /dev/pts/1
bash    20369 mingongge    2u   CHR  136,1       0t0        4 /dev/pts/1
bash    20369 mingongge  255u   CHR  136,1       0t0        4 /dev/pts/1
vim     20391 mingongge  cwd    DIR  253,0        82   462615 /home/mingongge
vim     20391 mingongge  rtd    DIR  253,0       262       64 /
vim     20391 mingongge  txt    REG  253,0   2337192 51061591 /usr/bin/vim
vim     20391 mingongge  mem    REG  253,0     61560    18290 /usr/lib64/libnss_files-2.17.so
vim     20391 mingongge  mem    REG  253,0 106172832 50333042 /usr/lib/locale/locale-archive
vim     20391 mingongge  mem    REG  253,0     11392     8814 /usr/lib64/libfreebl3.so
vim     20391 mingongge  mem    REG  253,0     14424  1679441 /usr/lib64/libutil-2.17.so
vim     20391 mingongge  mem    REG  253,0     40600    18271 /usr/lib64/libcrypt-2.17.so
vim     20391 mingongge  mem    REG  253,0    115816    18278 /usr/lib64/libnsl-2.17.so
vim     20391 mingongge  mem    REG  253,0    109976    18302 /usr/lib64/libresolv-2.17.so
vim     20391 mingongge  mem    REG  253,0     19896    46144 /usr/lib64/libattr.so.1.1.0
vim     20391 mingongge  mem    REG  253,0    402384    20698 /usr/lib64/libpcre.so.1.2.0
vim     20391 mingongge  mem    REG  253,0   2156240    18266 /usr/lib64/libc-2.17.so
vim     20391 mingongge  mem    REG  253,0    142144    18300 /usr/lib64/libpthread-2.17.so
vim     20391 mingongge  mem    REG  253,0   1647328   282389 /usr/lib64/perl5/CORE/libperl.so
vim     20391 mingongge  mem    REG  253,0     19248    18273 /usr/lib64/libdl-2.17.so
vim     20391 mingongge  mem    REG  253,0     27752      669 /usr/lib64/libgpm.so.2.1.0
vim     20391 mingongge  mem    REG  253,0     37064    18281 /usr/lib64/libacl.so.1.1.0
vim     20391 mingongge  mem    REG  253,0    174576    20696 /usr/lib64/libtinfo.so.5.9
vim     20391 mingongge  mem    REG  253,0    155744  1679449 /usr/lib64/libselinux.so.1
vim     20391 mingongge  mem    REG  253,0   1136944    18275 /usr/lib64/libm-2.17.so
vim     20391 mingongge  mem    REG  253,0    163312  1679434 /usr/lib64/ld-2.17.so
vim     20391 mingongge    0u   CHR  136,1       0t0        4 /dev/pts/1
vim     20391 mingongge    1u   CHR  136,1       0t0        4 /dev/pts/1
vim     20391 mingongge    2u   CHR  136,1       0t0        4 /dev/pts/1
vim     20391 mingongge    3u   REG  253,0     12288   462619 /home/mingongge/.test.sh.swp
然后我们使用下面的命令来终止这个用户的这些操作行为
[root@CentOS7-1 ~]# kill -9 `lsof -t -u mingongge`
[root@CentOS7-1 ~]# lsof -u mingongge
#你会发现这个用户的所有操作都被终止了

这个命令组合,在日常使用环境下还可以用于检查服务器被攻击的行为,如果有行为异常的用户登录操作,可以使用管理员暂时将此用户的一切操作全部干掉,然后再找出解决方法。