lsof 的一个特殊用法--恢复删除文件(进程保持打开的状态)
时间:2007-06-06
来源:互联网
当 UNIX 计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以恢复这些文件,并且 lsof 可以为您提供帮助。
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录条目。
前面曾在转到 /proc 目录部分中说过,通过在适当的目录中进行查找,您可以访问进程的文件描述符。在随后的内容中,您看到了 lsof 可以显示进程的文件描述符和相关的文件名。您能明白我的意思吗?
但愿它真的这么简单!当您向 lsof 传递文件名时,比如在 lsof /file/I/deleted 中,它首先使用 stat() 系统调用获得有关该文件的信息,不幸的是,这个文件已经被删除。在不同的操作系统中,lsof 可能可以从核心内存中捕获该文件的名称。清单 5 显示了一个 Linux 系统,其中意外地删除了 Apache 日志,我正使用 grep 工具查找是否有人打开了该文件。
清单 5. 在 Linux 中使用 lsof 查找删除的文件
# lsof | grep error_loghttpd 2452 root 2w REG 33,2 499 3090660 /var/log/httpd/error_log (deleted)httpd 2452 root 7w REG 33,2 499 3090660 /var/log/httpd/error_log (deleted)... more httpd processes ... |
在这个示例中,您可以看到 PID 2452 打开文件的文件描述符为 2(标准错误)和 7。因此,可以在 /proc/2452/fd/7 中查看相应的信息,如清单 6 所示。
清单 6. 通过 /proc 查找删除的文件
# cat /proc/2452/fd/7[Sun Apr 30 04:02:48 2006] [notice] Digest: generating secret for digest authentication[Sun Apr 30 04:02:48 2006] [notice] Digest: done[Sun Apr 30 04:02:48 2006] [notice] LDAP: Built with OpenLDAP LDAP SDK |
Linux 的优点在于,它保存了文件的名称,甚至可以告诉我们它已经被删除。在遭到破坏的系统中查找相关内容时,这是非常有用的内容,因为攻击者通常会删除日志以隐藏他们的踪迹。Solaris 并不提供这些信息。然而,我们知道 httpd 守护进程使用了 error_log 文件,所以可以使用 ps 命令找到这个 PID,然后可以查看这个守护进程打开的所有文件。
清单 7. 在 Solaris 中查找删除的文件
# lsof -a -p 8663 -d ^txtCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEhttpd 8663 nobody cwd VDIR 136,8 1024 2 /httpd 8663 nobody 0r VCHR 13,2 6815752 /devices/pseudo/mm@0:nullhttpd 8663 nobody 1w VCHR 13,2 6815752 /devices/pseudo/mm@0:nullhttpd 8663 nobody 2w VREG 136,8 185 145465 / (/dev/dsk/c0t0d0s0)httpd 8663 nobody 4r DOOR 0t0 58 /var/run/name_service_door (door to nscd[81]) (FA:->0x30002b156c0)httpd 8663 nobody 15w VREG 136,8 185 145465 / (/dev/dsk/c0t0d0s0)httpd 8663 nobody 16u IPv4 0x300046d27c0 0t0 TCP *:80 (LISTEN)httpd 8663 nobody 17w VREG 136,8 0 145466 /var/apache/logs/access_loghttpd 8663 nobody 18w VREG 281,3 0 9518013 /var/run (swap) |
我使用 -a 和 -d 参数对输出进行筛选,以排除代码程序段,因为我知道需要查找的是哪些文件。Name 列显示出,其中的两个文件(FD 2 和 15)使用磁盘名代替了文件名,并且它们的类型为 VREG(常规文件)。在 Solaris 中,删除的文件将显示文件所在的磁盘的名称。通过这个线索,就可以知道该 FD 指向一个删除的文件。实际上,查看 /proc/8663/fd/15 就可以得到所要查找的数据。
如果可以通过文件描述符查看相应的数据,那么您就可以使用 I/O 重定向将其复制到文件中,如 cat /proc/8663/fd/15 > /tmp/error_log 。此时,您可以中止该守护进程(这将删除 FD,从而删除相应的文件),将这个临时文件复制到所需的位置,然后重新启动该守护进程。
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。正如您所看到的,有些操作系统(以及不同版本的 lsof)比其他的系统更容易查找相应的数据。
作者: shala 发布时间: 2007-06-06

以前只用它来查看调用文件和端口...又学一招。
作者: luweinet 发布时间: 2007-06-06
谢谢shala老大分享
作者: 五“宅”一生 发布时间: 2007-06-06

作者: 小猪 发布时间: 2007-06-06
金条比偶金币都多····还不是一个数量级的···
作者: chinadns 发布时间: 2007-06-06
作者: hexiong 发布时间: 2007-06-06
怀疑楼主真的是抢银行发家的····
金条比偶金币都多····还不是一个数量级的···
人家在银行你不 知道?

作者: 老农 发布时间: 2007-06-06

作者: pyockee 发布时间: 2007-06-07
怀疑楼主真的是抢银行发家的····
金条比偶金币都多····还不是一个数量级的···
不是被人打劫过,金条更多
作者: shala 发布时间: 2007-06-07
那就正常了,那也不救济救济下我们这些贫农···怎么也有点阶级感情的嘛
作者: chinadns 发布时间: 2007-06-07
作者: yanjp_hn 发布时间: 2011-11-03
作者: CXW 发布时间: 2011-11-03
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28