首頁 > 軟體

Linux 利用lsof命令恢復刪除的檔案

2020-06-16 17:24:54

lsof命令

lsof命令用於檢視你進程開打的檔案,開啟檔案的進程,進程開啟的埠(TCP、UDP)。找回/恢復刪除的檔案。是十分方便的系統監視工具,因為lsof命令需要存取核心記憶體和各種檔案,所以需要root使用者執行。

在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以存取常規資料,還可以存取網路連線和硬體。所以如傳輸控制協定 (TCP) 和使用者資料包協定 (UDP) 通訊端等,系統在後台都為該應用程式分配了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面。因為應用程式開啟檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過lsof工具能夠檢視這個列表對系統監測以及排錯將是很有幫助的。

語法

lsof(選項)

引數

-a:列出開啟檔案存在的進程; 
-c<進程名>:列出指定進程所開啟的檔案; 
-g:列出GID號進程詳情; 
-d<檔案號>:列出占用該檔案號的進程; 
+d<目錄>:列出目錄下被開啟的檔案; 
+D<目錄>:遞迴列出目錄下被開啟的檔案; 
-n<目錄>:列出使用NFS的檔案; 
-i<條件>:列出符合條件的進程。(4、6、協定、:埠、 @ip ) 
-p<進程號>:列出指定進程號所開啟的檔案; 
-u:列出UID號進程詳情; 
-h:顯示幫助資訊; 
-v:顯示版本資訊。

使用

檢視

lsof -i:(埠) 檢視這個埠有那些進程在存取,比如22埠

shell> lsof -i:22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     1939 root    3u  IPv4  12317      0t0  TCP *:ssh (LISTEN)
sshd     1939 root    4u  IPv6  12321      0t0  TCP *:ssh (LISTEN)
sshd     2790 root    3u  IPv4  15229      0t0  TCP 192.168.178.128:ssh->192.168.178.1:64601 (ESTABLISHED)
sshd     2824 root    3u  IPv4  15528      0t0  TCP 192.168.178.128:ssh->192.168.178.1:64673 (ESTABLISHED)
sshd     2990 root    3u  IPv4  15984      0t0  TCP 192.168.178.128:ssh->192.168.178.1:64686 (ESTABLISHED)
sshd    14695 root    3u  IPv4  39558      0t0  TCP 192.168.178.128:ssh->192.168.178.1:49662 (ESTABLISHED)

lsof輸出各列資訊的意義如下:

  • COMMAND:進程的名稱
  • PID:進程識別符號
  • USER:進程所有者
  • FD:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt等
  • TYPE:檔案型別,如DIR、REG等
  • DEVICE:指定磁碟的名稱
  • SIZE:檔案的大小
  • NODE:索引節點(檔案在磁碟上的標識)
  • NAME:開啟檔案的確切名稱

恢復檔案

利用lsof可以恢復一些系統紀錄檔,前提是這個進程必須存在。這裡就拿最常用的/var/log/messages來舉例說明,大家在做測試的時候最好先備份一下。

#備份
shell> cp /var/log/message /var/log/message_bac
http://www.linuxidc.com/
shell> lsof |grep /var/log/message
rsyslogd   1737      root    1w      REG                8,2   5716123     652638 /var/log/messages

進程在執行中,接下來我就把/var/log/messages這個檔案刪掉

shell> rm /var/log/messages

刪掉之後,我再來看看這個進程的變化

shell> lsof |grep /var/log/messages
rsyslogd   1737      root    1w      REG                8,2   5716123     652638 /var/log/messages (deleted)

大家看到有變化了吧, 對比兩個之後發現多了(deleted)。要找到這個檔案在哪還要看看這個

PID:1737 FD:1 那我們有直接進入/proc/1737/FD/1用ll檢視一下

shell> cd /proc/1737/fd/
shell> ll

total 0
lrwx------ 1 root root 64 Dec 23 13:00 0 -> socket:[11442]
l-wx------ 1 root root 64 Dec 23 13:00 1 -> /var/log/messages (deleted)
l-wx------ 1 root root 64 Dec 23 13:00 2 -> /var/log/secure
lr-x------ 1 root root 64 Dec 23 13:00 3 -> /proc/kmsg
l-wx------ 1 root root 64 Dec 23 13:00 4 -> /var/log/maillog

看到了1對應/var/log/messages (deleted),看看檔案是不是我們要的檔案:

shell> head -5 1
Nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
Nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpuset
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpu
Nov 14 03:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.CentOS.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013

對比備份檔案:

shell> head -5 /var/log/message_bac
Nov 14 03:11:11 localhost kernel: imklog 5.8.10, log source = /proc/kmsg started.
Nov 14 03:11:11 localhost rsyslogd: [origin software="rsyslogd" swVersion="5.8.10" x-pid="1241" x-info="http://www.rsyslog.com"] start
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpuset
Nov 14 03:11:11 localhost kernel: Initializing cgroup subsys cpu
Nov 14 03:11:11 localhost kernel: Linux version 2.6.32-431.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013

對比發現資料是一樣的,恢復

shell> cat 1 > /var/log/messages

再次提醒,恢復前提是這個進程必須存在。

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-12/138850.htm


IT145.com E-mail:sddin#qq.com