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/,如损害您的权益,请联络作者删除。