介绍
在本实验中,你将学习如何使用 lsof 命令(全称为 "list open files")来识别 Linux 系统上打开的文件和网络连接。lsof 命令是一个强大的工具,它提供了有关打开文件的进程的详细信息,包括文件描述符、文件类型、设备和文件名。
本实验涵盖三个主要步骤:理解 lsof 命令、通过进程识别打开的文件以及使用 lsof 定位网络连接。你将学习如何解释 lsof 命令的输出,并使用各种选项来过滤结果。本实验是系统监控与管理课程的一部分,将帮助你培养系统管理和故障排除的技能。
理解 lsof 命令
在这一步中,你将学习 lsof 命令,它的全称是 "list open files"。lsof 是 Linux 中一个强大的工具,可以帮助你识别哪些进程打开了文件和网络连接。
首先,让我们不带任何参数运行 lsof 命令:
sudo lsof
示例输出:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,1 4096 2 /
systemd 1 root rtd DIR 8,1 4096 2 /
systemd 1 root txt REG 8,1 1428176 655360 /usr/lib/systemd/systemd
systemd 1 root mem REG 8,1 2067688 655361 /usr/lib/x86_64-linux-gnu/libc-2.35.so
...
lsof 命令会显示系统中打开的文件和网络连接的详细信息。让我们分解每一列的含义:
COMMAND:打开文件的进程名称。PID:进程的 ID。TID:线程 ID(如果适用)。USER:拥有该进程的用户。FD:文件描述符,用于标识打开文件的数字。TYPE:打开文件的类型(例如,普通文件、目录、套接字等)。DEVICE:文件所在文件系统的设备号。SIZE/OFF:文件的大小或文件偏移量。NODE:文件的 inode 号。NAME:文件或网络连接的名称。
输出可能会非常冗长,因此你可以使用各种选项来过滤结果。例如,要查看特定进程打开的文件,可以使用 -p 选项后跟进程 ID:
sudo lsof -p 1
这将显示 PID 为 1 的进程(通常是 systemd 进程)打开的所有文件。
你还可以使用 lsof 命令查找特定用户打开的文件:
sudo lsof -u labex
这将显示 labex 用户拥有的所有打开文件。
在下一步中,你将学习如何使用 lsof 命令识别特定进程打开的文件。
识别进程打开的文件
在这一步中,你将学习如何使用 lsof 命令识别与特定进程关联的打开文件。
首先,我们需要找到正在运行的进程的进程 ID(PID)。你可以使用 ps 命令来完成这一操作:
sudo ps -ef | grep nginx
示例输出:
root 825 1 0 14:32 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 826 825 0 14:32 ? 00:00:00 nginx: worker process
www-data 827 825 0 14:32 ? 00:00:00 nginx: worker process
在这个例子中,nginx 进程的 PID 是 825。
接下来,你可以使用 lsof 命令列出与该进程关联的所有打开文件:
sudo lsof -p 825
示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 825 root cwd DIR 253,0 4096 1048576 /usr/sbin
nginx 825 root rtd DIR 253,0 4096 2 /
nginx 825 root txt REG 253,0 977528 1048577 /usr/sbin/nginx
nginx 825 root mem REG 253,0 2067688 1048578 /usr/lib/x86_64-linux-gnu/libc-2.35.so
nginx 825 root mem REG 253,0 169032 1048579 /usr/lib/x86_64-linux-gnu/ld-2.35.so
nginx 825 root 0u CHR 136,0 0t0 3 /dev/pts/0
nginx 825 root 1u CHR 136,0 0t0 3 /dev/pts/0
nginx 825 root 2u CHR 136,0 0t0 3 /dev/pts/0
这个输出显示了与 nginx 进程关联的所有打开文件,包括可执行文件、共享库以及标准输入/输出/错误文件描述符。
你还可以使用 lsof 命令查找特定用户打开的文件。例如,查找 labex 用户拥有的所有打开文件:
sudo lsof -u labex
这对于排查问题或了解系统中特定用户的活动非常有用。
在下一步中,你将学习如何使用 lsof 命令定位网络连接。
使用 lsof 定位网络连接
在这一步中,你将学习如何使用 lsof 命令识别系统中的网络连接。
要列出系统中的所有网络连接,可以使用 lsof 命令并加上 -i 选项:
sudo lsof -i
示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 824 root 3u IPv4 18620 0t0 TCP *:22 (LISTEN)
sshd 824 root 4u IPv6 18622 0t0 TCP *:22 (LISTEN)
nginx 825 root 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
nginx 826 www-data 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
nginx 827 www-data 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
这个输出显示了系统中的所有网络连接,包括监听端口 22(SSH)的 sshd 进程和监听端口 80(HTTP)的 nginx 进程。
你还可以过滤输出以仅显示特定类型的网络连接。例如,仅显示 TCP 连接:
sudo lsof -i TCP
示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 824 root 3u IPv4 18620 0t0 TCP *:22 (LISTEN)
sshd 824 root 4u IPv6 18622 0t0 TCP *:22 (LISTEN)
nginx 825 root 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
nginx 826 www-data 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
nginx 827 www-data 6u IPv4 18650 0t0 TCP *:80 (LISTEN)
你还可以过滤输出以仅显示特定用户或进程的网络连接。例如,仅显示 labex 用户的网络连接:
sudo lsof -i -u labex
lsof 命令是一个强大的工具,可以帮助你排查网络问题并了解系统中的网络活动。
总结
在本实验中,你将学习如何使用 lsof 命令,它的全称是 "list open files"。lsof 是 Linux 中一个强大的工具,可以帮助你识别哪些进程打开了文件和网络连接。你将首先不带任何参数运行 lsof 命令,以了解它提供的各种信息列,例如进程名称、进程 ID、文件描述符、文件类型和文件名。接着,你将学习如何使用 -p 选项查看特定进程打开的文件。最后,你将探索如何使用 lsof 命令定位系统中的网络连接。



