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