lsof命令使用

安装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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值