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

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


(一)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恢復進程打開的文件windows


(二)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 <條件>」:列出符合條件的進程。(四、六、協議、:端口、@ip)
# lsof -i :22---用於查看端口,或查看***開啓的後門端口是哪一個進程在使用
# lsof -i TCP---查看符合TCP協議的進程
# lsof -i @192.168.26.102---查看符合IP地址爲192.168.26.102的進程less

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

相關文章
相關標籤/搜索