当前位置: 首页 > news >正文

linux基本功系列之lsof命令实战

![在这里插入图片描述](https://img-blog.csdnimg.cn/070c6fa5bad74451b93d815af234e6ea.png#

文章目录

  • 前言
  • 一. 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 程序
lnnlibrary references (AIX);
erFD information error (see NAME column);
jldjail directory (FreeBSD);
ltxshared library text (code and data);
memmemory-mapped file;
mmapmemory-mapped device;
pdparent directory;
rtdroot directory;
trkernel 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目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在磁盘中,当我们写入和读取信息的时候,实际是从内存中获取相关的信息。

我们来看看恢复过程,实验过程如下:

  1. 创建一个目录并创建一个文件
  2. 在另一个窗口打开这个文件,并保持一直打开的状态,比如使用vim命令
  3. 在第一个创建删掉文件
  4. 使用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}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!

请添加图片描述
在这里插入图片描述

http://www.lryc.cn/news/1524.html

相关文章:

  • 基础篇:02-SpringCloud概述
  • 【软件测试】软件测试工作上95%会遇到的问题,你遇到多少?
  • 4.5.4 LinkedList
  • Python之FileNotFoundError: [Errno 2] No such file or directory问题处理
  • C语言中耳熟能详的printf与scanf
  • 【数据结构】复杂度讲解
  • JAVA-线程池技术
  • 【C++】从0到1入门C++编程学习笔记 - 提高编程篇:STL常用算法(算术生成算法)
  • 【C++】static成员
  • Python Scrapy 爬虫简单教程
  • 【DOCKER】容器概念基础
  • 第九层(16):STL终章——常用集合算法
  • 一起学习用Verilog在FPGA上实现CNN----(六)SoftMax层设计
  • pixhawk2.4.8-APM固件-MP地面站配置过程记录
  • 【unity细节】关于资源商店(Package Maneger)无法下载资源问题的解决
  • [Arxiv 2022] A Novel Plug-in Module for Fine-Grained Visual Classification
  • RocketMQ Broker消息处理流程及部分源码解析
  • Java面试题:Java集合框架
  • 时间之间的比较与计算相差年、月、日、小时、分钟、毫秒、纳秒以及判断闰年--LocalDateTime
  • PyTorch学习笔记:nn.L1Loss——L1损失
  • Java程序设计-ssm企业财务管理系统设计与实现
  • 疑难杂症篇(二十一)--Ubuntu18.04安装usb-cam过程出现的问题
  • npm-npm i XX --save 和--save-dev
  • 可重构或可调谐微波滤波器技术
  • 医院智能化解决方案-门(急)诊、医技、智能化项目解决方案
  • 判断元素是否在可视区域
  • 告别传统繁杂的采购合同管理 打造企业自动化采购管理模式
  • 【prism】路由事件映射到Command命令
  • 面向对象的基本概念和方法
  • 数据可视化大屏百度地图绘制行政区域标注实战案例解析(个性化地图、标注、视频、控件、定位、检索)