1. 程式人生 > 其它 >Linux系統恢復重要檔案

Linux系統恢復重要檔案

Linux 系統恢復重要檔案

原文:https://cloud.tencent.com/developer/article/1882357

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

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

3.當系統中的某個檔案被意外地刪除了,只要這個時候系統中還有程序正在訪問該檔案,那麼我們就可以通過 lsof 從 / proc 目錄下恢復該檔案的內容。

假設入侵者將 / var/log/secure (Linux安全日誌)檔案刪除掉了,嘗試將 / var/log/secure 檔案恢復的方法可以參考如下

a、刪掉安全日誌。

 rm -rf  /var/log/secure

b、使用lsof命令檢視是否有程序開啟 /var/log/secure

lsof | grep /var/log/secure
rsyslogd   6780                root    6w      REG        8,3     12755   37735212 /var/log/secure (deleted)
in:imjour  6780 6796           root    6w      REG        8,3     12755   37735212 /var/log/secure (deleted)
rs:main    6780 6797           root    6w      REG        8,3     12755   37735212 /var/log/secure (deleted)

c.從上面程序資訊中可以看到rsyslogd的PID為6780,檔案描述符為6,可以看到/var/log/secure已經標記為刪除了。因此我們可以在 / proc/6780/fd/6(fd 下的每個以數字命名的檔案表示程序對應的檔案描述符)中檢視相應的資訊,如下:

tail /proc/6780/fd/6
Apr  2 09:36:14 k8s-node1 sshd[31900]: Accepted password for root from 192.168.31.2 port 52853 ssh2
Apr  2 09:36:14 k8s-node1 sshd[31900]: pam_unix(sshd:session): session opened for user root by (uid=0)
Apr  2 09:44:25 k8s-node1 polkitd[6202]: Registered Authentication Agent for unix-process:32698:2403616 (system bus name :1.247 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.utf8)
Apr  2 09:44:25 k8s-node1 polkitd[6202]: Unregistered Authentication Agent for unix-process:32698:2403616 (system bus name :1.247, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.utf8) (disconnected from bus)
Apr  2 09:44:32 k8s-node1 sshd[31503]: pam_unix(sshd:session): session closed for user root
Apr  2 09:44:32 k8s-node1 sshd[31900]: pam_unix(sshd:session): session closed for user root
Apr  2 09:44:34 k8s-node1 sshd[32766]: Accepted password for root from 192.168.31.2 port 57530 ssh2
Apr  2 09:44:34 k8s-node1 sshd[32766]: pam_unix(sshd:session): session opened for user root by (uid=0)
Apr  2 09:44:34 k8s-node1 sshd[32768]: Accepted password for root from 192.168.31.2 port 57531 ssh2
Apr  2 09:44:34 k8s-node1 sshd[32768]: pam_unix(sshd:session): session opened for user root by (uid=0)

d. 從上面的資訊可以看出,檢視 /proc/6780/fd/6 就可以得到所要恢復的資料。如果可以通過檔案描述符檢視相應的資料,那麼就可以使用 I/O 重定向將其重定向到檔案中,如:

cat /proc/6780/fd/6 > /var/log/secure

e. 再次檢視 / var/log/secure,發現該檔案已經存在。對於許多應用程式,尤其是日誌檔案和資料庫,這種恢復刪除檔案的方法非常有用。

tail /proc/6780/fd/6
Apr  2 09:36:14 k8s-node1 sshd[31900]: Accepted password for root from 192.168.31.2 port 52853 ssh2
Apr  2 09:36:14 k8s-node1 sshd[31900]: pam_unix(sshd:session): session opened for user root by (uid=0)
Apr  2 09:44:25 k8s-node1 polkitd[6202]: Registered Authentication Agent for unix-process:32698:2403616 (system bus name :1.247 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.utf8)
Apr  2 09:44:25 k8s-node1 polkitd[6202]: Unregistered Authentication Agent for unix-process:32698:2403616 (system bus name :1.247, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.utf8) (disconnected from bus)
Apr  2 09:44:32 k8s-node1 sshd[31503]: pam_unix(sshd:session): session closed for user root
Apr  2 09:44:32 k8s-node1 sshd[31900]: pam_unix(sshd:session): session closed for user root
Apr  2 09:44:34 k8s-node1 sshd[32766]: Accepted password for root from 192.168.31.2 port 57530 ssh2
Apr  2 09:44:34 k8s-node1 sshd[32766]: pam_unix(sshd:session): session opened for user root by (uid=0)
Apr  2 09:44:34 k8s-node1 sshd[32768]: Accepted password for root from 192.168.31.2 port 57531 ssh2
Apr  2 09:44:34 k8s-node1 sshd[32768]: pam_unix(sshd:session): session opened for user root by (uid=0)