linux 利用lsof恢複刪除的檔案

來源:互聯網
上載者:User


前提條件:該檔案在刪除後,仍然被進程訪問著,所以,比較適合用於恢複日誌類的檔案。

當Linux電腦受到入侵時,常見的情況是記錄檔被刪除,以掩蓋攻擊者的蹤跡。管理錯誤也可能導致意外刪除重要的檔案,比如在清理舊日誌時,意外地刪除了資料庫的活動交易記錄。有時可以通過lsof來恢複這些檔案。

當進程開啟了某個檔案時,只要該進程保持開啟該檔案,即使將其刪除,它依然存在於磁碟中。這意味著,進程並不知道檔案已經被刪除,它仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入。除了該進程之外,這個檔案是不可見的,因為已經刪除了其相應的目錄索引節點。

在/proc 目錄下,其中包含了反映核心和進程樹的各種檔案。/proc目錄掛載的是在記憶體中所映射的一塊地區,所以這些檔案和目錄並不存在於磁碟中,因此當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中擷取相關資訊。大多數與 lsof 相關的資訊都儲存於以進程的 PID 命名的目錄中,即 /proc/1234 中包含的是 PID 為 1234 的進程的資訊。每個進程目錄中存在著各種檔案,它們可以使得應用程式簡單地瞭解進程的記憶體空間、檔案描述符列表、指向磁碟上的檔案的符號連結和其他系統資訊。lsof 程式使用該資訊和其他關於核心內部狀態的資訊來產生其輸出。所以lsof 可以顯示進程的檔案描述符和相關的檔案名稱等資訊。也就是我們通過訪問進程的檔案描述符可以找到該檔案的相關資訊。當系統中的某個檔案被意外地刪除了,只要這個時候系統中還有進程正在訪問該檔案,那麼我們就可以通過lsof從/proc目錄下恢複該檔案的內容。

假如由於誤操作將/var/log/messages檔案刪除掉了,那麼這時要將/var/log/messages檔案恢複的方法如下:首先使用lsof來查看當前是否有進程開啟/var/logmessages檔案,如下:

# lsof |grep /var/log/messages
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
syslogd   14572      root    1w      REG      253,0     5584    1737237 /var/log/messages
#rm –f /var/log/messages
# lsof |grep /var/log/messages
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
syslogd   14572      root    1w      REG      253,0     5584    1737237 /var/log/messages (deleted)
 
從上面的資訊可以看到 PID 14572(syslogd)開啟檔案的檔案描述符為 1。同時還可以看到/var/log/messages已經標記被刪除了。因此我們可以在 /proc/14572/fd/1 (fd下的每個以數字命名的檔案表示進程對應的檔案描述符)中查看相應的資訊,如下:

# tail -n 10 /proc/14572/fd/1
Feb  4 20:02:25 host191 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Feb  4 20:02:45 host191 root: aaa
Feb  4 20:05:07 host191 dhclient: DHCPREQUEST on eth0 to 192.168.0.254 port 67
Feb  4 20:05:07 host191 dhclient: DHCPACK from 192.168.0.254
Feb  4 20:05:07 host191 dhclient: bound to 192.168.0.191 -- renewal in 718 seconds.
Feb  4 20:15:50 host191 syslogd 1.4.1: restart.
Feb  4 20:15:50 host191 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Feb  4 20:17:05 host191 dhclient: DHCPREQUEST on eth0 to 192.168.0.254 port 67
Feb  4 20:17:05 host191 dhclient: DHCPACK from 192.168.0.254
Feb  4 20:17:05 host191 dhclient: bound to 192.168.0.191 -- renewal in 804 seconds.# cat /proc/14572/fd/1 > /var/log/messages

下面介紹在Fedora Core 5系統上使用lsof恢複誤刪的檔案:

環境
主機: 使用微睦外掛式主控件, 一台基於vmware的虛擬外掛式主控件.
系統: Fedora Core 5
核心: 2.6.16-1.2122_FC5
lsof版本:

[zhaoke@fedora5 ~]$ /usr/sbin/lsof -v
lsof version information:
revision: 4.77

預備工作:
如果你的系統沒有安裝lsof, 可以從作者網站或pbone獲得.
作者網站: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
Pbone: http://rpm.pbone.net/

恢複過程:
首先, 我們需要建立一個文字檔, 刪除然後恢複:

[zhaoke@fedora5 ~]$ man lsof | col -b > myfile

然後看一下檔案內容:

[zhaoke@fedora5 ~]$ less myfile

你可以看到lsof所有的文本協助資訊.

現在按Ctrl-Z退出less命令, 然後在shell提示符下查看檔案屬性資訊:

[zhaoke@fedora5 ~]$ stat myfile
File: `myfile’
Size: 116549 Blocks: 240 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 492686 Links: 1
Access: (0664/-rw-rw-r–) Uid: ( 505/ zhaoke) Gid: ( 505/ zhaoke)
Access: 2006-11-20 12:59:38.000000000 +0800
Modify: 2006-11-20 12:59:34.000000000 +0800
Change: 2006-11-20 12:59:34.000000000 +0800

沒問題, 繼續下面工作:

[zhaoke@fedora5 ~]$ rm myfile
[zhaoke@fedora5 ~]$ ls -l myfile
ls: myfile: No such file or directory
[zhaoke@fedora5 ~]$ stat myfile
stat: cannot stat `myfile’: No such file or directory

myfile檔案刪除了.

這時候, 你不要終止仍在使用檔案的進程. 因為一旦終止, 檔案將很難恢複.

現在我們開始找回資料, 首先用lsof查看一下:

[zhaoke@fedora5 ~]$ lsof | grep myfile

less 9104 zhaoke 4r REG 253,0 116549 492686 /home/zhaoke/myfile (deleted)

第一個縱行是進程的名稱(命令名), 第二縱行是進程號(PID), 第四縱行是檔案描述符(r意思是普通檔案), 現在你知道9104進程仍有開啟檔案, 檔案描述符是4. 那我們開始從/proc裡面拷貝出資料. 你可能會考慮使用cp -a, 但實際上沒有作用, 你將拷貝的是一個指向被刪除檔案的符號連結:

[zhaoke@fedora5 ~]$ ls -l /proc/9104/fd/4
lr-x—— 1 zhaoke zhaoke 64 Nov 20 13:00 /proc/9104/fd/4 -> /home/zhaoke/myfile (deleted)
[zhaoke@fedora5 ~]$ cp -a /proc/9104/fd/4 myfile.wrong
[zhaoke@fedora5 ~]$ ls -l myfile.wrong
lrwxrwxrwx 1 zhaoke zhaoke 29 Nov 20 13:02 myfile.wrong -> /home/zhaoke/myfile (deleted)
[zhaoke@fedora5 ~]$ file myfile.wrong
myfile.wrong: broken symbolic link to `/home/zhaoke/myfile (deleted)’
[zhaoke@fedora5 ~]$ file /proc/9104/fd/4
/proc/9104/fd/4: broken symbolic link to `/home/zhaoke/myfile (deleted)’

然後, 使用cp拷貝出資料:

[zhaoke@fedora5 ~]$ cp /proc/9104/fd/4 myfile.saved

最後, 確認一下檔案:

[zhaoke@fedora5 ~]$ ls -l myfile.saved
-rw-rw-r– 1 zhaoke zhaoke 116549 Nov 20 13:03 myfile.saved
[zhaoke@fedora5 ~]$ man lsof | col -b > myfile.new
[zhaoke@fedora5 ~]$ cmp myfile.saved myfile.new

cmp比較無任何顯示, 表示兩個檔案完全相同, 恢複成功.

常用的參數列表:

       lsof filename 顯示開啟指定檔案的所有進程

lsof -a 表示兩個參數都必須滿足時才顯示結果

lsof -c string 顯示COMMAND列中包含指定字元的進程所有開啟的檔案

lsof -u username 顯示所屬user進程開啟的檔案

lsof -g gid 顯示歸屬gid的進程情況

lsof +d /DIR/ 顯示目錄下被進程開啟的檔案

lsof +D /DIR/ 同上,但是會搜尋目錄下的所有目錄,時間相對較長

lsof -d FD 顯示指定檔案描述符的進程

lsof -n 不將IP轉換為hostname,預設是不加上-n參數

lsof -i 用以顯示合格進程情況

這時,就將檔案恢複了。但是,要記得將應用重啟一下,不然,新產生的日誌可能寫不到新產生的檔案哦~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.