lsof是系统管理/安全的尤伯工具。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。

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

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有着实在是令人惊讶的选项数量。你可以使用它来获得你系统上设备的信息,你能通过它了解到指定的用户在指定的地点正在碰什么东西,或者甚至是一个进程正在使用什么文件或网络连接。

对于我,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[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后提供对应的协议来仅仅显示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来显示与指定端口相关的网络信息

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

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来显示指定到指定主机的连接

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

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显示基于主机与端口的连接

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

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)

找出监听端口

找出正等候连接的端口。

1. # lsof -i -sTCP:LISTEN

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

1. # lsof -i | grep -i LISTEN

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

找出已建立的连接

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

1. # lsof -i -sTCP:ESTABLISHED

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

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)

用户信息

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

使用-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 --

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

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

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

命令和进程

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

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

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查看指定进程ID已打开的内容

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选项只返回PID

1. # lsof -t -c Mail

3. 350

文件和目录

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

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

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类似,当你开始组合查询时,它就显示了它强大的功能。

显示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)

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

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

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

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

1. # lsof +L1

3. (hopefully nothing)

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

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

结尾

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

资源

本文由 Daniel Miessler撰写,首次在他博客上贴出

一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,

但是普通用户执行会显示“permission denied”

我总结一下lsof指令的用法:

lsof abc.txt 显示开启文件abc.txt的进程

lsof -i :22 知道22端口现在运行什么程序

lsof -c abc 显示abc进程现在打开的文件

lsof -g gid 显示归属gid的进程情况

lsof +d /usr/local/ 显示目录下被进程开启的文件

lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长

lsof -d 4 显示使用fd为4的进程 www.2cto.com

lsof -i 用以显示符合条件的进程情况

语法: 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 (可以不只一个)

port --> 端口号 (可以不只一个)

例子: TCP:25 - TCP and port 25

@1.2.3.4 - Internet IPv4 host address 1.2.3.4

lsof -n 不将IP转换为hostname,缺省是不加上-n参数

lsof -p 12 看进程号为12的进程打开了哪些文件

lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新

-r,lsof会永远不断的执行,直到收到中断信号

+r,lsof会一直执行,直到没有档案被显示

例子:不断查看目前ftp连接的情况:lsof -i tcp@ohaha.ks.edu.tw:ftp -r

lsof -s 列出打开文件的大小,如果没有大小,则留下空白

lsof -u username 以UID,列出打开的文件 www.2cto.com

关注:

进程调试命令:truss、strace和ltrace

进程无法启动,软件运行速度突然变慢,程序的"SegmentFault"等等都是让每个Unix系统用户头痛的问题,而这些问题都可以通过使用truss、strace和ltrace这三个常用的调试工具来快速诊断软件的"疑难杂症"。

linux执行lsof命令_Linux 命令神器:lsof相关推荐

  1. linux执行lsof命令_Linux操作系统上lsof命令详解

    lsof全名list opened files,也就是列举系统中已经被打开的文件.我们都知道,linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件.所以,用好lsof ...

  2. dpkg命令_Linux 命令学习神器!命令看不懂直接给你解释!

    (给Linux爱好者加星标,提升Linux技能) 转自:良许Linux 大家都知道,Linux 系统有非常多的命令,而且每个命令又有非常多的用法,想要全部记住所有命令的所有用法,恐怕是一件不可能完成的 ...

  3. linux查看vnc进程命令_linux命令:VNC服务的配置及使用

    安装配置VNC服务,使得可以通过图形界面来管理控制linux主机: 目前比较流行的方式:XDM(X display manager)方案和VNC方案,个人感觉VNC方案比较方便; 一是因为VNC方案配 ...

  4. linux命令行执行mysql语句_linux命令行中直接执行mysql语句

    其实我一开始是拒绝的,但是貌似就得这么做.怎么一行一行的来?没法整了. 有两种方法可以在命令行下执行sql命令.第一种是使用"-e"参数来指定需要执行的sql语句:第二种是通过管道 ...

  5. linux rar解压_linux命令

    文件搜索 打包和压缩文件 Linux下的多用户多任务操作系统 查看文件内容 挂载一个文件系统 磁盘空间 用户和群组 文件的权限 文件的特殊属性 RPM 包 YUM 软件包升级器 DEB 包 安装软件 ...

  6. linux编译lnx文件命令_linux命令dd

    dd 使用dd这个linux命令可以创建一定大小文件. linux创建文件命令:dd命令 把指定的输入文件拷贝到指定的输出文件中,并且在拷贝的过程中可以进行格式转换.语法: CODE:[Copy to ...

  7. linux bash命令_Linux命令-您应该知道的基本Bash命令行技巧

    linux bash命令 Linux has a ton of commands, but most people only use a fraction of them. Here are some ...

  8. linux基础命令_Linux命令基础大全

    pwd:显示当前路径 cd :切换目录 用法:cd cd ../ 切换到上级目录 cd / 切换到根目录 cd ~ (或只有cd )切换到当前用户主目录(home底下以用户名命名的文件夹) /root ...

  9. linux执行指定程序的命令,linux 下使用指定的用户来执行命令

    有时间,我们需要在开机的时候执行一些特定的程序或都脚本,因为涉及到安全主面的问题,所以又不想用root来执行,那怎样办呢. 经过查看 su 的帮助提示,发现: [root@redhat6 ~]# su ...

最新文章

  1. linux socket 详解
  2. OpenCV学习笔记之Mat
  3. 【CentOS】如何在线安装pcre?
  4. oracle11gR版本GI中新增,Oracle11g新特性MemberKillEscalation简介
  5. Spring依赖注入方式
  6. C++ 使用VS2010创建MFC ActiveX工程项目
  7. 拓端tecdat|R语言用Backfitting MCMC抽样算法进行贝叶斯推理案例
  8. 《测试驱动数据库开发》——2.1 TDD中类的角色
  9. 几道JAVA和分布式系统面试题总结
  10. [蓝牙 4.0 CC2541 开发] BLE架构与OSAL
  11. 兰光bl2000_蓝光bl2000电梯主板.pdf
  12. 深度学习-lecture1李飞飞计算机视觉
  13. 苹果手机计算机没有记录吗,苹果手机恢复出厂设置备忘录里的便签内容都没了,怎么找回来啊...
  14. 双硬盘安装win7和Ubuntu双系统,解决系统启动引导问题
  15. 尚硅谷2021新版spring5课堂笔记
  16. 因果分析系列2--随机试验
  17. Flink DataStream读写Kafka
  18. win10桌面右下角网络图标中找不到网络
  19. 【大学时光】回首向来萧瑟处,归去,也无风雨也无晴
  20. uCLinux的编译

热门文章

  1. FMD的FT61F022A单片机技术资料规格
  2. 【招行】信用卡推荐用户列表 数据岗
  3. socat 常见用法
  4. android手机闪退原因
  5. 总监私下跟我说,跳槽大厂第一步,先搞定分布式系统面试
  6. Sklearn包含的常用算法
  7. 20165203实验五 网络编程与安全
  8. 火车制动机有趣小故事
  9. CommonFunction
  10. 孙悟空的师傅到底是谁?(转)