文章目录
- 前言
- 一. lsof命令介绍
- 二. 语法格式及常用选项
- 三. 参考案例
- 3.1 显示系统打开的文件
- 3.2 查找某个文件相关的进程
- 3.3 列出某个用户打开的文件信息
- 3.4 列出某个程序进程所打开的文件信息
- 3.5 查看某个进程号打开的文件
- 3.6 列出所有的网络连接
- 3.7 列出谁在使用某个端口
- 3.8 恢复误删除的文件
- 总结
前言
大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第45篇文章。
专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
🏠个人主页:我是沐风晓月
🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业😉😉
💕 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步🍺🍺🍺
💕欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信😘
一. lsof命令介绍
lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP),是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
lsof 查看的文件可以是:
- 普通文件
- 目录
- 字符或块设备文件
- 共享库
- 管道、命名管道
- 符号链接
- 网络文件(如 NFS file、网络 socket,Unix 域名 socket)
- 其它类型的文件,等等
二. 语法格式及常用选项
常用的命令选项如下表:
参数 | 描述 |
---|---|
-a | 列出打开文件存在的进程 |
-c | <进程名> 列出指定进程所打开的文件 |
-g | 列出GID号进程详情 |
-d | <文件号> 列出占用该文件号的进程 |
+d | <目录> 列出目录下被打开的文件 |
+D | <目录> 递归列出目录下被打开的文件 |
-n | <目录> 列出使用NFS的文件 |
-i | <条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip ) |
-p | <进程号> 列出指定进程号所打开的文件 |
-u | 列出UID号进程详情 |
-h | 显示帮助信息 |
-v | 显示版本信息 |
三. 参考案例
3.1 显示系统打开的文件
也就是查找谁在使用文件系统:
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
[root@mufenggrow ~]# lsof |head -5
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 root rtd DIR 253,0 224 64 /
systemd 1 root txt REG 253,0 1616360 17335469 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20112 171185 /usr/lib64/libuuid.so.1.3.0
[root@mufenggrow ~]#
输出的内容,第一行的参数解释:
参数 | 描述 |
---|---|
COMMAND: | 进程的名称 |
PID | 进程标识符 |
USER | 进程所有者 |
FD | 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 |
TYPE | 文件类型,如DIR、REG等 |
DEVICE | 指定磁盘的名称 |
SIZE | 文件的大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
关于FD列的介绍:
FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上面代码中显示的 /usr/lib/systemd/systemd程序
其他常用的参数如下表:
参数 | 描述 |
---|---|
cwd | 表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 |
txt | 该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 |
lnn | library references (AIX); |
er | FD information error (see NAME column); |
jld | jail directory (FreeBSD); |
ltx | shared library text (code and data); |
mem | memory-mapped file; |
mmap | memory-mapped device; |
pd | parent directory; |
rtd | root directory; |
tr | kernel trace file (OpenBSD); |
0 | 表示标准输出 |
1 | 表示标准输入 |
2 | 表示标准错误 |
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
关于Type 列的介绍:
缩写 | 含义 |
---|---|
DIR | 表示目录 |
CHR | 表示字符类型 |
BLK | 块设备类型 |
UNIX UNIX 域套接字 | |
FIFO | 先进先出 (FIFO) 队列 |
IPv4 | 网际协议 (IP) 套接字 |
3.2 查找某个文件相关的进程
查找某个文件相关的进程,换句话说就是查看谁在使用某个文件
[root@mufenggrow ~]# lsof /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ksmtuned 6230 root txt REG 253,0 964608 50423603 /usr/bin/bash
bash 19925 root txt REG 253,0 964608 50423603 /usr/bin/bash
bash 20483 root txt REG 253,0 964608 50423603 /usr/bin/bash
bash 21114 root txt REG 253,0 964608 50423603 /usr/bin/bash
可以看到PID,进程号,和某个命令command
3.3 列出某个用户打开的文件信息
创建一个mufeng用户,然后使用lsof -u 进行查看,mufeng用户打开的文件信息
[root@mufenggrow ~]# useradd mufeng
[root@mufenggrow ~]# echo 123456 |passwd --stdin mufeng
更改用户 mufeng 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@mufenggrow ~]# su - mufeng
[mufeng@mufenggrow ~]$ vim a.txt
查看mufeng用户打开的文件信息:
[root@mufenggrow ~]# lsof -u mufeng
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 73251 mufeng cwd DIR 253,0 139 33788283 /home/mufeng
bash 73251 mufeng rtd DIR 253,0 224 64 /
bash 73251 mufeng txt REG 253,0 964608 50423603 /usr/bin/bash
如果我们创建好用户但是不登录:
[root@mufenggrow ~]# useradd mufenggrow
[root@mufenggrow ~]# lsof -u mufenggrow
可以看到如果不登录,查看不到任何信息。
如果不想显示某个用户打开的进程,可以使用^
lsof -u ^root 表示不查看root用户打开的进程,换句话说就是root用户打开的进程不显示。
3.4 列出某个程序进程所打开的文件信息
比如我们查看MySQL进程,使用-C 参数, -c 选项将会列出所有以mysql这个进程开头的程序的文件
[root@mufenggrow ~]# yum install mariadb -y
## 此时没有启动进程,可以发现未输出任何内容
[root@mufenggrow ~]# lsof -c mysql
#启动MySQL
[root@mufenggrow ~]# systemctl restart mariadb
[root@mufenggrow ~]# lsof -c mysql
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld_sa 73597 mysql cwd DIR 253,0 224 64 /
mysqld_sa 73597 mysql rtd DIR 253,0 224 64 /
mysqld_sa 73597 mysql txt REG 253,0 964608 50423603
如果想看多个进程打开的多个文件,可以加多个-c参数。
比如:
lsof -c mysql -c apache
3.5 查看某个进程号打开的文件
这里用到-p参数,查看进程号为1的进程号打开的文件
[root@mufenggrow ~]# lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 root rtd DIR 253,0 224 64 /
如果要查看多个进程号对应的文件:
lsof -p 1,2,3
3.6 列出所有的网络连接
在这里我们可以使用 -i 列出网络连接
-i tcp 表示列出所有tcp相关的网络连接信息
-i upd 表示列出所有UDP相关的网络连接信息
[root@mufenggrow ~]# lsof -i udp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 87u IPv4 33667 0t0 UDP *:sunrpc
systemd 1 root 146u IPv6 33669 0t0 UDP *:sunrpc
rpcbind 6105 rpc 5u IPv4 33667 0t0 UDP *:sunrpc
rpcbind 6105 rpc 7u IPv6 33669 0t0 UDP *:sunrpc
rpcbind 6105 rpc 10u IPv4 34871 0t0 UDP *:rxe
rpcbind 6105 rpc 11u IPv6 34872 0t0 UDP *:rxe
avahi-dae 6158 avahi 12u IPv4 37772 0t0 UDP *:mdns
avahi-dae 6158 avahi 13u IPv4 37773 0t0 UDP *:58076
chronyd 6176 chrony 1u IPv4 38347 0t0 UDP localhost:323
chronyd 6176 chrony 2u IPv6 38348 0t0 UDP localhost:323
dnsmasq 7293 nobody 3u IPv4 46027 0t0 UDP *:bootps
dnsmasq 7293 nobody 5u IPv4 46030 0t0 UDP mufenggrow:domain
dhclient 21569 root 6u IPv4 93194 0t0 UDP *:bootpc
3.7 列出谁在使用某个端口
此时也是用 -i参数
[root@mufenggrow ~]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 73762 mysql 14u IPv4 169606 0t0 TCP *:mysql (LISTEN)
我们遇到端口冲突的时候,可以使用lsof查看端口是否被占用。
3.8 恢复误删除的文件
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。
有时候管理错误也可能导致意外删除某些重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。
这时候可以尝试使用lsof来恢复:
使用lsof 恢复文件的原理:
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。
这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
在/proc 目录下,其中包含了反映内核和进程树的各种文件,/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在磁盘中,当我们写入和读取信息的时候,实际是从内存中获取相关的信息。
我们来看看恢复过程,实验过程如下:
- 创建一个目录并创建一个文件
- 在另一个窗口打开这个文件,并保持一直打开的状态,比如使用vim命令
- 在第一个创建删掉文件
- 使用lsof进行恢复
# 创建文件
[root@mufenggrow ~]# mkdir test
[root@mufenggrow ~]# cd test/
# 拷贝一份文件过来
[root@mufenggrow test]# cp /etc/passwd ./
#在另一个窗口使用vim打开文件
# [root@mufenggrow ~]# vim passwd
# 删除文件
[root@mufenggrow test]# rm -rf passwd
# 用lsof来查看当前是否有进程打开passwd文件
[root@mufenggrow test]# lsof |grep passwd
cupsd 6850 root 10r REG 253,0 2323 17951309 /etc/passwd+ (deleted)
vim 74174 root 4u REG 253,0 12288 33994260 /root/.passwd.swp
# 这里我们发现PID6850 打开文件的文件描述符为10, 另外在passwd后面看到delete字样。
接下来我们打开文件描述符为10的文件:
[root@mufenggrow test]# head -n 10 /proc/6850/fd/10
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@mufenggrow test]# ls
#通过上面的命令我们可以确认,这个描述符为10的文件就是我们要恢复的文件
使用重定向进行文件恢复
[root@mufenggrow test]# cat /proc/6850/fd/10 > passwd
# 查看是否执行成功
[root@mufenggrow test]# cat passwd |head
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@mufenggrow test]#
我们通过上面的案例可以看到,已经恢复成功了,这里的前提就是,被删除的文件一定要有进程在使用。
总结
以上就是关于lsof命令的全部内容了,喜欢的小伙伴,一键三连哦。
✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!