Linux 命令神器:lsof 入門
lsof 是系統管理/安全的工具。我大多數時候用它來從系統獲得與互聯網連線相關的資訊,但那只是這個強大而又鮮為人知的應用的第一步。將這個工具稱之為 lsof 真實名副其實,因為它是指 “列出開啓檔案(lists openfiles)” 。而有一點要切記,在 Unix 中一切(包括互聯網套介面)都是檔案。
有趣的是,lsof 也是有著最多開關的 Linux/Unix 命令之一。它有那麼多的開關,它有許多選項支援使用-和+字首。
12
3
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 來進行此項工作。結果以對我來説很直觀的方式呈現,我僅僅只需改變我的語法,就可以通過同樣的命令來獲取更多資訊。
123
4
5
# lsof -iCOMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEdhcpcd 6061 root 4u IPv4 4510 UDP *:bootpc
sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
使用-i 6 僅獲取 IPv6 流量
1
# lsof -i 6
僅顯示 TCP 連線(同理可獲得 UDP 連線)
你也可以通過在-i 後提供對應的協議來僅僅顯示 TCP 或者 UDP 連線資訊。
123
4
# lsof -iTCPCOMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEsshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
使用-i:port 來顯示與指定埠相關的互聯網資訊
或者,你也可以通過埠搜尋,這對於要找出什麼阻止了另外一個應用繫結到指定埠實在是太棒了。
123
4
# lsof -i :22COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEsshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
使用 @host 來顯示指定到指定 WordPress 主機的連線
這對於你在檢查是否開放連線到互聯網中或網際互聯網上某個指定 WordPress 主機的連線時十分有用。
12
# lsof -i@172.16.12.5sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->172.16.12.5:49901 (ESTABLISHED)
使用 @host:port 顯示基於 WordPress 主機與埠的連線
你也可以組合 WordPress 主機與埠的顯示資訊。
12
# lsof -i@172.16.12.5:22sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->172.16.12.5:49901 (ESTABLISHED)
找出監聽埠
找出正等候連線的埠。
1
# lsof -i -sTCP:LISTEN
你也可以 grep “LISTEN” 來完成該任務。
12
# lsof -i | grep -i LISTENiTunes 400 daniel 16u IPv4 0x4575228 0t0 TCP *:daap (LISTEN)
找出已建立的連線
你也可以顯示任何已經連線的連線。
1
# lsof -i -sTCP:ESTABLISHED
你也可以通過 grep 搜尋 “ESTABLISHED” 來完成該任務。
12
# lsof -i | grep -i ESTABLISHEDfirefox-b 169 daniel 49u IPv4 0t0 TCP 1.2.3.3:1863->1.2.3.4:http (ESTABLISHED)
使用者資訊
你也可以獲取各種使用者的資訊,以及它們在系統上正幹著的事情,包括它們的互聯網活動、對檔案的操作等。
使用-u 顯示指定使用者開啓了什麼
123
4
5
6
7
8
# lsof -u daniel– snipped –Dock 155 daniel txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
Dock 155 daniel txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
Dock 155 daniel txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
Dock 155 daniel txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
Dock 155 daniel txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
— snipped —
使用-u user 來顯示除指定使用者以外的其它所有使用者所做的事情
123
4
5
6
7
8
# lsof -u ^daniel– snipped –Dock 155 jim txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
Dock 155 jim txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
Dock 155 jim txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
Dock 155 jim txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
Dock 155 jim txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
— snipped —
殺死指定使用者所做的一切事情
可以消滅指定使用者執行的所有東西,這真不錯。
1
# kill -9 `lsof -t -u daniel`
命令和程序
可以檢視指定程式或程序由什麼啓動,這通常會很有用,而你可以使用 lsof 通過名稱或程序 ID 過濾來完成這個任務。下面列出了一些選項:
使用-c 檢視指定的命令正在使用的檔案和互聯網連線
123
4
5
6
# lsof -c syslog-ngCOMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEsyslog-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 已開啓的內容
123
4
5
6
7
8
9
10
11
12
13
14
# lsof -p 10075– snipped –sshd 10068 root mem REG 3,3 34808 850407 /lib/libnss_files-2.4.so
sshd 10068 root mem REG 3,3 34924 850409 /lib/libnss_nis-2.4.so
sshd 10068 root mem REG 3,3 26596 850405 /lib/libnss_compat-2.4.so
sshd 10068 root mem REG 3,3 200152 509940 /usr/lib/libssl.so.0.9.7
sshd 10068 root mem REG 3,3 46216 510014 /usr/lib/liblber-2.3
sshd 10068 root mem REG 3,3 59868 850413 /lib/libresolv-2.4.so
sshd 10068 root mem REG 3,3 1197180 850396 /lib/libc-2.4.so
sshd 10068 root mem REG 3,3 22168 850398 /lib/libcrypt-2.4.so
sshd 10068 root mem REG 3,3 72784 850404 /lib/libnsl-2.4.so
sshd 10068 root mem REG 3,3 70632 850417 /lib/libz.so.1.2.3
sshd 10068 root mem REG 3,3 9992 850416 /lib/libutil-2.4.so
— snipped —
-t 選項只返回 PID
12
# lsof -t -c Mail350
檔案和目錄
通過檢視指定檔案或目錄,你可以看到系統上所有正與其互動的資源——包括使用者、程序等。
顯示與指定目錄互動的所有一切
123
# lsof /var/log/messages/COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEsyslog-ng 7547 root 4w REG 3,3 217309 834024 /var/log/messages
顯示與指定檔案互動的所有一切
1
# lsof /home/daniel/firewall_whitelist.txt
高階用法
與 tcpdump 類似,當你開始組合查詢時,它就顯示了它強大的功能。
顯示 daniel 連線到 1.1.1.1 所做的一切
12
# lsof -u daniel -i @1.1.1.1bkdr 1893 daniel 3u IPv6 3456 TCP 10.10.1.10:1234->1.1.1.1:31337 (ESTABLISHED)
同時使用-t 和-c 選項以給程序傳送 HUP 訊號
1
# kill -HUP `lsof -t -c sshd`
lsof +L1 顯示所有開啓的連結數小於 1 的檔案
這通常(當不總是)表示某個攻擊者正嘗試通過刪除檔案入口來隱藏檔案內容。
12
# lsof +L1(hopefully nothing)
顯示某個埠範圍的開啓的連線
1
# lsof -i @fw.google.com:2150=2180
結尾
本入門教程只是管窺了 lsof 功能的一斑,要檢視完整參考,執行 man lsof 命令或檢視線上版本。希望本文對你有所助益,也隨時歡迎你的評論和指正。轉載自 http://www.ttlsa.com/linux/linux-command-lsof-study/,如損害您的權益,請聯絡作者刪除。