共計 3540 個字符,預(yù)計需要花費 9 分鐘才能閱讀完成。
這篇文章主要介紹 Linux 如何利用 lsof 命令恢復(fù)刪除的文件,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
lsof 命令
lsof 命令用于查看你進程開打的文件,打開文件的進程,進程打開的端口 (TCP、UDP)。找回 / 恢復(fù)刪除的文件。是十分方便的系統(tǒng)監(jiān)視工具,因為 lsof 命令需要訪問核心內(nèi)存和各種文件,所以需要 root 用戶執(zhí)行。
在 linux 環(huán)境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規(guī)數(shù)據(jù),還可以訪問網(wǎng)絡(luò)連接和硬件。所以如傳輸控制協(xié)議 (TCP) 和用戶數(shù)據(jù)報協(xié)議 (UDP) 套接字等,系統(tǒng)在后臺都為該應(yīng)用程序分配了一個文件描述符,無論這個文件的本質(zhì)如何,該文件描述符為應(yīng)用程序與基礎(chǔ)操作系統(tǒng)之間的交互提供了通用接口。因為應(yīng)用程序打開文件的描述符列表提供了大量關(guān)于這個應(yīng)用程序本身的信息,因此通過 lsof 工具能夠查看這個列表對系統(tǒng)監(jiān)測以及排錯將是很有幫助的。
語法
lsof(選項)
參數(shù)
-a:列出打開文件存在的進程;
-c 進程名:列出指定進程所打開的文件;
-g:列出 GID 號進程詳情;
-d 文件號:列出占用該文件號的進程;
+d 目錄:列出目錄下被打開的文件;
+D 目錄:遞歸列出目錄下被打開的文件;
-n 目錄:列出使用 NFS 的文件;
-i 條件:列出符合條件的進程。(4、6、協(xié)議、: 端口、@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:進程標(biāo)識符
USER:進程所有者
FD:文件描述符,應(yīng)用程序通過文件描述符識別該文件。如 cwd、txt 等
TYPE:文件類型,如 DIR、REG 等
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節(jié)點 (文件在磁盤上的標(biāo)識)
NAME:打開文件的確切名稱
恢復(fù)文件
利用 lsof 可以恢復(fù)一些系統(tǒng)日志,前提是這個進程必須存在。這里就拿最常用的 /var/log/messages 來舉例說明,大家在做測試的時候 *** 先備份一下。
# 備份 shell cp /var/log/message /var/log/message_bac http://embeddedlinux.org.cn/ 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)
大家看到有變化了吧,對比兩個之后發(fā)現(xiàn)多了 (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 對應(yīng) /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
對比發(fā)現(xiàn)數(shù)據(jù)是一樣的,恢復(fù)
shell cat 1 /var/log/messages
再次提醒,恢復(fù)前提是這個進程必須存在。
以上是“Linux 如何利用 lsof 命令恢復(fù)刪除的文件”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!