如果Linux中的所有東西都是一個檔案,那麼除了硬碟上的檔案之外,還必須有更多的內容。本教程將向您展示如何使用lsof檢視作為檔案處理的所有其他裝置和程序。
經常被引用的一句話是,Linux中的所有東西都是一個檔案。檔案是位元組的集合。當它們被讀入程式或傳送到印表機時,它們似乎會生成一個位元組流。當它們被寫入時,它們接受位元組流。
許多其他系統元件接受或生成位元組流,例如鍵盤、套接字連線、印表機和通訊程序。因為它們要麼接受、生成,要麼接受並生成位元組流,所以這些裝置可以在非常低的級別上進行處理,就好像它們是檔案一樣。
這個設計概念簡化了Unix作業系統的實現。這意味著可以建立一小組處理程式、工具和api來處理各種不同的資源。
硬碟上的資料和程式檔案是普通的舊檔案系統檔案。我們可以使用ls命令列出它們並找出它們的一些細節。
我們如何找出所有被當作檔案處理的其他程序和裝置?我們使用lsof命令。列出系統中開啟的檔案。也就是說,它列出了正在處理的所有內容,就像它是一個檔案一樣。
相關:在Linux中,“一切都是檔案”是什麼意思?
lsof可以報告的許多程序或裝置屬於root或者是由root啟動的,因此您需要對lsof使用sudo命令。
因為這個列表會很長,所以我們將透過更少的管道來完成它。
sudo lsof | less在lsof輸出出現之前,GNOME使用者可能會在終端視窗中看到一條警告訊息。
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete.lsof嘗試處理所有裝入的檔案系統。引發此警告訊息的原因是lsof遇到了GNOME虛擬檔案系統(GVFS)。這是使用者空間檔案系統(FUSE)的一個特例。它充當了GNOME、其API和核心之間的橋樑。除了掛載它的所有者(在本例中是GNOME),沒有人甚至連根使用者都不能訪問這些檔案系統。您可以忽略此警告。
lsof的輸出很寬。最左邊的列是:
最右邊的列是:
並非所有列都適用於所有型別的開啟檔案。其中有些是空白是正常的。
FD列中的檔案描述符可以是許多選項之一;手冊頁列出了所有選項。
FD列條目可以由三部分組成:檔案描述符、模式字元和鎖字元。一些常見的檔案描述符包括:
模式字元可以是以下之一:
鎖定字元可以是以下字元之一:
型別列中可能會出現70多個條目。您將看到一些常見條目:
要檢視已開啟某個檔案的程序,請將檔名作為lsof的引數提供。例如,檢視已開啟的程序核心日誌檔案,使用以下命令:
sudo lsof /var/log/kern.loglsof透過顯示由使用者syslog啟動的單個程序rsyslogd來響應。
要檢視從目錄中開啟的檔案以及開啟這些檔案的程序,請將目錄作為引數傳遞給lsof。必須使用+D(目錄)選項。
要檢視在/var/log/目錄中開啟的所有檔案,請使用以下命令:
sudo lsof +D /var/log/lsof用該目錄中所有開啟檔案的列表來響應。
要檢視從/home目錄開啟的所有檔案,請使用以下命令:
sudo lsof +D /home顯示已從/home目錄開啟的檔案。請注意,由於某些列中的描述較短,因此整個列表的範圍較窄。
要檢視由特定程序開啟的檔案,請使用-c(命令)選項。請注意,您可以一次向lsof提供多個搜尋項。
sudo lsof -c ssh -c initlsof提供已由命令列上提供的任一程序開啟的檔案的列表。
要將顯示限制為特定使用者已開啟的檔案,請使用-u(使用者)選項。在本例中,我們將檢視由代表Mary擁有或啟動的程序開啟的檔案。
sudo lsof -u mary列出的所有檔案都已代表使用者Mary開啟。這包括已被桌面環境開啟的檔案,例如,或者僅僅由於Mary已登入而開啟的檔案。
要排除使用者已開啟的檔案,請使用“^”運算子。將使用者排除在列表之外可以更容易地找到您感興趣的資訊。必須像以前一樣使用-u選項,並在使用者名稱的開頭新增“^”字元。
sudo lsof +D /home -u ^mary這次,/home目錄的列表不包括使用者Mary開啟的任何檔案。
要列出由特定程序開啟的檔案,請使用-p(程序)選項並提供程序ID作為引數。
sudo lsof - p 4610您提供的程序ID已開啟的所有檔案都將列出。
要檢視已開啟特定檔案的程序的程序ID,請使用-t(簡寫)選項並在命令列中提供檔名。
sudo lsof -t /usr/share/mime/mime.cache程序ID顯示在一個簡單的列表中。
讓我們列出使用者Mary開啟的與SSH程序相關的檔案。我們知道我們可以在命令列上提供多個搜尋項,所以這應該很容易。
sudo lsof -u mary -c ssh現在讓我們看看lsof的輸出。這看起來不對;輸出中有由root啟動的條目。
這不是我們所期望的。怎麼搞的?
當您提供多個搜尋項時,lsof將返回與第一個搜尋項或第二個搜尋項匹配的任何檔案,依此類推。換句話說,它執行OR搜尋。
要使lsof執行AND搜尋,請使用-a(AND)選項。這意味著只列出與第一個搜尋項和第二個搜尋項匹配的檔案,依此類推。
讓我們再試一次,然後使用-a選項。
sudo lsof -u mary -c ssh -a現在,清單中的每個檔案都是由Mary或代表Mary開啟的,並且與SSH命令關聯。
我們可以使用+|-r(repeat)選項將lsof置於repeat模式。repeat選項有兩種應用方式,+r或-r。我們還必須新增lsof在重新整理顯示之前要等待的秒數。
在任何一種格式中使用repeat選項都會使lsof像往常一樣顯示結果,但會在顯示的底部新增一條虛線。它等待命令列提供的秒數,然後用一組新的結果重新整理顯示。
對於-r選項,此操作將繼續,直到您按Ctrl+C為止。對於+r格式,此操作將繼續,直到沒有要顯示的結果,或者直到您按Ctrl+C為止。
sudo lsof -u mary -c ssh -a -r5請注意清單底部的虛線。當輸出被重新整理時,這將分隔每個新的資料顯示。
i(internet)選項允許您檢視與網路和internet連線相關聯的程序開啟的檔案。
lsof -i將顯示透過網路和internet連線開啟的所有檔案。
要檢視與特定程序ID關聯的internet連線開啟的檔案,請新增-p選項和-a選項。
在這裡,我們正在尋找透過internet或網路連線開啟的檔案,透過ID為606的程序。
sudo lsof -i -a -p 606顯示由程序ID 606開啟的與因特網或網路連線相關聯的所有檔案。
我們可以使用-c(command)選項來查詢由特定程序開啟的檔案。要查詢已由internet或與ssh程序關聯的網路連線開啟的檔案,請使用以下命令:
lsof -i -a -c ssh由於ssh程序而開啟的所有檔案都列在輸出中。
我們可以在特定埠上對透過internet或網路連線開啟的檔案進行lsof報告。為此,我們使用:字元後跟埠號。
在這裡,我們要求lsof列出透過網路或internet連線使用埠22開啟的檔案。
lsof -i :22所有列出的檔案都是由與埠22(SSH連線的預設埠)關聯的程序開啟的。
我們可以要求lsof顯示與使用特定協議的網路和internet連線相關聯的程序所開啟的檔案。我們可以從TCP、UDP和SMTP中進行選擇。讓我們使用TCP協議,看看我們得到了什麼。
sudo lsof -i tcp列出的檔案只有那些由使用TCP協議的程序開啟的檔案。
在lsof的一些常見用例中,這是一個很好的基礎,但是還有更多的地方。手冊頁的長度超過2800行,這就可以判斷出還有多少內容。
lsof命令可以用來深入到開啟檔案和偽檔案的地層中。我們提供了一張示意圖,地圖冊在手冊頁上。
... 在本文中,我將向您展示如何在Linux上安裝、執行和使用PowerShell! ...
...許您在Android裝置上安裝誠實善良的Linux應用程式。下面是如何使用Termux應用程式。 ...
... 如何在windows10上安裝linux bash shell ...
要在Linux中重新命名檔案嗎?如果您知道如何在Windows、macOS或Chrome作業系統中完成這項工作,那麼您就知道如何在這裡完成這項工作。在大多數版本的Linux上,您只需右鍵單擊一個檔案並選擇Rename選項。 ...
如果您不知道如何使用ls命令,那麼獲取與儲存上的檔案相關的詳細資訊是很困難的。在這裡,我們將討論Linux上與ls命令相關的所有內容,以及它使用的一些不同的標誌。 ...
想在Linux系統上新增使用者但不知道如何新增?在Linux上使用命令列介面管理使用者無疑是一項複雜的工作。而對於初學者來說,即使新增新使用者也是一場噩夢。 ...
...但幸運的是,更改Linux密碼很容易。今天我們將向您展示如何通過幾個簡單的命令更改當前使用者的密碼、其他使用者的密碼和超級使用者的密碼。 ...