lsof是系統(tǒng)管理/安全的尤伯工具瞳氓。將這個(gè)工具稱之為lsof真實(shí)名副其實(shí)栓袖,因?yàn)樗侵浮傲谐龃蜷_文件(lists openfiles)”裹刮。而有一點(diǎn)要切記,在Unix中一切(包括網(wǎng)絡(luò)套接口)都是文件必指。
有趣的是恕洲,lsof也是有著最多開關(guān)的Linux/Unix命令之一。它有那么多的開關(guān)葛家,它有許多選項(xiàng)支持使用-和+前綴。
1. usage: [-?abhlnNoOPRstUvV] [+|-c c] [+|-d s] [+D D] [+|-f[cgG]]
2. [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+|-M] [-o [o]]
3. [-p s] [+|-r [t]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
正如你所見底燎,lsof有著實(shí)在是令人驚訝的選項(xiàng)數(shù)量弹砚。你可以使用它來獲得你系統(tǒng)上設(shè)備的信息桌吃,你能通過它了解到指定的用戶在指定的地點(diǎn)正在碰什么東西,或者甚至是一個(gè)進(jìn)程正在使用什么文件或網(wǎng)絡(luò)連接逗物。
對于我瑟俭,lsof替代了netstat和ps的全部工作。它可以帶來那些工具所能帶來的一切失暴,而且要比那些工具多得多锐帜。那么畜号,讓我們來看看它的一些基本能力吧:
關(guān)鍵選項(xiàng)
理解一些關(guān)于lsof如何工作的關(guān)鍵性東西是很重要的。最重要的是蛮拔,當(dāng)你給它傳遞選項(xiàng)時(shí)痹升,默認(rèn)行為是對結(jié)果進(jìn)行“或”運(yùn)算疼蛾。因此,如果你正是用-i來拉出一個(gè)端口列表衍慎,同時(shí)又用-p來拉出一個(gè)進(jìn)程列表,那么默認(rèn)情況下你會(huì)獲得兩者的結(jié)果赠法。
下面的一些其它東西需要牢記:
- 默認(rèn) : 沒有選項(xiàng)乔夯,lsof列出活躍進(jìn)程的所有打開文件
- 組合 : 可以將選項(xiàng)組合到一起,如-abc末荐,但要當(dāng)心哪些選項(xiàng)需要參數(shù)
- -a : 結(jié)果進(jìn)行“與”運(yùn)算(而不是“或”)
- -l : 在輸出顯示用戶ID而不是用戶名
- -h : 獲得幫助
- -t : 僅獲取進(jìn)程ID
- -U : 獲取UNIX套接口地址
- -F : 格式化輸出結(jié)果,用于其它命令茂蚓×牵可以通過多種方式格式化负乡,如-F pcfn(用于進(jìn)程id、命令名茂腥、文件描述符切省、文件名,并以空終止)
獲取網(wǎng)絡(luò)信息
正如我所說的般渡,我主要將lsof用于獲取關(guān)于系統(tǒng)怎么和網(wǎng)絡(luò)交互的信息驯用。這里提供了關(guān)于此信息的一些主題:
使用-i顯示所有連接
有些人喜歡用netstat來獲取網(wǎng)絡(luò)連接儒老,但是我更喜歡使用lsof來進(jìn)行此項(xiàng)工作。結(jié)果以對我來說很直觀的方式呈現(xiàn)薇正,我僅僅只需改變我的語法,就可以通過同樣的命令來獲取更多信息钠怯。
語法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
1. # lsof -i
3. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
4. dhcpcd 6061 root 4u IPv4 4510 UDP *:bootpc
5. sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
6. 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后提供對應(yīng)的協(xié)議來僅僅顯示TCP或者UDP連接信息曙聂。
1. # lsof -iTCP
3. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
4. sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
5. sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
使用-i:port來顯示與指定端口相關(guān)的網(wǎng)絡(luò)信息
或者宁脊,你也可以通過端口搜索榆苞,這對于要找出什么阻止了另外一個(gè)應(yīng)用綁定到指定端口實(shí)在是太棒了霞捡。
1. # lsof -i :22
3. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
4. sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
5. sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
使用@host來顯示指定到指定主機(jī)的連接
這對于你在檢查是否開放連接到網(wǎng)絡(luò)中或互聯(lián)網(wǎng)上某個(gè)指定主機(jī)的連接時(shí)十分有用。
1. # lsof -i@172.16.12.5
3. sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->172.16.12.5:49901 (ESTABLISHED)
使用@host:port顯示基于主機(jī)與端口的連接
你也可以組合主機(jī)與端口的顯示信息赊琳。
1. # lsof -i@172.16.12.5:22
3. sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->172.16.12.5:49901 (ESTABLISHED)
找出監(jiān)聽端口
找出正等候連接的端口躏筏。
1. # lsof -i -sTCP:LISTEN
你也可以grep “LISTEN”來完成該任務(wù)呈枉。
1. # lsof -i | grep -i LISTEN
3. iTunes 400 daniel 16u IPv4 0x4575228 0t0 TCP *:daap (LISTEN)
找出已建立的連接
你也可以顯示任何已經(jīng)連接的連接猖辫。
1. # lsof -i -sTCP:ESTABLISHED
你也可以通過grep搜索“ESTABLISHED”來完成該任務(wù)。
1. # lsof -i | grep -i ESTABLISHED
3. firefox-b 169 daniel 49u IPv4 0t0 TCP 1.2.3.3:1863->1.2.3.4:http (ESTABLISHED)
用戶信息
你也可以獲取各種用戶的信息芝囤,以及它們在系統(tǒng)上正干著的事情辛萍,包括它們的網(wǎng)絡(luò)活動(dòng)、對文件的操作等挠轴。
使用-u顯示指定用戶打開了什么
1. # lsof -u daniel
3. -- snipped --
4. Dock 155 daniel txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
5. Dock 155 daniel txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
6. Dock 155 daniel txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
7. Dock 155 daniel txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
8. Dock 155 daniel txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
9. -- snipped --
使用-u user來顯示除指定用戶以外的其它所有用戶所做的事情
1. # lsof -u ^daniel
3. -- snipped --
4. Dock 155 jim txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
5. Dock 155 jim txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
6. Dock 155 jim txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
7. Dock 155 jim txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
8. Dock 155 jim txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
9. -- snipped --
殺死指定用戶所做的一切事情
可以消滅指定用戶運(yùn)行的所有東西岸晦,這真不錯(cuò)。
1. # kill -9 `lsof -t -u daniel`
命令和進(jìn)程
可以查看指定程序或進(jìn)程由什么啟動(dòng)邢隧,這通常會(huì)很有用冈在,而你可以使用lsof通過名稱或進(jìn)程ID過濾來完成這個(gè)任務(wù)。下面列出了一些選項(xiàng):
使用-c查看指定的命令正在使用的文件和網(wǎng)絡(luò)連接
1. # lsof -c syslog-ng
3. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
4. syslog-ng 7547 root cwd DIR 3,3 4096 2 /
5. syslog-ng 7547 root rtd DIR 3,3 4096 2 /
6. syslog-ng 7547 root txt REG 3,3 113524 1064970 /usr/sbin/syslog-ng
7. -- snipped --
使用-p查看指定進(jìn)程ID已打開的內(nèi)容
1. # lsof -p 10075
3. -- snipped --
4. sshd 10068 root mem REG 3,3 34808 850407 /lib/libnss_files-2.4.so
5. sshd 10068 root mem REG 3,3 34924 850409 /lib/libnss_nis-2.4.so
6. sshd 10068 root mem REG 3,3 26596 850405 /lib/libnss_compat-2.4.so
7. sshd 10068 root mem REG 3,3 200152 509940 /usr/lib/libssl.so.0.9.7
8. sshd 10068 root mem REG 3,3 46216 510014 /usr/lib/liblber-2.3
9. sshd 10068 root mem REG 3,3 59868 850413 /lib/libresolv-2.4.so
10. sshd 10068 root mem REG 3,3 1197180 850396 /lib/libc-2.4.so
11. sshd 10068 root mem REG 3,3 22168 850398 /lib/libcrypt-2.4.so
12. sshd 10068 root mem REG 3,3 72784 850404 /lib/libnsl-2.4.so
13. sshd 10068 root mem REG 3,3 70632 850417 /lib/libz.so.1.2.3
14. sshd 10068 root mem REG 3,3 9992 850416 /lib/libutil-2.4.so
15. -- snipped --
-t選項(xiàng)只返回PID
1. # lsof -t -c Mail
3. 350
文件和目錄
通過查看指定文件或目錄,你可以看到系統(tǒng)上所有正與其交互的資源——包括用戶溅固、進(jìn)程等。
顯示與指定目錄交互的所有一切
1. # lsof /var/log/messages/
3. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
4. syslog-ng 7547 root 4w REG 3,3 217309 834024 /var/log/messages
顯示與指定文件交互的所有一切
1. # lsof /home/daniel/firewall_whitelist.txt
高級用法
與tcpdump類似询吴,當(dāng)你開始組合查詢時(shí)猛计,它就顯示了它強(qiáng)大的功能爆捞。
顯示daniel連接到1.1.1.1所做的一切
1. # lsof -u daniel -i @1.1.1.1
3. bkdr 1893 daniel 3u IPv6 3456 TCP 10.10.1.10:1234->1.1.1.1:31337 (ESTABLISHED)
同時(shí)使用-t和-c選項(xiàng)以給進(jìn)程發(fā)送 HUP 信號(hào)
1. # kill -HUP `lsof -t -c sshd`
lsof +L1顯示所有打開的鏈接數(shù)小于1的文件
這通常(當(dāng)不總是)表示某個(gè)攻擊者正嘗試通過刪除文件入口來隱藏文件內(nèi)容。
1. # lsof +L1
3. (hopefully nothing)
顯示某個(gè)端口范圍的打開的連接
1. # lsof -i @fw.google.com:2150=2180
結(jié)尾
本入門教程只是管窺了lsof功能的一斑毛好,要查看完整參考肌访,運(yùn)行man lsof命令或查看在線版本艇劫。希望本文對你有所助益,也隨時(shí)歡迎你的評論和指正蟹演。
資源
本文由 Daniel Miessler撰寫顷蟀,首次在他博客上貼出
一般root用戶才能執(zhí)行l(wèi)sof命令,普通用戶可以看見/usr/sbin/lsof命令鸣个,
但是普通用戶執(zhí)行會(huì)顯示“permission denied”
我總結(jié)一下lsof指令的用法:
lsof abc.txt 顯示開啟文件abc.txt的進(jìn)程
lsof -i :22 知道22端口現(xiàn)在運(yùn)行什么程序
lsof -c abc 顯示abc進(jìn)程現(xiàn)在打開的文件
lsof -g gid 顯示歸屬gid的進(jìn)程情況
lsof +d /usr/local/ 顯示目錄下被進(jìn)程開啟的文件
lsof +D /usr/local/ 同上,但是會(huì)搜索目錄下的目錄昼窗,時(shí)間較長
lsof -d 4 顯示使用fd為4的進(jìn)程 www.2cto.com
lsof -i 用以顯示符合條件的進(jìn)程情況
語法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4位置
service --> /etc/service中的 service name (可以不只一個(gè))
port --> 端口號(hào) (可以不只一個(gè))
例子: TCP:25 - TCP and port 25
@1.2.3.4 - Internet IPv4 host address 1.2.3.4
tcp@ohaha.ks.edu.tw:ftp - TCP protocol hosthaha.ks.edu.tw service name:ftp
lsof -n 不將IP轉(zhuǎn)換為hostname澄惊,缺省是不加上-n參數(shù)
例子: lsof -i tcp@ohaha.ks.edu.tw:ftp -n
lsof -p 12 看進(jìn)程號(hào)為12的進(jìn)程打開了哪些文件
lsof +|-r [t] 控制lsof不斷重復(fù)執(zhí)行,缺省是15s刷新
-r肛搬,lsof會(huì)永遠(yuǎn)不斷的執(zhí)行亭敢,直到收到中斷信號(hào)
+r帅刀,lsof會(huì)一直執(zhí)行远剩,直到?jīng)]有檔案被顯示
例子:不斷查看目前ftp連接的情況:lsof -i tcp@ohaha.ks.edu.tw:ftp -r
lsof -s 列出打開文件的大小,如果沒有大小瓜晤,則留下空白
lsof -u username 以UID,列出打開的文件 www.2cto.com
關(guān)注:
進(jìn)程調(diào)試命令:truss驱犹、strace和ltrace
進(jìn)程無法啟動(dòng)雄驹,軟件運(yùn)行速度突然變慢淹辞,程序的"SegmentFault"等等都是讓每個(gè)Unix系統(tǒng)用戶頭痛的問題,而這些問題都可以通過使用truss蔬将、strace和ltrace這三個(gè)常用的調(diào)試工具來快速診斷軟件的"疑難雜癥"央星。