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

2021-09-23 06:35:47 字數 4305 閱讀 8380

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輸出各列資訊的意義如下:

恢復檔案

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

#備份shell> cp /var/log/message /var/log/message_bac 

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=

""] 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 ([email protected]) (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=

""] 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 ([email protected]) (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 

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

Linux命令 lsof命令

lsof 是遵從unix 哲學的典範,它只做一件事情,並且做的相當完美 它可以列出某個程序開啟的所有檔案資訊。開啟的檔案可能是普通的檔案,目錄,nfs檔案,塊檔案,字元檔案,共享庫,常規管道,明明管道,符號鏈結,socket流,網路socket,unix域socket,以及其它更多。因為unix系統...

如何使用lsof命令恢復刪除的檔案

在linux檔案系統中,檔名實際是指向索引節點 inode 的鏈結。linux建立檔案系統後,就會生成inode表,inode索引節點會包含檔案的屬性 block塊的指標等資訊關於inode介紹看我這篇博文。當使用 rm 命令刪除某檔案時,只是刪除了指向inode索引節點的鏈結,但是沒有刪除inod...

Linux 中lsof 命令的使用

使用hexo時,本機以4000埠啟動server sh 3.2 hexo server info hexo is running at press ctrl c to stop.此時,4000埠被hexo占用,如果想檢視4000埠的占用情況,使用 sh 3.2 lsof i 4000 command...