fuser命令和lsof命令

引子

前几天重装metasploit的时候,有几个端口一直被占用,记得以前有个命令是 可以根据端口号来确定进程号的,搜了一下,原来是fuser命令。

fuser - identify processes using files or sockets.

根据占用的文件或者socket来确定进程。好东西啊。

fuser-几个常用的命令

  • fuser 8080/tcp 打印占用8080端口的进程
  • fuser /etc/passwd 打印占用/etc/passwd的进程
  • fuser -k 8080/tcp 杀死占用8080端口的进程

下面是来自thegeekstuff的关于fuser的一些介绍和技巧。To share and mark.

文件或目录

$fuser .
/home/mr/test:       13965c

可以看到进程ID后面跟了一个字母’c’,这个’c'其实是一个标识符,表示 这个进程把此目录作为他的当前目录。类似的还有:

参数 意义
c 当前目录
e 可执行文件正在运行
f 进程正在打开文件,默认省略
F 进程正在打开文件往里写入,默认省略
r 进程的根目录
m 内存映射,或者共享库

具体可以加上**-v**查看ACCESS详情,但是我感觉用处不大。另外**-v**还可以查看运行进程的用户是谁,运行的命令是什么, 这个还是很有用的。

给几个详细的例子:

$fuser /bin/bash
$fuser -v /bin/cat
$fuser -v /

TCP/UDP套接字

$nc -lp 8080
$fuser -vn tcp 8080 或者 $fuser -v 8080/tcp

正如开头所言,打印出了占用8080端口的进程号。但是有一个问题我还是不明白,nginx运行在80端口, 但是用这个方法却检测不到nginx的进程ID,数据库也是同理,$fuser -vn tcp 3306并没有mysql的身影。 很是困惑。

kill掉相关进程

如果一个文件被某一个进程打开了,但是你却不知道这个进程是什么,那么查看的方法就是 fuser -v file_name,如果需要kill掉这个进程,那么你可以kill PID,但是,fuser给了我们更 简单的方法**-k**参数。上面的两步操作可以直接合并成为一个操作fuser -k file_name 或者 fuser -k 8080/tcp 如此即可把乱七八糟的进程搞定。

另外 -i 参数还可以交互进行kill操作,防止误杀。

lsof-几个常用的命令

via thegeekstuff

  • lsof list all open files. 很凶,一般都在后面加参数,因为直接敲并没有什么实际用处。

  • lsof /bin/bash

lsof /bin/bash
COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    21568   mr txt    REG  252,1  1021112 6291459 /bin/bash

后面跟着一些选项,FD(file descriptor),文件描述标志,一般有cwd(当前工作目录),txt(文本文件),mem(内存映射文件),mmap(内存映射设备),还有一种情况:

NUMBER – Represent the actual file descriptor. The character after the number i.e ‘1u’, represents the mode in which the file is opened. r for read, w for write, u for read and write.

我没见过这种文件,所以也不好说是啥。

TYPE(文件的类型):REG = 一般文件; DIR = 目录文件; FIFO = 管道文件; CHR = 特殊字符文件(这个我也不知道是个啥文件,可能是其他字符集的文件?);

  • lsof +D /var/log/ 列出在 /var/log 目录下打开的文件,其实不用加 +D 也可以,只是只能列出此目录下的文件,而不会递归的列出目录中的目录中的文件,那篇帖子里说 +D+d 是不一样的, D 可以递归地列出目录中的文件,d则不能,但是我在实验过程中,D和d的结果是一样的,不知道什么原因,man手册里也是说D会根据文件树来列出文件,但是我这里就是实验不出差别。。。

  • lsof -c init 根据进程的名字列出文件,上面这条语句是列出了所有以ssh开头的文件,另外,-c可以这样用:ls-f -c ssh -c bash -c gnome

  • ls /media/xx/xxx 当我们卸载某个设备的时候,有时候会遇到“Device or Resource Busy”这样的错误,那怎么办呢?

用上面这条命令就可以显示出那些进程正在使用你的设备,xx和xxx是你的设备目录,找到这些进程,然后把他们杀掉。(其实这一条只是lsof的另一种用法罢了,额,不过话又说回来,哪条不是呢……)

  • lsof -u root 列出某个用户打开的文件。这条语句支持 ^ 即‘非’ ,表示除这个用户以外的其他用户打开的文件。

  • lsof -p 1753 列出这个进程打开的所有文件。

  • kill -9 `lsof -t -u username` 对,就是杀掉这个用户的所有进程。(-t表示只显示进程号)

  • lsof -u root -t -c init 把参数组合起来用。(作者在这里写上这一条,可能是给我们提个醒,比如今天晚上我遇到的egerp "html|png|jepg|txt",打脸……)

  • lsof -u root -r 5 lsof支持重复输出,就是每个一段时间输出结果,上一条命令表示,每过五秒就输出lsof -u root的结果,这对于一个写监控程序来说,是一个不错的选择。(智商不要短路哦,要记得组合参数哦,不要学我哦 :( )

  • lsof -i 网络相关:列出全部的网络连接,很好用哦~ -i4 -i6 指定ipv4还是ipv6.

  • lsof -i -a -p 234 || lsof -i -a -c ssh -a 代表逻辑操作符 “与” ,既……又……

第一条指令是说,列出pid为234的网络连接,第二条是说,列出进程的名字开始为“ssh”的网络连接。

  • lsof -i :25 Duang! 列出在25端口的所有连接,很简洁,很厉害!

  • lsof -i tcp -a -i udp 列出所有的tcp连接和udp连接,当然了,两者是可以分开的,聪明的你一定知道怎样做吧~

  • lsof -N 列出所有的NFS(Network File System)文件,嗯……我不知道怎样形容这些文件,反正好多好多。。

OK,就到这里了。

comments powered by Disqus