安装lsof
[root@miner_k ~]# yum -y install lsof
lsof简介
lsof(list open files)是一个列出当前系统打开文件的工具。在Unix中一切(包括网络套接口)都是文件。
下面的一些其它东西需要牢记:
默认 : 没有选项,lsof列出活跃进程的所有打开文件
组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
- -a : 结果进行“与”运算(而不是“或”)
- -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
- -u username 显示所属user进程打开的文件
- -d FD 显示指定文件描述符的进程
- +d /DIR/ 显示目录下被进程打开的文件
- +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
- -l : 在输出显示用户ID而不是用户名
- -h : 获得帮助
- -t : 仅获取进程ID
- -U : 获取UNIX套接口地址
- -F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
[root@miner_k proc]# lsof | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 202,2 4096 2 /
init 1 root rtd DIR 202,2 4096 2 /
init 1 root txt REG 202,2 150352 1836484 /sbin/init
init 1 root DEL REG 202,2 1572895 /lib64/libnss_files-2.12.so
init 1 root DEL REG 202,2 1572879 /lib64/libc-2.12.so
init 1 root mem REG 202,2 90880 1573268 /lib64/libgcc_s-4.4.7-20120601.so.1
init 1 root DEL REG 202,2 1572907 /lib64/librt-2.12.so
init 1 root DEL REG 202,2 1572903 /lib64/libpthread-2.12.so
init 1 root mem REG 202,2 265728 1572958 /lib64/libdbus-1.so.3.4.0
COMMAND | 进程的名称 |
---|---|
PID | 进程标识符 |
USER | 进程所有者 |
FD | 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 |
TYPE | 文件类型,如DIR、REG等 |
DEVICE | 指定磁盘的名称 |
SIZE | 文件的大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
获取网络信息
-i 显示所有的连接
[root@miner_k ~]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dhclient 1004 root 5u IPv4 11280 0t0 UDP *:bootpc
sshd 10629 root 3u IPv4 37668 0t0 TCP *:ssh (LISTEN)
sshd 10629 root 4u IPv6 37671 0t0 TCP *:ssh (LISTEN)
httpd 17536 root 4u IPv6 206977 0t0 TCP *:http (LISTEN)
httpd 17540 daemon 4u IPv6 206977 0t0 TCP *:http (LISTEN)
httpd 17541 daemon 4u IPv6 206977 0t0 TCP *:http (LISTEN)
-i4 获取IPV4的连接
[root@miner_k ~]# lsof -i4
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dhclient 1004 root 5u IPv4 11280 0t0 UDP *:bootpc
sshd 10629 root 3u IPv4 37668 0t0 TCP *:ssh (LISTEN)
sshd 61903 root 3u IPv4 301534 0t0 TCP 192.168.6.104:ssh->114.236.90.52:30584 (ESTABLISHED)
-itcp 显示tcp的连接
[root@miner_k ~]# lsof -itcp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10629 root 3u IPv4 37668 0t0 TCP *:ssh (LISTEN)
sshd 10629 root 4u IPv6 37671 0t0 TCP *:ssh (LISTEN)
httpd 17536 root 4u IPv6 206977 0t0 TCP *:http (LISTEN)
httpd 17540 daemon 4u IPv6 206977 0t0 TCP *:http (LISTEN)
-i :port 显示端口的连接
[root@miner_k ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10629 root 3u IPv4 37668 0t0 TCP *:ssh (LISTEN)
sshd 10629 root 4u IPv6 37671 0t0 TCP *:ssh (LISTEN)
sshd 61903 root 3u IPv4 301534 0t0 TCP 192.168.6.104:ssh->114.236.90.52:30584 (ESTABLISHED)
基于主机和端口的连接
[root@miner_k ~]# lsof -i @192.168.6.104:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 61903 root 3u IPv4 301534 0t0 TCP 192.168.6.104:ssh->114.236.90.52:30584 (ESTABLISHED)
找出监控状态或已经建立连接状态的进程
[root@miner_k ~]# lsof -i | grep -i listen
sshd 10629 root 3u IPv4 37668 0t0 TCP *:ssh (LISTEN)
sshd 10629 root 4u IPv6 37671 0t0 TCP *:ssh (LISTEN)
httpd 17536 root 4u IPv6 206977 0t0 TCP *:http (LISTEN)
httpd 17540 daemon 4u IPv6 206977 0t0 TCP *:http (LISTEN)
[root@miner_k ~]# lsof -i | grep -i establish
sshd 61903 root 3u IPv4 301534 0t0 TCP 192.168.6.104:ssh->114.236.90.52:30584 (ESTABLISHED)
通过用户名称查询相关的进程
查看指定用户打开的进程
[root@miner_k ~]# lsof -u mysql
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 48891 mysql cwd DIR 202,2 4096 1180311 /var/lib/mysql
mysqld 48891 mysql rtd DIR 202,2 4096 2 /
mysqld 48891 mysql txt REG 202,2 254036696 1712987 /usr/local/mysql-5.7.17-linux-glibc2.5-x86_64/bin/mysqld
mysqld 48891 mysql mem REG 202,2 111440 1572943 /lib64/libresolv-2.12.so
mysqld 48891 mysql mem REG 202,2 27896 1572892 /lib64/libnss_dns-2.12.so
mysqld 48891 mysql mem REG 202,2 66432 1572938 /lib64/libnss_files-2.12.so
查看除了某个用户打开的进程
[root@miner_k ~]# lsof -u ^root | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 17540 daemon cwd DIR 202,2 4096 2 /
httpd 17540 daemon rtd DIR 202,2 4096 2 /
httpd 17540 daemon txt REG 202,2 2007777 1711287 /usr/local/apache/bin/httpd
httpd 17540 daemon mem REG 202,2 27896 1572892 /lib64/libnss_dns-2.12.so
httpd 17540 daemon mem REG 202,2 66432 1572938 /lib64/libnss_files-2.12.so
httpd 17540 daemon mem REG 202,2 122056 1572946 /lib64/libselinux.so.1
httpd 17540 daemon mem REG 202,2 111440 1572943 /lib64/libresolv-2.12.so
杀掉某一用户运行的所有进程
[root@miner_k ~]# kill -9 $(lsof -t -u mysql)
同时满足多个选项
[root@miner_k ~]# lsof -a -u root -d txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root txt REG 202,2 150352 1836484 /sbin/init
kthreadd 2 root txt unknown /proc/2/exe
migration 3 root txt unknown /proc/3/exe
ksoftirqd 4 root txt unknown /proc/4/exe
stopper/0 5 root txt unknown /proc/5/exe
watchdog/ 6 root txt unknown /proc/6/exe
events/0 7 root txt unknown /proc/7/exe
恢复删除的文件
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
测试:
[root@miner_k /]# mv /var/log/messages{,.bak}
[root@miner_k /]# lsof | grep /var/log/messages
rsyslogd 1368 root 4w REG 202,2 59558 1181164 /var/log/messages
[root@miner_k /]# cat /proc/1368/fd/4 > /var/log/messages
messages-20170722.gz messages.bak
[root@miner_k /]# cat /proc/1368/fd/4 > /var/log/messages