当前位置: 首页 > 科技观察

Linux命令神器:lsof

时间:2023-03-16 00:31:37 科技观察

lsof是用于系统管理/安全的超级工具。我大部分时间都使用它从系统中获取网络连接相关信息,但这只是这个功能强大且鲜为人知的应用程序的第一步。调用此工具lsof是一个真实的名称,因为它的意思是“列出打开的文件”。要记住的一件事是,在Unix中,一切(包括网络套接字)都是一个文件。有趣的是,lsof也是开关最多的Linux/Unix命令之一。它有很多开关,并且有许多使用-和+前缀支持的选项。用法:[-?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:结果是ANDed操作(而不是“或”)-l:在输出中显示用户ID而不是用户名-h:获取帮助-t:仅获取进程ID-U:获取UNIX套接字地址-F:其他命令的格式输出。可以通过多种方式格式化,例如-Fpcfn(用于进程ID、命令名称、文件描述符、文件名和空终止)以获取网络信息正如我所说,我主要使用lsof来获取有关系统如何与之交互的信息网络。以下是有关此信息的一些主题:使用-i显示所有连接有些人喜欢使用netstat获取网络连接,但我更喜欢使用lsof来完成这项工作。结果以一种对我来说很直观的方式呈现,我只需要更改语法即可从同一命令获取更多信息。#lsof-iCOMMANDPIDUSERFDTYPEDEVICESIZENODENAMEdhcpcd6061root4uIPv44510UDP*:bootpcsshd7703root3uIPv66499TCP*:ssh(LISTEN)sshd7892root3uIPv66757TCP10.10.1.5:ssh->192.168.1.5:49901(ESTABLISHED)使用-i6仅获取IPv6流量#lsof-i6仅显示TCP连接(同理可获取UDP连接)也可以在-i后提供相应的协议,只显示TCP或UDP连接信息。#lsof-iTCPCOMMANDPIDUSERFDTYPEDEVICESIZENODENAMEsshd7703root3uIPv66499TCP*:ssh(LISTEN)sshd7892root3uIPv66757TCP10.10.1.5:ssh->192.168.1.5:49901(ESTABLISHED)使用-i:port可以显示网络端口信息,也可以通过指定端口搜索相关信息,这对于找出阻止另一个应用程序绑定到给定端口的原因非常有用。#lsof-i:22COMMANDPIDUSERFDTYPEDEVICESIZENODENAMEsshd7703root3uIPv66499TCP*:ssh(LISTEN)sshd7892root3uIPv66757TCP10.10.1.5:ssh->192.168.1.5:49901(ESTABLISHED)使用@host检查是否连接到指定的网络主机打开时有用在Internet或Internet上托管。#lsof-i@172.16.12.5sshd7892root3uIPv66757TCP10.10.1.5:ssh->172.16.12.5:49901(ESTABLISHED)使用@host:port根据主机和端口显示连接你也可以结合主机和端口的显示信息。#lsof-i@172.16.12.5:22sshd7892root3uIPv66757TCP10.10.1.5:ssh->172.16.12.5:49901(ESTABLISHED)找出监听端口找出正在等待连接的端口。#lsof-i-sTCP:LISTEN您也可以使用grep“LISTEN”来完成此任务。#lsof-i|grep-iLISTENiTunes400daniel16uIPv40x45752280t0TCP*:daap(LISTEN)查找已建立的连接您还可以显示任何已连接的连接。#lsof-i-sTCP:ESTABLISHED您也可以grep查找“ESTABLISHED”来完成此任务。#lsof-i|grep-iESTABLISHEDfirefox-b169daniel49uIPv40t0TCP1.2.3.3:1863->1.2.3.4:http(ESTABLISHED)用户信息您还可以获取有关各种用户的信息以及他们在系统上所做的事情,包括他们的网络活动,对文件等的操作使用-u显示指定用户打开了什么libstdc++.6.0.4.dylibDock155danieltxtREG14,2132008823505/usr/lib/libgcc_s.1.dylibDock155danieltxtREG14,2212160823214/usr/lib/libauto.dylib--snipped--U用户显示全部usersexceptthespecifieduser的情况#lsof-u^daniel--snipped--Dock155jimtxtREG14,22798436823208/usr/lib/libicucore.A.dylibDock155jimtxtREG14,21580212823126/usr/lib/libobjc.A.dylibDock155jimtxt2libusrREG1418/488/229libstdc++.6.0.4.dylibDock155jimtxtREG14,2132008823505/usr/lib/libgcc_s.1.dylibDock155jimtxtREG14,2212160823214/usr/lib/libauto.dylib--snipped--snipped--killingeverythingthespecifieduserdoes杀死指定用户运行的一切,这很好。#kill-9`lsof-t-udaniel`命令和进程可以查看是什么启动了指定的程序或进程,这通常很有用,您可以使用lsof按名称或进程ID进行过滤来完成此任务。下面列出了一些选项:使用-c查看指定命令正在使用的文件和网络连接#lsof-csyslog-ngCOMMANDPIDUSERFDTYPEDEVICESIZENODENNAMEsyslog-ng7547rootcwdDIR3,340962/syslog-ng7547rootrtdDIR3,340962/syslog-ng7547roottxtREG3,31135-ng70-lognipped-使用-p查看指定进程ID打开的内容lib/libnss_compat-2.4.sosshd10068rootmemREG3,3200152509940/usr/lib/libssl.so.0.9.7sshd10068rootmemREG3,346216510014/usr/lib/liblber-2.3sshd108389REG3,320685rootmelib/libresolv-2.4.sosshd10068rootmemREG3,31197180850396/lib/libc-2.4.sosshd10068rootmemREG3,322168850398/lib/libcrypt-2.4.sosshd10068rootmemREG3,372784850404/lib/libnsl-2.4.sosshd10068rootmemREG3,370632850417/lib/libz.so.1.2.3sshd10068rootmemREG3,39992850416/lib/libutil-2.4.so--snipped---t选项只返回PID#lsof-t-cMail350文件和目录通过查看指定的文件或目录,可以看到系统上所有正在交互的资源与它-包括使用用户、进程等显示与指定目录交互的所有内容#lsof/var/log/messages/COMMANDPIDUSERFDTYPEDEVICESIZENODENAMEsyslog-ng7547root4wREG3,3217309834024/var/log/messages显示与指定文件交互的所有内容#lsof/home/daniel/firewall_whitelist.txtAdvancedusagewithtcpdump同样,当您开始编写查询时,它就会显示出它的威力。显示daniel为连接到1.1.1.1#lsof-udaniel-i@1.1.1.1bkdr1893daniel3uIPv63456TCP10.10.1.10:1234->1.1.1.1:31337(ESTABLISHED)所做的所有操作同时使用-t和-c选项发送到处理HUP信号#kill-HUP`lsof-t-csshd`lsof+L1显示打开链接少于1个的所有文件这通常(但不总是)表明攻击者正试图通过删除文件条目来隐藏文件内容。#lsof+L1(hopefullynothing)showsopenconnectionsforacertainportrange#lsof-i@fw.google.com:2150=2180End这个入门教程只是对lsof能做什么的一瞥。要查看完整参考,请运行manlsof命令或查看在线版本。希望本文对您有所帮助,随时欢迎您的评论和指正。