歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux維護 >> Linux通過lsof命令恢復誤刪文件的步驟

Linux通過lsof命令恢復誤刪文件的步驟

日期:2017/3/2 10:27:15   编辑:Linux維護

Linux系統下lsof命令的用法有很多,恢復誤刪文件就是其中一種用法,特別是日志類文件的恢復,下面小編就給大家介紹下Linux使用lsof命令恢復誤刪文件的方法。

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

當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, 可以從網站查找獲得。

恢復過程:

首先, 需要創建一個文本文件, 刪除然後恢復:

[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 用以顯示符合條件的進程情況

上面就是Linux使用lsof命令恢復誤刪文件的方法介紹了,使用完lsof命令後,記得重新下電腦。

Copyright © Linux教程網 All Rights Reserved