Linux 命令神器:lsof

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)試工具來快速診斷軟件的"疑難雜癥"央星。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莉给,一起剝皮案震驚了整個(gè)濱河市凿蒜,隨后出現(xiàn)的幾起案子废封,更是在濱河造成了極大的恐慌丧蘸,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刽漂,死亡現(xiàn)場離奇詭異弟孟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庭猩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門蔼水,熙熙樓的掌柜王于貴愁眉苦臉地迎上來录肯,“玉大人,你說我怎么就攤上這事优炬√埃” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵糊余,是天一觀的道長贬芥。 經(jīng)常有香客問我宣决,道長,這世上最難降的妖魔是什么威沫? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮棒掠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颈墅。我一直安慰自己雾袱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布毒坛。 她就那樣靜靜地躺著煎殷,像睡著了一般述么。 火紅的嫁衣襯著肌膚如雪愕掏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天剑梳,我揣著相機(jī)與錄音滑潘,去河邊找鬼。 笑死追逮,一個(gè)胖子當(dāng)著我的面吹牛粹舵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巴席,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼漾唉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赵刑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丐箩,失蹤者是張志新(化名)和其女友劉穎恤煞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體概漱,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓤摧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年玉吁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片这揣。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡给赞,死狀恐怖矫户,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情皆辽,我是刑警寧澤柑蛇,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布耻台,位于F島的核電站粘我,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏征字。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一畅厢、第九天 我趴在偏房一處隱蔽的房頂上張望框杜。 院中可真熱鬧,春花似錦袖肥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至磷蛹,卻和暖如春溪烤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背莺葫。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工枪眉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留再层,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓蒿秦,卻偏偏與公主長得像棍鳖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子渡处,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,175評論 2 33
  • 簡介 用簡單的話來定義tcpdump侣肄,就是:dump the traffic on a network醇份,根據(jù)使用者...
    保川閱讀 5,961評論 1 13
  • 18.1 引言 TCP是一個(gè)面向連接的協(xié)議。無論哪一方向另一方發(fā)送數(shù)據(jù)之前矩距,都必須先在雙方之間建立一條連接怖竭。本章將...
    張芳濤閱讀 3,388評論 0 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理侵状,服務(wù)發(fā)現(xiàn),斷路器趣兄,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • 本文是對于昨天課程的一個(gè)復(fù)盤艇潭,主要從五個(gè)方面闡述如何利用買基金積攢一輩子的財(cái)富。1.為什么是基金蹋凝?2.買什么基金?...
    smallfen閱讀 2,068評論 8 46