lsof
man - list open files
用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。
[root@localhost ~]# lsof | head
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 4096 128 /
systemd 1 root rtd DIR 253,0 4096 128 /
systemd 1 root txt REG 253,0 1494168 199282 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20032 202407022 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 252696 201810106 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90632 201417273 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 19888 201417773 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19520 201373568 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 153192 201417251 /usr/lib64/liblzma.so.5.0.99
解释:
COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。
查看指定端口现在运行的情况
[root@localhost ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1189 root 3u IPv4 18609 0t0 TCP *:ssh (LISTEN)
sshd 1189 root 4u IPv6 18618 0t0 TCP *:ssh (LISTEN)
查看所属root用户进程所打开的文件类型为txt的文件:
[root@localhost ~]# lsof -a -u root -d txt | head
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root txt REG 253,0 1494168 199282 /usr/lib/systemd/systemd
kthreadd 2 root txt unknown /proc/2/exe
ksoftirqd 3 root txt unknown /proc/3/exe
kworker/0 5 root txt unknown /proc/5/exe
migration 7 root txt unknown /proc/7/exe
rcu_bh 8 root txt unknown /proc/8/exe
rcuob/0 9 root txt unknown /proc/9/exe
rcu_sched 10 root txt unknown /proc/10/exe
rcuos/0 11 root txt unknown /proc/11/exe
恢复删除的文件
先决条件:文件在被某一个进程打开的过程中被删除,这种情况下,是可以通过lsof来恢复的。
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
lsof | grep 进程名
vim 13457 root 2u CHR 136,1 0t0 4 /dev/pts/1
vim 13457 root 4u REG 253,0 12288 211980147 /root/.out.file.swp
cat /proc/13457/fd/4 > /root/msg.txt
注意:恢复的文件是不整齐的,掺杂乱码。