【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件

目錄:
(一)lsof恢復文件
(二)lsof的其他用法


(一)lsof恢復文件
(1.1)如果在系統中有某個進程打開了一個文件,但是這個文件被我們誤刪除,此時我們希望將誤刪除的文件恢復。如果某個被誤刪除的文件所對應的進程沒有關,這個文件就可以恢復。
(1.2)在Linux中的FD文件描述符與windows中的文件句柄是同樣的一個概念,一個進程打開一個文件就會產生相應的文件描述符,如果這個進程將文件關閉了,那麼這個文件描述符或文件句柄就會跟着釋放掉了。
(1.3)我們直接執行lsof命令,可以看到如下的信息,以標紅的爲例,我們的sleep進程打開了/usr/lib64/ld-2.17.so庫文件(圖1-1)。我們也可以進行過濾,查看某一個進程打開的是哪一個文件。
# lsof | grep ^sshd
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
(1.4)接下來我們查看打開文件message的進程,可以看到每一個進程打開的文件。
# lsof | grep message---查看打開文件message的進程
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
(1.5)同時我們可以看到記錄日誌的進程rsyslogd有打開我們的/var/log/messages文件,其中602表示的是PID號,6w中6表示的是句柄號,w表示以寫的方式,我們在/proc/602/fd目錄下便可以看到句柄號6對應的文件爲/var/log/messages,表示/var/log/messages文件對應的文件正在被6號句柄進程號爲602的進程打開,其中rsyslogd進程的PID號爲602,所以此文件正在被rsyslogd進程打開。
# lsof | grep message
# ll /proc/602/fd
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
(1.6)現在我們模擬不小心誤刪除/var/log/messages文件,接着我們通過“# ll /proc/602/fd”命令發現/var/log/messages文件顯示已經被刪除了
# rm -rf /var/log/messages
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
(1.7)由於此時我們只是文件被刪除了,但是文件的句柄沒有被釋放,因此我們可以先通過文件描述符查看一下文件的內容是否是我們所需要的。
# lsof | grep messages---查詢被刪除的文件是被那個進程打開的,獲取PID號和文件句柄號
# less /proc/602/fd/6---查看進程中的文件句柄信息是否是我們需要的
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
(1.8)我們將/proc/602/fd/6文件描述符中的內容重定向到/var/log/messages文件中。此時由於文件的狀態是被刪除的,但是由於文件描述符還是存在的,所以我們還是可以把文件內容找回來的。
# less /proc/602/fd/6 > /var/log/messages---將/proc/602/fd/6中的文件重定向到/var/log/messages文件中(方法一)
# cp /proc/602/fd/6 /var/log/messages---將/proc/602/fd/6中的文件拷貝到/var/log/messages文件中,不需要加-rf或者-a選項(方法二)
# vim /var/log/messages---編輯查看/var/log/messages文件
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
(1.9)示例:我們在系統中打開了httpd服務,然後模擬不小心刪除了日誌文件的情況。
# ll /etc/httpd/logs/access_log
# cat /etc/httpd/logs/access_log
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
(1.10)此時我們可以使用lsof命令查看被刪除的access_log文件是否又被其他的進程打開,然後我們找到爲root用戶的打開了access_log的文件PID號和文件句柄,然後我們使用cp命令將進程打開的文件句柄中的信息拷貝並重新命名爲access_log文件,此時我們發現access_log文件中已經恢復了之前刪除的文件內容了。
# lsof | grep access_log---查看打開access_log文件的進程
# cp /proc/3563/fd/7 /etc/httpd/logs/access_log---將進程對應的文件描述符重命名並拷貝到access_log文件中
# cat /etc/httpd/logs/access_log
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件


(二)lsof的其他用法
(2.1)lsof命令用於查看進程打開的文件,打開文件的進程,進程打開的端口(TCP、UDP),其中“-p <進程號>”:列出指定進程號所打開的文件。
# vim aa.txt---編輯aa.txt文件
# ps aux | grep aa.txt---通過ps命令查看進程的進程號
# lsof -p 10666---一般用於查看***進程,在讀哪些文件
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
【講清楚,說明白!】乾貨--使用lsof恢復進程打開的文件
(2.2)其中“-i <條件>”:列出符合條件的進程。(4、6、協議、:端口、@ip)
# lsof -i :22---用於查看端口,或查看***開啓的後門端口是哪個進程在使用
# lsof -i TCP---查看符合TCP協議的進程
# lsof -i @192.168.26.102---查看符合IP地址爲192.168.26.102的進程

—————— 本文至此結束,感謝閱讀 ——————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章