51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3588|回复: 2
打印 上一主题 下一主题

[转贴] Linux 使用lsof恢复删除的文件

[复制链接]
  • TA的每日心情
    奋斗
    2022-5-8 19:23
  • 签到天数: 137 天

    连续签到: 1 天

    [LV.7]测试师长

    跳转到指定楼层
    1#
    发表于 2010-7-8 10:19:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    <P><A name=N10237><SPAN class=smalltitle><FONT color=#0070af>恢复删除的文件</FONT></SPAN></A></P>
    <P>当 UNIX 计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以恢复这些文件,并且 <CODE><FONT face=新宋体>lsof</FONT></CODE> 可以为您提供帮助。</P>
    <P>当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录条目。</P>
    <P>前面曾在<A href="http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html#diversion"><FONT color=#0070af>转到 /proc 目录</FONT></A>部分中说过,通过在适当的目录中进行查找,您可以访问进程的文件描述符。在随后的内容中,您看到了 <CODE><FONT face=新宋体>lsof</FONT></CODE> 可以显示进程的文件描述符和相关的文件名。您能明白我的意思吗?</P>
    <P>但愿它真的这么简单!当您向 <CODE><FONT face=新宋体>lsof</FONT></CODE> 传递文件名时,比如在 <CODE><FONT face=新宋体>lsof /file/I/deleted</FONT></CODE> 中,它首先使用 <CODE><FONT face=新宋体>stat()</FONT></CODE> 系统调用获得有关该文件的信息,不幸的是,这个文件已经被删除。在不同的操作系统中,<CODE><FONT face=新宋体>lsof</FONT></CODE> 可能可以从核心内存中捕获该文件的名称。<A href="http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html#listing5"><FONT color=#0070af>清单 5</FONT></A> 显示了一个 Linux 系统,其中意外地删除了 Apache 日志,我正使用 <CODE><FONT face=新宋体>grep</FONT></CODE> 工具查找是否有人打开了该文件。</P><BR><A name=listing5><B><FONT color=#0070af>清单 5. 在 Linux 中使用 lsof 查找删除的文件</FONT></B></A><BR>
    <TABLE cellSpacing=0 cellPadding=0 width=572 border=0>
    <TBODY>
    <TR>
    <TD class=code-outline><PRE class=displaycode># lsof | grep error_log<BR>httpd      2452     root    2w      REG       33,2      499    3090660<BR>                                        /var/log/httpd/error_log (deleted)<BR>httpd      2452     root    7w      REG       33,2      499    3090660<BR>                                        /var/log/httpd/error_log (deleted)<BR>... more httpd processes ...<BR></PRE></TD></TR></TBODY></TABLE><BR>
    <P>在这个示例中,您可以看到 PID 2452 打开文件的文件描述符为 2(标准错误)和 7。因此,可以在 /proc/2452/fd/7 中查看相应的信息,如<A href="http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html#listing6"><FONT color=#0070af>清单 6</FONT></A> 所示。</P><BR><A name=listing6><B><FONT color=#0070af>清单 6. 通过 /proc 查找删除的文件</FONT></B></A><BR>
    <TABLE cellSpacing=0 cellPadding=0 width=572 border=0>
    <TBODY>
    <TR>
    <TD class=code-outline><PRE class=displaycode># cat /proc/2452/fd/7<BR>[Sun Apr 30 04:02:48 2006] [notice] Digest: generating secret for digest authentication<BR>[Sun Apr 30 04:02:48 2006] [notice] Digest: done<BR>[Sun Apr 30 04:02:48 2006] [notice] LDAP: Built with OpenLDAP LDAP SDK<BR></PRE></TD></TR></TBODY></TABLE><BR>
    <P>Linux 的优点在于,它保存了文件的名称,甚至可以告诉我们它已经被删除。在遭到破坏的系统中查找相关内容时,这是非常有用的内容,因为攻击者通常会删除日志以隐藏他们的踪迹。Solaris 并不提供这些信息。然而,我们知道 <CODE><FONT face=新宋体>httpd</FONT></CODE> 守护进程使用了 error_log 文件,所以可以使用 <CODE><FONT face=新宋体>ps</FONT></CODE> 命令找到这个 PID,然后可以查看这个守护进程打开的所有文件。</P><BR><A name=listing7><B><FONT color=#0070af>清单 7. 在 Solaris 中查找删除的文件</FONT></B></A><BR>
    <TABLE cellSpacing=0 cellPadding=0 width=572 border=0>
    <TBODY>
    <TR>
    <TD class=code-outline><PRE class=displaycode># lsof -a -p 8663 -d ^txt<BR>COMMAND  PID   USER   FD   TYPE        DEVICE SIZE/OFF    NODE NAME<BR>httpd   8663 nobody  cwd   VDIR         136,8     1024       2 /<BR>httpd   8663 nobody    0r  VCHR          13,2          6815752 /devices/pseudo/mm@0:null<BR>httpd   8663 nobody    1w  VCHR          13,2          6815752 /devices/pseudo/mm@0:null<BR>httpd   8663 nobody    2w  VREG         136,8      185  145465 / (/dev/dsk/c0t0d0s0)<BR>httpd   8663 nobody    4r  DOOR                    0t0      58 /var/run/name_service_door<BR>                                                (door to nscd[81]) (FA:-&gt;0x30002b156c0)<BR>httpd   8663 nobody   15w  VREG         136,8      185  145465 / (/dev/dsk/c0t0d0s0)<BR>httpd   8663 nobody   16u  IPv4 0x300046d27c0      0t0     TCP *:80 (LISTEN)<BR>httpd   8663 nobody   17w  VREG         136,8        0  145466 <BR>                                                          /var/apache/logs/access_log<BR>httpd   8663 nobody   18w  VREG         281,3        0 9518013 /var/run (swap)<BR></PRE></TD></TR></TBODY></TABLE><BR>
    <P>我使用 <CODE><FONT face=新宋体>-a</FONT></CODE> 和 <CODE><FONT face=新宋体>-d</FONT></CODE> 参数对输出进行筛选,以排除代码程序段,因为我知道需要查找的是哪些文件。<CODE><FONT face=新宋体>Name</FONT></CODE> 列显示出,其中的两个文件(FD 2 和 15)使用磁盘名代替了文件名,并且它们的类型为 <CODE><FONT face=新宋体>VREG</FONT></CODE>(常规文件)。在 Solaris 中,删除的文件将显示文件所在的磁盘的名称。通过这个线索,就可以知道该 FD 指向一个删除的文件。实际上,查看 <CODE><FONT face=新宋体>/proc/8663/fd/15</FONT></CODE> 就可以得到所要查找的数据。</P>
    <P>如果可以通过文件描述符查看相应的数据,那么您就可以使用 I/O 重定向将其复制到文件中,如 <CODE><FONT face=新宋体>cat /proc/8663/fd/15 &gt; /tmp/error_log</FONT></CODE> 。此时,您可以中止该守护进程(这将删除 FD,从而删除相应的文件),将这个临时文件复制到所需的位置,然后重新启动该守护进程。</P>
    <P>对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。正如您所看到的,有些操作系统(以及不同版本的 <CODE><FONT face=新宋体>lsof</FONT></CODE>)比其他的系统更容易查找相应的数据。</P>
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    该用户从未签到

    2#
    发表于 2011-3-10 16:03:43 | 只看该作者
    好东西
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3#
    发表于 2011-3-14 14:37:41 | 只看该作者
    Linux系统学习中
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-1 07:46 , Processed in 0.070115 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表