如何在 Linux 中检查打开的文件
您可能听说过这样一句话:“Linux 中一切皆文件。虽然这并不完全正确,但它确实包含了一系列真理。
在Linux和类Unix系统中,一切都像文件。这意味着 Unix 系统中的资源被分配一个文件描述符,包括存储设备、网络套接字、进程等。
文件描述符是标识文件和其他输入/输出设备的唯一编号。它描述了资源以及内核如何访问它们。将其视为通往内核抽象硬件资源的网关。
不幸的是,文件描述符的概念超出了本教程的范围;请考虑下面提供的链接以开始了解更多信息:
https://en.wikipedia.org/wiki/File_descriptor
这意味着 Unix 和类 Unix 系统(例如 Linux)大量使用此类文件。作为 Linux 高级用户,查看打开的文件、进程以及使用它们的用户非常有用。
本教程将重点介绍查看打开的文件的方法以及负责的进程或用户。
先决条件
在我们开始之前,请确保您拥有:
Linux系统
具有 root 或 sudo 权限的用户
如果您有这些,让我们开始吧:
LSOF实用程序
List open files(列出打开的文件,简称 lsof)由 Victor A Abell 创建,是一个命令行实用程序,允许我们查看打开的文件以及打开它们的进程或用户。
lsof 实用程序在主要 Linux 发行版中可用;但是,您可能会发现它尚未安装,因此可能需要手动安装。
如何在 Debian/Ubuntu 上安装 lsof
要在 Debian 上安装它,请使用以下命令:
sudo apt-get install lsof -y
如何在 REHL/CentOS 上安装
要在 REHL 和 CentOS 上安装,请使用以下命令:
sudo dnf install lsof
如何在 Arch 上安装
在 Arch 上,使用以下命令调用包管理器:
sudo pacman -S lsof
如何在 Fedora 上安装
在 Fedora 上,使用以下命令:
一旦安装并更新了 lsof 实用程序,我们就可以开始使用它了。
基本 lsof 用法
要使用 lsof 工具,请输入命令:
一旦执行上述命令,lsof将转储大量信息,如下所示:
上面的输出显示了进程打开的所有文件。输出具有多个列,每个列代表有关文件的特定信息。
命令列 – 显示正在使用该文件的进程的名称。
PID – 显示使用该文件的进程的进程标识符。
TID – 显示进程的任务 ID(线程)。
TASKCMD – 表示任务命令的名称。
USER – 进程的所有者。
FD – 显示文件描述符编号。这就是进程使用文件的方式;此列输出中可用的选项包括:
cwd – 当前工作目录。
mem – 内存映射文件
pd – 父目录
jld – 监狱目录
ltx – 共享库文本
rtd – 根目录。
txt – 程序代码和数据
tr – 内核跟踪文件。
err – 文件描述符信息错误
mmp – 内存映射设备。
TYPE – 显示与文件关联的节点类型,例如:
Unix – 用于 Unix 域套接字。
DIR – 代表目录
REG – 代表常规文件
CHR – 代表特殊字符文件。
LINK – 符号链接文件
BLK – 阻止特殊文件
INET – 互联网域套接字
FIFO – 命名管道(先进先出文件)
PIPE – 用于管道
还有很多。
DEVICES – 按特殊字符文件、特殊块、常规、目录和 NFS 文件的顺序显示以逗号分隔的设备号。
SIZE/OFF – 显示文件或文件偏移量的大小(以字节为单位)。
NODE – 显示本地文件的节点号、互联网协议类型等。
NAME – 显示文件所在的挂载点和文件系统的名称。
注意:有关各列的详细信息,请参阅 lsof 手册。
如何显示打开文件的进程
Lsof 为我们提供了一些选项,帮助我们过滤输出以仅显示打开特定文件的进程。
例如,要查看打开文件 /bin/bash 的文件,请使用以下命令:
这将为您提供如下所示的输出:
ksmtuned 1025 root txt REG 253,0 1150704 428303 /usr/bin/bash
bash 2968 centos txt REG 253,0 1150704 428303 /usr/bin/bash
bash 3075 centos txt REG 253,0 1150704 428303 /usr/bin/bash
如何显示特定用户打开的文件
我们还可以过滤输出以显示特定用户打开的文件。我们通过使用 -u 标志后跟用户名来做到这一点,如下所示:
这将为您提供如下所示的输出:
如何显示特定进程打开的文件
假设我们想查看某个特定进程打开的所有文件?为此,我们可以使用进程的 PID 来过滤输出。
例如,以下命令显示 bash 打开的文件。
这将只提供由 systemd 打开的文件,如下所示:
如何显示目录中打开的文件
要获取在特定目录中打开的文件,我们可以传递 +D 选项,后跟目录路径。
例如,列出 /etc 目录中打开的文件。
以下是此操作的输出:
如何显示网络连接
由于Linux中的一切都是文件,因此我们可以获取TCP文件或连接等网络文件。
我们可以使用命令:
这将为您提供系统中的 TCP 连接。
您还可以使用如下所示的命令按特定端口进行过滤:
这将为您提供如下所示的输出:
如何连续显示文件
Lsof 为我们提供了一种每隔几秒循环输出一次的模式。这使您可以连续监视进程或用户打开的文件。
但是,此选项要求您手动终止该进程。
例如,下面的命令持续监控端口 22 上打开的文件:
正如您所看到的,在第三个循环中,lsof 捕获了通过 SSH 与服务器建立的连接。
结论
Lsof 是一个非常有用的实用程序。它允许您监视关键文件以及监视打开文件的用户和进程。在排除故障或查找对系统的恶意尝试时,这非常有用。
如本教程所示,通过各种示例和方法,您可以结合 lsof 工具提供的功能进行自定义监控。
感谢您的阅读和分享!我希望你学到了新东西!