在Linux中常用的端口状态检查工具有lsof、netstat。这两个都有查询活动连接端口对应PID的功能。

我平时主要使用lsof来实现此功能。

lsof的主要作用是列出活动进程打开的文件。

  • 参数
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip );
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。

而这里主要用“-i”参数

  • 输出列表含义
COMMAND:进程的名称;
PID:进程标识符;
PPID:父进程标识符(需要指定-R参数);
USER:进程所有者;
PGID:进程所属组;
FD:文件描述符,应用程序通过文件描述符识别该文件。

比如查看22端口的使用情况:

lsof -i:22

image.png

可以看到其中的136382就是当前ssh连接进程的pid,如果关掉这个进程,ssh连接就会立马断开。

image.png


如果想一次性完成上述操作则简化为:

kill -9 lsof -i:22|grep ESTABLISHED |awk '{print $2}'``

其中grep是用来查找包含ESTABLISHED的行,因为直接通过lsof查找出来的结果中包含openssh服务本身,如果关闭则无法再次通过ssh客户端连接上。

awk则是起到字符串分割的作用,lsof -i的输出中第二列是PID,因此使用$2指定输出第二列的值。

最后修改:2023 年 06 月 13 日
如果觉得我的文章对你有用,请随意赞赏