lsof, LiSt Opened Files, 列出打開的文件, 聽起來很簡單的樣子. 但想*nix中很多其他工具一樣, lsof把這件簡單的事情做到了爐火純青. 因為Unix認為”一切皆文件”, 那么”打開的文件”就不僅僅是傳統意義上打開的文件了, 還可以是網絡/Unix域套接字, 匿名/具名管道, 共享庫文件, 目錄文件, 設備文件等等. 很多場景下, 查看進程或系統打開的文件會給調試帶來極大的幫助. 下面簡單地介紹lsof常被使用的功能選項.
lsof : 簡單地執行lsof會列出當前系統中所有被打開的文件, 但為了看到完整的信息, 通常需要具有root權限;
lsof -u dutor : 列出用戶dutor打開的文件, 可指定多個用戶, 默認是OR的關系;
lsof -c tair : 列出名稱以tair開頭的進程打開的文件, c for command, 可指定多個;
lsof -c /^t.*r$/ : 列出名稱以t開頭, r結尾的進程打開的文件;
lsof -p 12315 : 列出進程號為12315的進程打開的文件, 可指定多個;
lsof server.log : 列出打開server.log文件的進程, 可指明多個文件;
lsof . : 列出打開當前目錄的進程;
lsof +D . : 遞歸地列出當前目錄中被打開的文件, 當然也可以lsof | grep pwd;
lsof -i : 列出打開的套接字;
lsof -i tcp : 列出打開的tcp套接字;
lsof -i :5198 : 列出打開5198端口的進程;
lsof -i :ssh : 列出打開22端口的進程;
lsof -i tcp:5198 : 列出打開5198號tcp端口的進程;
lsof -U : 列出打開Unix域套接字的進程;
lsof -d 0-2 : 列出在0到2文件描述符上打開文件的進程;
lsof -d mem : 列出打開映射文件的進程;
lsof -d txt : 列出打開的可執行文件.
還有其他一些非常有用的選項, 可以對lsof的行為進行控制.
lsof -a: 上述功能性選項可以組合使用, 但默認采用OR邏輯列出, -a選項令lsof使用AND邏輯;
lsof -t: 只列出進程號, 可以借此得到特定的進程列表, 以方便對這些進程的自動處理, 比如kill lsof -t -i :5198會殺死所有打開5198端口的進程;
lsof -r [seconds]: -r選項可以讓lsof以一定的時間間隔連續執行, 在監視文件/進程時會非常實用.
sof是系統管理/安全的尤伯工具。我大多數時候用它來從系統獲得與網絡連接相關的信息,但那只是這個強大而又鮮為人知的應用的第一步。將這個工具稱之為lsof真實名副其實,因為它是指“列出打開文件(lists openfiles)”。而有一點要切記,在Unix中一切(包括網絡套接口)都是文件。
有趣的是,lsof也是有著最多開關的Linux/Unix命令之一。它有那么多的開關,它有許多選項支持使用-和+前綴。
正如你所見,lsof有著實在是令人驚訝的選項數量。你可以使用它來獲得你系統上設備的信息,你能通過它了解到指定的用戶在指定的地點正在碰什么東西,或者甚至是一個進程正在使用什么文件或網絡連接。
對于我,lsof替代了netstat和ps的全部工作。它可以帶來那些工具所能帶來的一切,而且要比那些工具多得多。那么,讓我們來看看它的一些基本能力吧:
關鍵選項
理解一些關于lsof如何工作的關鍵性東西是很重要的。最重要的是,當你給它傳遞選項時,默認行為是對結果進行“或”運算。因此,如果你正是用-i來拉出一個端口列表,同時又用-p來拉出一個進程列表,那么默認情況下你會獲得兩者的結果。
下面的一些其它東西需要牢記:
-
默認?: 沒有選項,lsof列出活躍進程的所有打開文件
-
組合?: 可以將選項組合到一起,如-abc,但要當心哪些選項需要參數
-
-a?: 結果進行“與”運算(而不是“或”)
-
-l?: 在輸出顯示用戶ID而不是用戶名
-
-h?: 獲得幫助
-
-t?: 僅獲取進程ID
-
-U?: 獲取UNIX套接口地址
-
-F?: 格式化輸出結果,用于其它命令。可以通過多種方式格式化,如-F pcfn(用于進程id、命令名、文件描述符、文件名,并以空終止)
-
獲取網絡信息
正如我所說的,我主要將lsof用于獲取關于系統怎么和網絡交互的信息。這里提供了關于此信息的一些主題:
使用-i顯示所有連接
有些人喜歡用netstat來獲取網絡連接,但是我更喜歡使用lsof來進行此項工作。結果以對我來說很直觀的方式呈現,我僅僅只需改變我的語法,就可以通過同樣的命令來獲取更多信息。
?
使用-i 6僅獲取IPv6流量
?僅顯示TCP連接(同理可獲得UDP連接)
?你也可以通過在-i后提供對應的協議來僅僅顯示TCP或者UDP連接信息。
使用-i:port來顯示與指定端口相關的網絡信息
或者,你也可以通過端口搜索,這對于要找出什么阻止了另外一個應用綁定到指定端口實在是太棒了。
使用@host來顯示指定到指定主機的連接
這對于你在檢查是否開放連接到網絡中或互聯網上某個指定主機的連接時十分有用。
使用@host:port顯示基于主機與端口的連接
你也可以組合主機與端口的顯示信息。
找出監聽端口
找出正等候連接的端口。
你也可以grep “LISTEN”來完成該任務。
找出已建立的連接
你也可以顯示任何已經連接的連接。
你也可以通過grep搜索“ESTABLISHED”來完成該任務。
用戶信息
你也可以獲取各種用戶的信息,以及它們在系統上正干著的事情,包括它們的網絡活動、對文件的操作等。
使用-u顯示指定用戶打開了什么
使用-u user來顯示除指定用戶以外的其它所有用戶所做的事情
殺死指定用戶所做的一切事情
可以消滅指定用戶運行的所有東西,這真不錯。
命令和進程
可以查看指定程序或進程由什么啟動,這通常會很有用,而你可以使用lsof通過名稱或進程ID過濾來完成這
個任務。下面列出了一些選項:
使用-c查看指定的命令正在使用的文件和網絡連接
使用-p查看指定進程ID已打開的內容
-t選項只返回PID
文件和目錄
通過查看指定文件或目錄,你可以看到系統上所有正與其交互的資源——包括用戶、進程等。
顯示與指定目錄交互的所有一切
顯示與指定文件交互的所有一切
高級用法
與tcpdump類似,當你開始組合查詢時,它就顯示了它強大的功能。
顯示daniel連接到1.1.1.1所做的一切
同時使用-t和-c選項以給進程發送 HUP 信號
lsof +L1顯示所有打開的鏈接數小于1的文件
這通常(當不總是)表示某個攻擊者正嘗試通過刪除文件入口來隱藏文件內容。
顯示某個端口范圍的打開的連接
結尾
本入門教程只是管窺了lsof功能的一斑,要查看完整參考,運行man lsof命令或查看在線版本。