登录
登录 注册新账号
注册
已有账号登录
【讲清楚,说明白!】干货--使用lsof恢复进程打开的文件
文通|Kevin.Huang 阅读 491 次
12月26日发布

目录:
(一)lsof恢复文件
(二)lsof的其他用法

* **

(一)lsof恢复文件
(1.1)如果在系统中有某个进程打开了一个文件,但是这个文件被我们误删除,此时我们希望将误删除的文件恢复。如果某个被误删除的文件所对应的进程没有关,这个文件就可以恢复。
(1.2)在Linux中的FD文件描述符与windows中的文件句柄是同样的一个概念,一个进程打开一个文件就会产生相应的文件描述符,如果这个进程将文件关闭了,那么这个文件描述符或文件句柄就会跟着释放掉了。
(1.3)我们直接执行lsof命令,可以看到如下的信息,以标红的为例,我们的sleep进程打开了/usr/lib64/ld-2.17.so库文件(图1-1)。我们也可以进行过滤,查看某一个进程打开的是哪一个文件。

lsof | grep ^sshd

图片描述
图片描述
(1.4)接下来我们查看打开文件message的进程,可以看到每一个进程打开的文件。

lsof | grep message---查看打开文件message的进程

图片描述
(1.5)同时我们可以看到记录日志的进程rsyslogd有打开我们的/var/log/messages文件,其中602表示的是PID号,6w中6表示的是句柄号,w表示以写的方式,我们在/proc/602/fd目录下便可以看到句柄号6对应的文件为/var/log/messages,表示/var/log/messages文件对应的文件正在被6号句柄进程号为602的进程打开,其中rsyslogd进程的PID号为602,所以此文件正在被rsyslogd进程打开。

lsof | grep message

ll /proc/602/fd

图片描述
(1.6)现在我们模拟不小心误删除/var/log/messages文件,接着我们通过"# ll /proc/602/fd"命令发现/var/log/messages文件显示已经被删除了

rm -rf /var/log/messages

图片描述
(1.7)由于此时我们只是文件被删除了,但是文件的句柄没有被释放,因此我们可以先通过文件描述符查看一下文件的内容是否是我们所需要的。

lsof | grep messages---查询被删除的文件是被那个进程打开的,获取PID号和文件句柄号

less /proc/602/fd/6---查看进程中的文件句柄信息是否是我们需要的

图片描述
图片描述
(1.8)我们将/proc/602/fd/6文件描述符中的内容重定向到/var/log/messages文件中。此时由于文件的状态是被删除的,但是由于文件描述符还是存在的,所以我们还是可以把文件内容找回来的。

less /proc/602/fd/6 > /var/log/messages---将/proc/602/fd/6中的文件重定向到/var/log/messages文件中(方法一)

cp /proc/602/fd/6 /var/log/messages---将/proc/602/fd/6中的文件拷贝到/var/log/messages文件中,不需要加-rf或者-a选项(方法二)

vim /var/log/messages---编辑查看/var/log/messages文件

图片描述
(1.9)示例:我们在系统中打开了httpd服务,然后模拟不小心删除了日志文件的情况。

ll /etc/httpd/logs/access_log

cat /etc/httpd/logs/access_log

图片描述
图片描述
图片描述
(1.10)此时我们可以使用lsof命令查看被删除的accesslog文件是否又被其他的进程打开,然后我们找到为root用户的打开了accesslog的文件PID号和文件句柄,然后我们使用cp命令将进程打开的文件句柄中的信息拷贝并重新命名为accesslog文件,此时我们发现accesslog文件中已经恢复了之前删除的文件内容了。

lsof $TABLECOL grep accesslog---查看打开access_log文件的进程

cp /proc/3563/fd/7 /etc/httpd/logs/accesslog---将进程对应的文件描述符重命名并拷贝到accesslog文件中

cat /etc/httpd/logs/access_log

图片描述
图片描述

* **

(二)lsof的其他用法
(2.1)lsof命令用于查看进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP),其中"-p <进程号>":列出指定进程号所打开的文件。

vim aa.txt---编辑aa.txt文件

ps aux | grep aa.txt---通过ps命令查看进程的进程号

lsof -p 10666---一般用于查看***进程,在读哪些文件

图片描述
图片描述
(2.2)其中"-i <条件>":列出符合条件的进程。(4、6、协议、:端口、@ip)

lsof -i :22---用于查看端口,或查看***开启的后门端口是哪个进程在使用

lsof -i TCP---查看符合TCP协议的进程

lsof -i @192.168.26.102---查看符合IP地址为192.168.26.102的进程

------------------ 本文至此结束,感谢阅读 ------------------

©著作权归作者所有:来自51CTO博客作者Tom王的原创作品,如需转载,请注明出处,否则将追究法律责任