天天看點

Linux利用lsof指令恢複删除的檔案

Linux利用lsof指令恢複删除的檔案

lsof指令

lsof指令用于檢視你程序開打的檔案,打開檔案的程序,程序打開的端口(tcp、udp)。找回/恢複删除的檔案。是十分友善的系統監視工具,因為lsof指令需要通路核心記憶體和各種檔案,是以需要root使用者執行。

在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以通路正常資料,還可以通路網絡連接配接和硬體。是以如傳輸控制協定 (tcp) 和使用者資料報協定 (udp) 套接字等,系統在背景都為該應用程式配置設定了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用接口。因為應用程式打開檔案的描述符清單提供了大量關于這個應用程式本身的資訊,是以通過lsof工具能夠檢視這個清單對系統監測以及排錯将是很有幫助的。

文法

lsof(選項)

參數

-a:列出打開檔案存在的程序;

-c<程序名>:列出指定程序所打開的檔案;

-g:列出gid号程序詳情;

-d<檔案号>:列出占用該檔案号的程序;

+d<目錄>:列出目錄下被打開的檔案;

+d<目錄>:遞歸列出目錄下被打開的檔案;

-n<目錄>:列出使用nfs的檔案;

-i<條件>:列出符合條件的程序。(4、6、協定、:端口、 @ip )

-p<程序号>:列出指定程序号所打開的檔案;

-u:列出uid号程序詳情;

-h:顯示幫助資訊;

-v:顯示版本資訊。

使用

檢視

lsof -i:(端口) 檢視這個端口有那些程序在通路,比如22端口

shell> lsof -i:22 

command   pid user   fd   type device size/off node name 

sshd     1939 root    3u  ipv4  12317      0t0  tcp *:ssh (listen) 

sshd     1939 root    4u  ipv6  12321      0t0  tcp *:ssh (listen) 

sshd     2790 root    3u  ipv4  15229      0t0  tcp 192.168.178.128:ssh->192.168.178.1:64601 (established) 

sshd     2824 root    3u  ipv4  15528      0t0  tcp 192.168.178.128:ssh->192.168.178.1:64673 (established) 

sshd     2990 root    3u  ipv4  15984      0t0  tcp 192.168.178.128:ssh->192.168.178.1:64686 (established) 

sshd    14695 root    3u  ipv4  39558      0t0  tcp 192.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_bac 

http://embeddedlinux.org.cn/ 

shell> lsof |grep /var/log/message 

rsyslogd   1737      root    1w      reg                8,2   5716123     652638 /var/log/messages 

程序在運作中,接下來我就把/var/log/messages這個檔案删掉

shell> rm /var/log/messages 

删掉之後,我再來看看這個程序的變化

shell> lsof |grep /var/log/messages 

rsyslogd   1737      root    1w      reg                8,2   5716123     652638 /var/log/messages (deleted) 

大家看到有變化了吧, 對比兩個之後發現多了(deleted)。要找到這個檔案在哪還要看看這個

pid:1737 fd:1 那我們有直接進入/proc/1737/fd/1用ll檢視一下

shell> cd /proc/1737/fd/ 

shell> ll 

total 0 

lrwx------ 1 root root 64 dec 23 13:00 0 -> socket:[11442] 

l-wx------ 1 root root 64 dec 23 13:00 1 -> /var/log/messages (deleted) 

l-wx------ 1 root root 64 dec 23 13:00 2 -> /var/log/secure 

lr-x------ 1 root root 64 dec 23 13:00 3 -> /proc/kmsg 

l-wx------ 1 root root 64 dec 23 13:00 4 -> /var/log/maillog 

看到了1對應/var/log/messages (deleted),看看檔案是不是我們要的檔案:

shell> head -5 1 

nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started. 

nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swversion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start 

nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpuset 

nov 14 03:11:11 localhost kernel: initializing cgroup subsys cpu 

nov 14 03:11:11 localhost kernel: linux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (red hat 4.4.7-4) (gcc) ) #1 smp fri nov 22 03:15:09 utc 2013 

對比備份檔案:

shell> head -5 /var/log/message_bac 

對比發現資料是一樣的,恢複

shell> cat 1 > /var/log/messages 

再次提醒,恢複前提是這個程序必須存在。

本文作者:佚名

來源:51cto

繼續閱讀