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)文件,嗯……我不知道怎样形容这些文件,反正好多好多。。