lsof 命令介紹

2021-08-08 15:10:46 字數 3518 閱讀 7269

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

那個程序在使用apache的可執行檔案

lsof /etc/passwd //

那個程序在占用/etc/passwd

lsof /dev/hda6 //

那個程序在占用hda6

lsof /dev/cdrom //

那個程序在占用光碟機

lsof -c sendmail //

檢視sendmail程序的檔案使用情況

lsof -c courier -u ^zahn //

顯示出那些檔案被以courier打頭的程序開啟,但是並不屬於使用者zahn

lsof -p 30297

//顯示那些檔案被pid為30297的程序開啟

lsof -d /tmp 顯示所有在/tmp資料夾中開啟的instance和檔案的程序。但是symbol檔案並不在列

lsof -u1000 //

檢視uid是100的使用者的程序的檔案使用情況

lsof -utony //

檢視使用者tony的程序的檔案使用情況

lsof -u^tony //

檢視不是使用者tony的程序的檔案使用情況(^是取反的意思)

lsof -i //

顯示所有開啟的埠

lsof -i:80

//顯示所有開啟80埠的程序

lsof -i -u //

顯示所有開啟的埠和unix domain檔案

lsof -i udp@[url]www.akadia.com:123

//顯示那些程序開啟了到www.akadia.com的udp的123(ntp)埠的鏈結

lsof -i [email protected]:ftp -r //

不斷檢視目前ftp連線的情況(-r,lsof會永遠不斷的執行,直到收到中斷訊號,+r,lsof會一直執行,直到沒有檔案被顯示,預設是15s重新整理)

lsof -i [email protected]:ftp -n //

lsof -n 不將ip轉換為hostname,預設是不加上-n引數

恢復刪除的檔案

當linux計算機受到入侵時,常見的情況是日誌檔案被刪除,以掩蓋攻擊者的蹤跡。管理錯誤也可能導致意外刪除重要的檔案,比如在清理舊日誌時,意外地刪除了資料庫的活動事務日誌。有時可以通過lsof來恢復這些檔案。

當程序開啟了某個檔案時,只要該程序保持開啟該檔案,即使將其刪除,它依然存在於磁碟中。這意味著,程序並不知道檔案已經被刪除,它仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入。除了該程序之外,這個檔案是不可見的,因為已經刪除了其相應的目錄索引節點。

在/proc 目錄下,其中包含了反映核心和程序樹的各種檔案。/proc目錄掛載的是在記憶體中所對映的一塊區域,所以這些檔案和目錄並不存在於磁碟中,因此當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中獲取相關資訊。大多數與 lsof 相關的資訊都儲存於以程序的 pid 命名的目錄中,即 /proc/1234 中包含的是 pid 為 1234 的程序的資訊。每個程序目錄中存在著各種檔案,它們可以使得應用程式簡單地了解程序的記憶體空間、檔案描述符列表、指向磁碟上的檔案的符號鏈結和其他系統資訊。lsof 程式使用該資訊和其他關於核心內部狀態的資訊來產生其輸出。所以lsof 可以顯示程序的檔案描述符和相關的檔名等資訊。也就是我們通過訪問程序的檔案描述符可以找到該檔案的相關資訊。

當系統中的某個檔案被意外地刪除了,只要這個時候系統中還有程序正在訪問該檔案,那麼我們就可以通過lsof從/proc目錄下恢復該檔案的內容。 假如由於誤操作將/var/log/messages檔案刪除掉了,那麼這時要將/var/log/messages檔案恢復的方法如下:

首先使用lsof來檢視當前是否有程序開啟/var/logmessages檔案,如下:

# lsof |grep /var/log/messages

syslogd 1283 root 2w reg 3,3 5381017 1773647 /var/log/messages (deleted)

從上面的資訊可以看到 pid 1283(syslogd)開啟檔案的檔案描述符為 2。同時還可以看到/var/log/messages已經標記被刪除了。因此我們可以在 /proc/1283/fd/2 (fd下的每個以數字命名的檔案表示程序對應的檔案描述符)中檢視相應的資訊,如下:

# head -n 10 /proc/1283/fd/2

aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.

aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.

aug 4 13:50:15 holmes86 kernel: linux version 2.6.22.1-8 ([email protected]) (gcc version 4.2.0) #1 smp wed jul 18 11:18:32 edt 2007 aug 4 13:50:15 holmes86 kernel: bios-provided physical ram map: aug 4 13:50:15 holmes86 kernel: bios-e820: 0000000000000000 - 000000000009f000 (usable) aug 4 13:50:15 holmes86 kernel: bios-e820: 000000000009f000 - 00000000000a0000 (reserved) aug 4 13:50:15 holmes86 kernel: bios-e820: 0000000000100000 - 000000001f7d3800 (usable) aug 4 13:50:15 holmes86 kernel: bios-e820: 000000001f7d3800 - 0000000020000000 (reserved) aug 4 13:50:15 holmes86 kernel: bios-e820: 00000000e0000000 - 00000000f0007000 (reserved) aug 4 13:50:15 holmes86 kernel: bios-e820: 00000000f0008000 - 00000000f000c000 (reserved)

從上面的資訊可以看出,檢視 /proc/8663/fd/15 就可以得到所要恢復的資料。如果可以通過檔案描述符檢視相應的資料,那麼就可以使用 i/o 重定向將其複製到檔案中,如:

cat /proc/1283/fd/2 > /var/log/messages

對於許多應用程式,尤其是日誌檔案和資料庫,這種恢復刪除檔案的方法非常有用。

常用命令 lsof命令介紹

5 lsof 是乙個列出當前系統開啟檔案的工具 a 引數 a 兩個引數都滿足時才顯示結果 c string 顯示command列包含指定字元的程序開啟的檔案 u username 顯示所屬用user 程序開啟的檔案 g gid 顯示歸屬gid的程序情況 d dir 顯示目錄下被程序開啟的檔案 d d...

Linux命令 lsof命令

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

Lsof命令詳解

一般root使用者才能執行lsof命令,普通使用者可以看見 usr sbin lsof命令,但是普通使用者執行會顯示 permission denied 我總結一下lsof指令的用法 lsof abc.txt 顯示開啟檔案abc.txt的程序 lsof i 22 知道22埠現在執行什麼程式 lsof...