lsof是系统管理安全的管理工具。将这个工具称之为lsof真实名副其实,因为它是指列出打开文件(listsopenfiles)。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。 有趣的是,lsof也是有着最多开关的LinuxUnix命令之一。它有那么多的开关,它有许多选项支持使用和前缀。1。usage:〔?abhlnNoOPRstUvV〕〔cc〕〔ds〕〔DD〕〔f〔cgG〕〕2。〔F〔f〕〕〔g〔s〕〕〔i〔i〕〕〔L〔l〕〕〔M〕〔o〔o〕〕3。〔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:仅获取进程IDU:获取UNIX套接口地址F:格式化输出结果,用于其它命令。可以通过多种方式格式化,如Fpcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)获取网络信息 正如我所说的,我主要将lsof用于获取关于系统怎么和网络交互的信息。这里提供了关于此信息的一些主题:使用i显示所有连接 有些人喜欢用netstat来获取网络连接,但是我更喜欢使用lsof来进行此项工作。结果以对我来说很直观的方式呈现,我仅仅只需改变我的语法,就可以通过同样的命令来获取更多信息。 语法:lsofi〔46〕〔protocol〕〔hostnamehostaddr〕〔:serviceport〕1。lsofi3。COMMANDPIDUSERFDTYPEDEVICESIZENODENAME4。dhcpcd6061root4uIPv44510UDP:bootpc5。sshd7703root3uIPv66499TCP:ssh(LISTEN)6。sshd7892root3uIPv66757TCP10。10。1。5:ssh192。168。1。5:49901(ESTABLISHED)使用i6仅获取IPv6流量1。lsofi6仅显示TCP连接(同理可获得UDP连接) 你也可以通过在i后提供对应的协议来仅仅显示TCP或者UDP连接信息。1。lsofiTCP3。COMMANDPIDUSERFDTYPEDEVICESIZENODENAME4。sshd7703root3uIPv66499TCP:ssh(LISTEN)5。sshd7892root3uIPv66757TCP10。10。1。5:ssh192。168。1。5:49901(ESTABLISHED)使用i:port来显示与指定端口相关的网络信息 或者,你也可以通过端口搜索,这对于要找出什么阻止了另外一个应用绑定到指定端口实在是太棒了。1。lsofi:223。COMMANDPIDUSERFDTYPEDEVICESIZENODENAME4。sshd7703root3uIPv66499TCP:ssh(LISTEN)5。sshd7892root3uIPv66757TCP10。10。1。5:ssh192。168。1。5:49901(ESTABLISHED)使用host来显示指定到指定主机的连接 这对于你在检查是否开放连接到网络中或互联网上某个指定主机的连接时十分有用。1。lsofi172。16。12。53。sshd7892root3uIPv66757TCP10。10。1。5:ssh172。16。12。5:49901(ESTABLISHED)使用host:port显示基于主机与端口的连接 你也可以组合主机与端口的显示信息。1。lsofi172。16。12。5:223。sshd7892root3uIPv66757TCP10。10。1。5:ssh172。16。12。5:49901(ESTABLISHED)找出监听端口 找出正等候连接的端口。1。lsofisTCP:LISTEN 你也可以grepLISTEN来完成该任务。1。lsofigrepiLISTEN3。iTunes400daniel16uIPv40x45752280t0TCP:daap(LISTEN)找出已建立的连接 你也可以显示任何已经连接的连接。1。lsofisTCP:ESTABLISHED 你也可以通过grep搜索ESTABLISHED来完成该任务。1。lsofigrepiESTABLISHED3。firefoxb169daniel49uIPv40t0TCP1。2。3。3:18631。2。3。4:http(ESTABLISHED)用户信息 你也可以获取各种用户的信息,以及它们在系统上正干着的事情,包括它们的网络活动、对文件的操作等。使用u显示指定用户打开了什么1。lsofudaniel3。snipped4。Dock155danieltxtREG14,22798436823208usrliblibicucore。A。dylib5。Dock155danieltxtREG14,21580212823126usrliblibobjc。A。dylib6。Dock155danieltxtREG14,22934184823498usrliblibstdc。6。0。4。dylib7。Dock155danieltxtREG14,2132008823505usrliblibgccs。1。dylib8。Dock155danieltxtREG14,2212160823214usrliblibauto。dylib9。snipped使用uuser来显示除指定用户以外的其它所有用户所做的事情1。lsofudaniel3。snipped4。Dock155jimtxtREG14,22798436823208usrliblibicucore。A。dylib5。Dock155jimtxtREG14,21580212823126usrliblibobjc。A。dylib6。Dock155jimtxtREG14,22934184823498usrliblibstdc。6。0。4。dylib7。Dock155jimtxtREG14,2132008823505usrliblibgccs。1。dylib8。Dock155jimtxtREG14,2212160823214usrliblibauto。dylib9。snipped杀死指定用户所做的一切事情 可以消灭指定用户运行的所有东西,这真不错。1。kill9lsoftudaniel命令和进程 可以查看指定程序或进程由什么启动,这通常会很有用,而你可以使用lsof通过名称或进程ID过滤来完成这个任务。下面列出了一些选项:使用c查看指定的命令正在使用的文件和网络连接1。lsofcsyslogng3。COMMANDPIDUSERFDTYPEDEVICESIZENODENAME4。syslogng7547rootcwdDIR3,3409625。syslogng7547rootrtdDIR3,3409626。syslogng7547roottxtREG3,31135241064970usrsbinsyslogng7。snipped使用p查看指定进程ID已打开的内容1。lsofp100753。snipped4。sshd10068rootmemREG3,334808850407liblibnssfiles2。4。so5。sshd10068rootmemREG3,334924850409liblibnssnis2。4。so6。sshd10068rootmemREG3,326596850405liblibnsscompat2。4。so7。sshd10068rootmemREG3,3200152509940usrliblibssl。so。0。9。78。sshd10068rootmemREG3,346216510014usrlibliblber2。39。sshd10068rootmemREG3,359868850413liblibresolv2。4。so10。sshd10068rootmemREG3,31197180850396liblibc2。4。so11。sshd10068rootmemREG3,322168850398liblibcrypt2。4。so12。sshd10068rootmemREG3,372784850404liblibnsl2。4。so13。sshd10068rootmemREG3,370632850417liblibz。so。1。2。314。sshd10068rootmemREG3,39992850416liblibutil2。4。so15。snippedt选项只返回PID1。lsoftcMail3。350文件和目录 通过查看指定文件或目录,你可以看到系统上所有正与其交互的资源包括用户、进程等。显示与指定目录交互的所有一切1。lsofvarlogmessages3。COMMANDPIDUSERFDTYPEDEVICESIZENODENAME4。syslogng7547root4wREG3,3217309834024varlogmessages显示与指定文件交互的所有一切1。lsofhomedanielfirewallwhitelist。txt高级用法 与tcpdump类似,当你开始组合查询时,它就显示了它强大的功能。显示daniel连接到1。1。1。1所做的一切1。lsofudanieli1。1。1。13。bkdr1893daniel3uIPv63456TCP10。10。1。10:12341。1。1。1:31337(ESTABLISHED)同时使用t和c选项以给进程发送HUP信号1。killHUPlsoftcsshdlsofL1显示所有打开的链接数小于1的文件 这通常(当不总是)表示某个攻击者正尝试通过删除文件入口来隐藏文件内容。1。lsofL13。(hopefullynothing)显示某个端口范围的打开的连接1。lsofifw。google。com:21502180结尾 本入门教程只是管窥了lsof功能的一斑,要查看完整参考,运行manlsof命令或查看在线版本。 我总结一下lsof指令的用法: lsofabc。txt显示开启文件abc。txt的进程 lsofi:22知道22端口现在运行什么程序 lsofcabc显示abc进程现在打开的文件 lsofggid显示归属gid的进程情况 lsofdusrlocal显示目录下被进程开启的文件 lsofDusrlocal同上,但是会搜索目录下的目录,时间较长 lsofd4显示使用fd为4的进程 lsofi用以显示符合条件的进程情况 lsofp12看进程号为12的进程打开了哪些文件 lsofr〔t〕控制lsof不断重复执行,缺省是15s刷新 r,lsof会永远不断的执行,直到收到中断信号 r,lsof会一直执行,直到没有档案被显示