在Linux系統中使用lsof命令的教程
在Linux系統中使用lsof命令的教程
lsof是系統管理/安全的尤伯工具。我大多數時候用它來從系統獲得與網絡連接相關的信息,但那只是這個強大而又鮮爲人知的應用的第一步。將這個工具稱之爲lsof真實名副其實,因爲它是指“列出打開文件(lists openfiles)”。而有一點要切記,在Unix中一切(包括網絡套接口)都是文件。
有趣的是,lsof也是有着最多開關的Linux/Unix命令之一。它有那麼多的開關,它有許多選項支持使用-和+前綴。
usage: [-?abhlnNoOPRstUvV] [+|-c c] [+|-d s] [+D D] [+|-f[cgG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+|-M] [-o [o]]
[-p s] [+|-r [t]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
正如你所見,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來進行此項工作。結果以對我來說很直觀的方式呈現,我僅僅只需改變我的語法,就可以通過同樣的命令來獲取更多信息。
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
dhcpcd 6061 root 4u IPv4 4510 UDP *:bootpc
sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
sshd 7892 root 3u IPv6 6757 TCP :ssh-> (ESTABLISHED)
使用-i 6僅獲取IPv6流量
# lsof -i 6
僅顯示TCP連接(同理可獲得UDP連接)
你也可以通過在-i後提供對應的協議來僅僅顯示TCP或者UDP連接信息。
# lsof -iTCP
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
sshd 7892 root 3u IPv6 6757 TCP :ssh-> (ESTABLISHED)
使用-i:port來顯示與指定端口相關的網絡信息
或者,你也可以通過端口搜索,這對於要找出什麼阻止了另外一個應用綁定到指定端口實在是太棒了。
# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
sshd 7892 root 3u IPv6 6757 TCP :ssh-> (ESTABLISHED)
使用@host來顯示指定到指定主機的連接
這對於你在檢查是否開放連接到網絡中或互聯網上某個指定主機的連接時十分有用。
# lsof
sshd 7892 root 3u IPv6 6757 TCP :ssh-> (ESTABLISHED)
使用@host:port顯示基於主機與端口的`連接
你也可以組合主機與端口的顯示信息。
# lsof
sshd 7892 root 3u IPv6 6757 TCP :ssh-> (ESTABLISHED)
找出監聽端口
找出正等候連接的端口。
# lsof -i -sTCP:LISTEN
你也可以grep “LISTEN”來完成該任務。
# lsof -i | grep -i LISTEN
iTunes 400 daniel 16u IPv4 0x4575228 0t0 TCP *:daap (LISTEN)
找出已建立的連接
你也可以顯示任何已經連接的連接。
# lsof -i -sTCP:ESTABLISHED
你也可以通過grep搜索“ESTABLISHED”來完成該任務。
[/code]# lsof -i | grep -i ESTABLISHED
firefox-b 169 daniel 49u IPv4 0t0 TCP ->:http (ESTABLISHED)[/code]
用戶信息
你也可以獲取各種用戶的信息,以及它們在系統上正幹着的事情,包括它們的網絡活動、對文件的操作等。
使用-u顯示指定用戶打開了什麼
# lsof -u daniel
-- snipped --
Dock 155 daniel txt REG 14,2 2798436 823208 /usr/lib/b
Dock 155 daniel txt REG 14,2 1580212 823126 /usr/lib/b
Dock 155 daniel txt REG 14,2 2934184 823498 /usr/lib/libstdc++b
Dock 155 daniel txt REG 14,2 132008 823505 /usr/lib/libgcc_b
Dock 155 daniel txt REG 14,2 212160 823214 /usr/lib/b
-- snipped --
使用-u user來顯示除指定用戶以外的其它所有用戶所做的事情
# lsof -u ^daniel
-- snipped --
Dock 155 jim txt REG 14,2 2798436 823208 /usr/lib/b
Dock 155 jim txt REG 14,2 1580212 823126 /usr/lib/b
Dock 155 jim txt REG 14,2 2934184 823498 /usr/lib/libstdc++b
Dock 155 jim txt REG 14,2 132008 823505 /usr/lib/libgcc_b
Dock 155 jim txt REG 14,2 212160 823214 /usr/lib/b
-- snipped --
殺死指定用戶所做的一切事情
可以消滅指定用戶運行的所有東西,這真不錯。
# kill -9 `lsof -t -u daniel`
命令和進程
可以查看指定程序或進程由什麼啓動,這通常會很有用,而你可以使用lsof通過名稱或進程ID過濾來完成這個任務。下面列出了一些選項:
使用-c查看指定的命令正在使用的文件和網絡連接
# lsof -c syslog-ng
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslog-ng 7547 root cwd DIR 3,3 4096 2 /
syslog-ng 7547 root rtd DIR 3,3 4096 2 /
syslog-ng 7547 root txt REG 3,3 113524 1064970 /usr/sbin/syslog-ng
-- snipped --
使用-p查看指定進程ID已打開的內容
# lsof -p 10075
-- snipped --
sshd 10068 root mem REG 3,3 34808 850407 /lib/libnss_
sshd 10068 root mem REG 3,3 34924 850409 /lib/libnss_
sshd 10068 root mem REG 3,3 26596 850405 /lib/libnss_
sshd 10068 root mem REG 3,3 200152 509940 /usr/lib/
sshd 10068 root mem REG 3,3 46216 510014 /usr/lib/liblber-2.3
sshd 10068 root mem REG 3,3 59868 850413 /lib/
sshd 10068 root mem REG 3,3 1197180 850396 /lib/
sshd 10068 root mem REG 3,3 22168 850398 /lib/
sshd 10068 root mem REG 3,3 72784 850404 /lib/
sshd 10068 root mem REG 3,3 70632 850417 /lib/
sshd 10068 root mem REG 3,3 9992 850416 /lib/
-- snipped --
-t選項只返回PID
# lsof -t -c Mail
350
文件和目錄
通過查看指定文件或目錄,你可以看到系統上所有正與其交互的資源——包括用戶、進程等。
顯示與指定目錄交互的所有一切
# lsof /var/log/messages/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslog-ng 7547 root 4w REG 3,3 217309 834024 /var/log/messages
顯示與指定文件交互的所有一切
# lsof /home/daniel/firewall_
高級用法
與tcpdump類似,當你開始組合查詢時,它就顯示了它強大的功能。
顯示daniel連接到所做的一切
# lsof -u daniel -i @
bkdr 1893 daniel 3u IPv6 3456 TCP -> (ESTABLISHED)
同時使用-t和-c選項以給進程發送 HUP 信號
# kill -HUP `lsof -t -c sshd`
lsof +L1顯示所有打開的鏈接數小於1的文件
這通常(當不總是)表示某個攻擊者正嘗試通過刪除文件入口來隱藏文件內容。
# lsof +L1
(hopefully nothing)
顯示某個端口範圍的打開的連接
# lsof -i @=2180
相關文章
-
Linux系統xlsatom命令如何使用
在Linux系統中有很多命令,理論上可以用Linux命令完成所有鼠標鍵盤的操作。xlsatoms命令可以用來定義搜索文件的範圍和成分,下面小編就給大家介紹一下Linux系統xlsatoms命令的.使用說明。一起去看看吧!功能說明:列出X Ser -
Linux系統中smbclient命令的使用方法
Linux命令smbclient主要是用來存儲和讀取服務器上的用戶端程序,並對這些程序進行解析和記錄。本文就來具體介紹一下Linux系統smbclient命令的使用方法。1、列出某個IP地址所提供的.共享文件夾smbclient -L -U useame% -
linux系統下sudo命令使用方法
如何減少高血壓的發生率呢?在日常生活中很多人都患有高血壓,因爲年輕時他們沒有對高血壓的重視,首先就要做好預防措施,那麼就來看看預防高血壓應該要注意的事項。一、運動運動對高血壓的重要性:有句話說:“年輕時,用健康換取 -
怎麼使用ln命令在Linux系統中創建連接文件
在Linux中ln命令用來爲文件創建連接,連接類型分爲硬連接(Hard Link)和符號連接(Symbolic Link)兩種,默認的連接類型是硬連接。如果要創建符號連接必須使用"-s"選項。那麼怎麼使用ln命令在Linux系統中創建連接文件?下面 -
在linux 操作系統中uniq命令的說明和使用
uniq命令的作用:顯示唯一的行,對於那些連續重複的行只顯示一次!接下來通過實踐實例說明:[root@stu100 ~]# cat testboy took bat homeboy took bat homegirl took bat homedog brought hat homedog brought hat homedog b -
linux系統中scp命令的使用方法
scp命令的用處:scp在網絡上不同的主機之間複製文件,它使用ssh安全協議傳輸數據,具有和ssh一樣的驗證機制,從而安全的遠程拷貝文件。scp命令基本格式:scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file][-l -
Linux系統中strace命令的使用代碼
在調試的時候,strace能幫助你追蹤到一個程序所執行的系統調用。當你想知道程序和操作系統如何交互的時候,這是極其方便的,比如你想知道執行了哪些系統調用,並且以何種順序執行。這個簡單而又強大的工具幾乎在所有的Linux -
LINUX系統教程:passwd命令的用法
小編將介紹passwd命令的幾種用法。首先小編介紹下passwd命令的解釋。passwd 作爲普通用戶和超級權限用戶都可以運行,但作爲普通用戶只能更改自己的用戶密碼,但前提是沒有被root用戶鎖定;如果root用戶運行passwd ,可以設 -
Linux系統ftp程序常用命令
作爲Linux系統中的文件傳輸程序之一,ftp具備功能強大,小巧輕快的特點,且是使用頻率最高的應用程序之一。下面我們將用一整個篇幅進行介紹。歡迎閱讀。 【語法格式】# ftp [參數] [主機名或IP] [端口] 【常用參數】 -
Linux系統top命令的使用方法介紹
Linux系統top命令的使用方法介紹在Linux系統中top命令可以用來監測進程的狀態,也可以修改進程的優先序列。本文就來教大家Linux系統中top命令的使用方法,一起來看一下。1、主要選項-d:後接秒數,狀態更新的秒數,默認5秒-b:以