lsof是系统管理/安全的尤伯工具。我大多数时候用它来从系统获得与网络连接相关的信息,但那只是这个强大而又鲜为人知的应用的第一步。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。

有趣的是,lsof也是有着最多开关的Linux/Unix命令之一。它有那么多的开关,它有许多选项支持使用-和+前缀。

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]

1

2

3

usage:[-?abhlnNoOPRstUvV][+|-cc][+|-ds][+DD][+|-f[cgG]]

[-F[f]][-g[s]][-i[i]][+|-L[l]][+|-M][-o[o]]

[-ps][+|-r[t]][-S[t]][-T[t]][-us][+|-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来进行此项工作。结果以对我来说很直观的方式呈现,我仅仅只需改变我的语法,就可以通过同样的命令来获取更多信息。

# lsof -i

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

dhcpcd 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)

1

2

3

4

5

# lsof -i

COMMANDPIDUSERFDTYPEDEVICESIZENODENAME

dhcpcd6061root4uIPv44510UDP *:bootpc

sshd7703root3uIPv66499TCP *:ssh(LISTEN)

sshd7892root3uIPv66757TCP10.10.1.5:ssh->192.168.1.5:49901(ESTABLISHED)

使用-i 6仅获取IPv6流量

# lsof -i 6

1

# lsof -i 6

仅显示TCP连接(同理可获得UDP连接)

你也可以通过在-i后提供对应的协议来仅仅显示TCP或者UDP连接信息。

# lsof -iTCP

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

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)

1

2

3

4

# lsof -iTCP

COMMANDPIDUSERFDTYPEDEVICESIZENODENAME

sshd7703root3uIPv66499TCP *:ssh(LISTEN)

sshd7892root3uIPv66757TCP10.10.1.5:ssh->192.168.1.5:49901(ESTABLISHED)

使用-i:port来显示与指定端口相关的网络信息

或者,你也可以通过端口搜索,这对于要找出什么阻止了另外一个应用绑定到指定端口实在是太棒了。

# lsof -i :22

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

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)

1

2

3

4

# lsof -i :22

COMMANDPIDUSERFDTYPEDEVICESIZENODENAME

sshd7703root3uIPv66499TCP *:ssh(LISTEN)

sshd7892root3uIPv66757TCP10.10.1.5:ssh->192.168.1.5:49901(ESTABLISHED)

使用@host来显示指定到指定主机的连接

这对于你在检查是否开放连接到网络中或互联网上某个指定主机的连接时十分有用。

# lsof -i@172.16.12.5

sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->172.16.12.5:49901 (ESTABLISHED)

1

2

# lsof -i@172.16.12.5

sshd7892root3uIPv66757TCP10.10.1.5:ssh->172.16.12.5:49901(ESTABLISHED)

使用@host:port显示基于主机与端口的连接

你也可以组合主机与端口的显示信息。

# lsof -i@172.16.12.5:22

sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->172.16.12.5:49901 (ESTABLISHED)

1

2

# lsof -i@172.16.12.5:22

sshd7892root3uIPv66757TCP10.10.1.5:ssh->172.16.12.5:49901(ESTABLISHED)

找出监听端口

找出正等候连接的端口。

# lsof -i -sTCP:LISTEN

1

# lsof -i -sTCP:LISTEN

你也可以grep “LISTEN”来完成该任务。

# lsof -i | grep -i LISTEN

iTunes 400 daniel 16u IPv4 0x4575228 0t0 TCP *:daap (LISTEN)

1

2

# lsof -i | grep -i LISTEN

iTunes400daniel16uIPv40x45752280t0TCP *:daap(LISTEN)

找出已建立的连接

你也可以显示任何已经连接的连接。

# lsof -i -sTCP:ESTABLISHED

1

# lsof -i -sTCP:ESTABLISHED

你也可以通过grep搜索“ESTABLISHED”来完成该任务。

# lsof -i | grep -i ESTABLISHED

firefox-b 169 daniel 49u IPv4 0t0 TCP 1.2.3.3:1863->1.2.3.4:http (ESTABLISHED)

1

2

# lsof -i | grep -i ESTABLISHED

firefox-b169daniel49uIPv40t0TCP1.2.3.3:1863->1.2.3.4:http(ESTABLISHED)

用户信息

你也可以获取各种用户的信息,以及它们在系统上正干着的事情,包括它们的网络活动、对文件的操作等。

使用-u显示指定用户打开了什么

# 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 --

1

2

3

4

5

6

7

8

# lsof -u daniel

--snipped--

Dock155danieltxtREG14,22798436823208/usr/lib/libicucore.A.dylib

Dock155danieltxtREG14,21580212823126/usr/lib/libobjc.A.dylib

Dock155danieltxtREG14,22934184823498/usr/lib/libstdc++.6.0.4.dylib

Dock155danieltxtREG14,2132008823505/usr/lib/libgcc_s.1.dylib

Dock155danieltxtREG14,2212160823214/usr/lib/libauto.dylib

--snipped--

使用-u user来显示除指定用户以外的其它所有用户所做的事情

# 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

2

3

4

5

6

7

8

# lsof -u ^daniel

--snipped--

Dock155jimtxtREG14,22798436823208/usr/lib/libicucore.A.dylib

Dock155jimtxtREG14,21580212823126/usr/lib/libobjc.A.dylib

Dock155jimtxtREG14,22934184823498/usr/lib/libstdc++.6.0.4.dylib

Dock155jimtxtREG14,2132008823505/usr/lib/libgcc_s.1.dylib

Dock155jimtxtREG14,2212160823214/usr/lib/libauto.dylib

--snipped--

杀死指定用户所做的一切事情

可以消灭指定用户运行的所有东西,这真不错。

# kill -9 `lsof -t -u daniel`

1

# kill -9 `lsof -t -u daniel`

命令和进程

可以查看指定程序或进程由什么启动,这通常会很有用,而你可以使用lsof通过名称或进程ID过滤来完成这个任务。下面列出了一些选项:

使用-c查看指定的命令正在使用的文件和网络连接

# lsof -c syslog-ng

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

syslog-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 --

1

2

3

4

5

6

# lsof -c syslog-ng

COMMANDPIDUSERFDTYPEDEVICESIZENODENAME

syslog-ng7547rootcwdDIR3,340962/

syslog-ng7547rootrtdDIR3,340962/

syslog-ng7547roottxtREG3,31135241064970/usr/sbin/syslog-ng

--snipped--

使用-p查看指定进程ID已打开的内容

# 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 --

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# lsof -p 10075

--snipped--

sshd10068rootmemREG3,334808850407/lib/libnss_files-2.4.so

sshd10068rootmemREG3,334924850409/lib/libnss_nis-2.4.so

sshd10068rootmemREG3,326596850405/lib/libnss_compat-2.4.so

sshd10068rootmemREG3,3200152509940/usr/lib/libssl.so.0.9.7

sshd10068rootmemREG3,346216510014/usr/lib/liblber-2.3

sshd10068rootmemREG3,359868850413/lib/libresolv-2.4.so

sshd10068rootmemREG3,31197180850396/lib/libc-2.4.so

sshd10068rootmemREG3,322168850398/lib/libcrypt-2.4.so

sshd10068rootmemREG3,372784850404/lib/libnsl-2.4.so

sshd10068rootmemREG3,370632850417/lib/libz.so.1.2.3

sshd10068rootmemREG3,39992850416/lib/libutil-2.4.so

--snipped--

-t选项只返回PID

# lsof -t -c Mail

350

1

2

# lsof -t -c Mail

350

文件和目录

通过查看指定文件或目录,你可以看到系统上所有正与其交互的资源——包括用户、进程等。

显示与指定目录交互的所有一切

# lsof /var/log/messages/

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

syslog-ng 7547 root 4w REG 3,3 217309 834024 /var/log/messages

1

2

3

# lsof /var/log/messages/

COMMANDPIDUSERFDTYPEDEVICESIZENODENAME

syslog-ng7547root4wREG3,3217309834024/var/log/messages

显示与指定文件交互的所有一切

# lsof /home/daniel/firewall_whitelist.txt

1

# lsof /home/daniel/firewall_whitelist.txt

高级用法

与tcpdump类似,当你开始组合查询时,它就显示了它强大的功能。

显示daniel连接到1.1.1.1所做的一切

# lsof -u daniel -i @1.1.1.1

bkdr 1893 daniel 3u IPv6 3456 TCP 10.10.1.10:1234->1.1.1.1:31337 (ESTABLISHED)

1

2

# lsof -u daniel -i @1.1.1.1

bkdr1893daniel3uIPv63456TCP10.10.1.10:1234->1.1.1.1:31337(ESTABLISHED)

同时使用-t和-c选项以给进程发送 HUP 信号

# kill -HUP `lsof -t -c sshd`

1

# kill -HUP `lsof -t -c sshd`

lsof +L1显示所有打开的链接数小于1的文件

这通常(当不总是)表示某个攻击者正尝试通过删除文件入口来隐藏文件内容。

# lsof +L1

(hopefully nothing)

1

2

# lsof +L1

(hopefullynothing)

显示某个端口范围的打开的连接

# lsof -i @fw.google.com:2150=2180

1

# lsof -i @fw.google.com:2150=2180

结尾

本入门教程只是管窥了lsof功能的一斑,要查看完整参考,运行man lsof命令或查看在线版本。希望本文对你有所助益,也随时欢迎你的评论和指正。

资源

lsof手册页:http://www.netadmintools.com/html/lsof.man.html

linux 查看进程的lsof,Linux 命令神器:lsof 入门相关推荐

  1. Linux 查看进程的几个命令

    查看进程状态的基础指令,有以下几个常用参数: ps 查看当前终端下的命令 top 查看所有的进程(是动态的) 本文重点介绍通过ps命令查看进程 一:一些常用的参数组合及解析 1. 查看包含其他使用者的 ...

  2. linux查看进程和线程的命令

    1.任务:获得进程信息 :ps命令,或者top命令,它能显示当前运行中进程的相关信息,包括进程的PID. ps命令能提供一份当前进程的快照.如果想状态可以自动刷新,可以使用top命令. 2.任务:获得 ...

  3. linux杀死指定进程中的线程,linux查看进程和线程的命令

    1.任务:获得进程信息 :ps命令,或者top命令,它能显示当前运行中进程的相关信息,包括进程的PID. ps命令能提供一份当前进程的快照.如果想状态可以自动刷新,可以使用top命令. 2.任务:获得 ...

  4. linux查看进程grep工作组,Linux下查看一个进程打开了哪...-linux 如何找到进程的工作目录...-使用 grep 恢复误删的文本文件_169IT.COM...

    Linux下查看一个进程打开了哪些文件的命令示例,供大家学习参考. 查看进程14755(httpd)打开了哪些文件: 代码如下: localhost:~# lsof -p 14755 COMMAND ...

  5. linux查看进程占句柄,linux下查看系统进程占用的句柄数方法

    linux下查看系统进程占用的句柄数方法 ---查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n 1024 ----查看当前进程打开了多少句柄数 # lsof -n|awk ' ...

  6. linux查看进程是否终止,linux如何查看进程和终止进程?

    在LINUX命令平台输入1-2个字符后按Tab键会自动补全后面的部分(前提是要有这个东西,例如在装了tomcat的前提下,输入tomcat的to按tab). 2. ps 命令用于查看当前正在运行的进程 ...

  7. linux查看进程的优先数,Linux 进程优先级查看及调整

    首先用top或者ps -l查看进程会发现有PR(PRI) NI两个字段:NI 是优先值,是用户层面的概念, PR是进程的实际优先级, 是给内核(kernel)看(用)的. 一般情况下,PR=NI+20 ...

  8. linux查看进程占用pcu,Linux运维:如何使用ss代替netstat命令

    文章目录 [隐藏] netstat 的用法 ss 的用法 在运维和管理Linux服务器的时候,我们最常用的就是netstat命令,我常用这个命令来查看当前服务器上有哪些进程正在侦听端口,主要用来诊断网 ...

  9. Linux查看进程并重启服务命令

    top -u root 查看系统进程 service network restart service iptables restart service sshd restart service ngi ...

  10. linux 查看进程的信号,Linux 进程信号查看与控制

    Linux 进程信号查看与控制 1) SIGHUP 本信号在用户终端连接 (正常或非正常) 结束时发出 通常是在终端的控制进程结束时 通知同一 session 内的各个作业 这时它们与控制终端不再关联 ...

最新文章

  1. Hadoop Pipes编程之C++实现WordCount
  2. 关于request取中文字符串变?的解决办法
  3. Android应用程序与SurfaceFlinger服务的关系概述和学习计划
  4. VLC-OFDM系统中一种改进的可变噪声比特功率分配算法
  5. 《C++ Primer》8.1.2节练习
  6. 细谈Web框架设计与实现
  7. ArcGIS操作小技巧(六)之Network Analyst工具条不能使用的解决方法
  8. 大庆油田真正解决了吃饭问题
  9. Atitit 防烫伤指南与规范 attilax总结
  10. easyswoole数据库连接池_Swoole Redis 连接池的实现
  11. python面试笔试题
  12. 疯狂程序员网址。。。
  13. Microsoft Visual SourceSafe 2005 服务端安装配置过程以及出现的问题,以及解决方法!...
  14. 刷 LeetCode 吃力正常吗?
  15. 分数加减法混合计算机,新苏教版小学五年级下册数学《5.2 分数加、减法混合运算》教案教学设计...
  16. 9.Java SE 集合
  17. word或wps的相关API脚本js操作
  18. WPF真入门教程20--数据排序
  19. Linux服务管理-OpenSSH基础操作
  20. JS函数的参数(arguments)的使用

热门文章

  1. SDNU 1014 书的页码
  2. 51CTO技术沙龙之:窥斑见豹 全方位解析虚拟化(视频、图文、PPT)
  3. 22牛客多校day1 I - Chiitoitsu 概论dp
  4. R语言做文本挖掘 Part2分词处理
  5. 笔记本使用久了键盘脏东西怎么清理?笔记本电脑如何清洁键盘?
  6. 虚拟机快照(挺重要的)
  7. vue+eslint+prettier格式化
  8. Oracle11g导出数据缺表解决方法
  9. FZU Problem 2082 过路费
  10. AI视觉检测系统准确率达99.9%,重新定义钣金缺陷检测效率