当前位置: 首页 > 科技观察

Linux使用lsof命令恢复删除的文件_0

时间:2023-03-17 19:44:38 科技观察

lsof命令lsof命令用来查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP,UDP)。检索/恢复已删除的文件。是一个非常方便的系统监控工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。在Linux环境下,一切都以文件的形式存在,通过文件不仅可以访问常规数据,还可以访问网络连接和硬件。因此,如传输控制协议(TCP)和用户数据报协议(UDP)套接字等,系统在后台为应用程序分配一个文件描述符,不管文件的性质如何,文件描述符都是与应用程序交互的与底层操作系统提供了通用接口。因为应用程序打开的文件的描述符列表提供了很多关于应用程序本身的信息,所以能够通过lsof工具查看这个列表对于系统监控和故障排除会有很大的帮助。语法lsof(option)参数-a:列出打开文件的进程;-c<进程名>:列出指定进程打开的文件;-g:列出GID号进程的详细信息;-d<文件号>:列出占用文件号的进程;+d<目录>:列出目录中打开的文件;+D:递归列出目录下打开的文件;-n<目录>:列出使用NFS文件的文件;-i:列出满足条件的进程。(4,6,protocol,:port,@ip)-p<进程号>:列出指定进程号打开的文件;-u:列出UID号进程的详细信息;-h:显示帮助信息;-v:显示版本信息。使用查看lsof-i:(端口)查看这个端口有那些进程在访问,比如22端口shell>lsof-i:22COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEsshd1939root3uIPv4123170t0TCP*:ssh(LISTEN)sshd1939root4uIPv6123210t0TCP*:ssh(LISTEN)sshd2790root3uIPv4152290t0TCP192.168.178.128:ssh->192.168.178.1:64601(ESTABLISHED)sshd2824root3uIPv4155280t0TCP192.168.178.128:ssh->192.168.178.1:64673(ESTABLISHED)sshd2990root3uIPv4159840t0TCP192.168.178.128:ssh->192.168.178.1:64686(ESTABLISHED)sshd14695root3uIPv4395580t0TCP192.168.178.128:ssh->192.168.178.1:49662(ESTABLISHED)lsof输出的各列信息含义如下:COMMAND:进程名PID:进程标识符USER:进程所有者FD:文件描述符,应用程序通过文件来识别文件描述符。如cwd、txt等TYPE:文件类型,如DIR、REG等DEVICE:指定磁盘的名称SIZE:文件的大小NODE:索引节点(文件在磁盘上的标识)NAME:打开文件的确切名称使用lsof恢复文件恢复一些系统日志,前提是该进程存在。这里我们以最常用的/var/log/messages为例,测试的时候最好备份一下。#备份shell>cp/var/log/message/var/log/message_bachttp://embeddedlinux.org.cn/shell>lsof|grep/var/log/messagersyslogd1737root1wREG8,25716123652638/var/log/messages进程正在运行,Next,我会把文件/var/log/messagesshell>rm/var/log/messages删掉删除后看看这个进程的变化shell>lsof|grep/var/log/messagesrsyslogd1737root1wREG8,25716123652638/var/log/messages(deleted)可以看到有变化,两者对比后发现多了(删除)。要找出这个文件在哪里,我们需要看这个PID:1737FD:1,那么我们就得直接去/proc/1737/FD/1用llshell>cd/proc/1737/fd查看/shell>lltotal0lrwx------1rootroot64Dec2313:000->socket:[11442]l-wx-----1rootroot64Dec2313:001->/var/log/messages(deleted)l-wx------1rootroot64Dec2313:002->/var/log/securelr-x-----1rootroot64Dec2313:003->/proc/kmsgl-wx-----1rootroot64Dec2313:004->/var/log/maillogsaw1对应/var/log/messages(已删除),查看文件是不是我们想要的:shell>head-51Nov1403:11:11localhostkernel:imklog5.8.10,logsource=/proc/kmsgstarted.Nov1403:11:11localhostrsyslogd:[originsoftware="rsyslogd"swVersion="5.8.10"x-pid="1241"x-info="http://www.rsyslog.com"]startNov1403:11:11localhostkernel:InitializingcgroupsubsyscpusetNov1403:11:11localhostkernel:InitializingcgroupsubsyscpuNov1403:11:11localhostkernel:Linux2version2.6.3-431.el6.x86_64(mockbuild@c6b8.bsys.dev.CentOS.org)(gccversion4.4.720120313(RedHat4.4.7-4)(GCC))#1SMPFriNov2203:15:09UTC2013比较备份文件:shell>head-5/var/log/message_bacNov1403:11:11localhostkernel:imklog5.8.10,logsource=/proc/kmsgstarted.Nov1403:11:11localhostrsyslogd:[originsoftware="rsyslogd"swVersion="5.8.10"x-pid=“1241”x-info="http://www.rsyslog.com"]startNov1403:11:11localhostkernel:InitializingcgroupsubsyscpusetNov1403:11:11localhostkernel:InitializingcgroupsubsyscpuNov1403:11:11localhostkernel:Linuxversion2.6.32-431.el4.x6ockybuild_6d.b.centos.org)(gccversion4.4.720120313(RedHat4.4.7-4)(GCC))#1SMPFriNov2203:15:09UTC2013对比发现数据是一样的,恢复shell>cat1>/var/log/messages再次提醒,恢复的前提是进程必须存在