如何编程获取iSeries端口信息并终止本地端口多余已建立连接
可行实现方案
TCP连接信息获取方式
你当前环境是IBM i(OS/400)平台,有三种稳定的可编程连接信息获取渠道,全部可以精准过滤端口、连接状态,不会误读监听器信息:
- 系统原生API调用:直接调用
QTOCRTVTC(Retrieve TCP/IP Connection Information)API,可直接传入筛选条件:本地端口9020、连接状态*ESTABLISHED,返回结果结构化存储每个连接的远程IP、远程端口,不需要解析命令行文本,支持CL、RPG、C、Python(通过itoolkit调用)等所有平台兼容的开发语言,稳定性最高。 - 系统命令导出文件解析:执行
WRKTCPSTS OPTION(*CNN) OUTPUT(*OUTFILE) OUTFILE(QTEMP/TCPSTAT)命令,会把当前所有TCP连接的结构化数据输出到QTEMP库下的TCPSTAT物理文件,文件内置固定字段:LCLPORT对应本地端口、RMTORT对应远程端口、CNNSTATE对应连接状态、CNNATYPE标识条目是活动连接还是监听器,直接读取字段做判断即可,开发门槛最低。 - PASE环境命令调用:如果环境开启了PASE(AIX兼容运行环境),可以直接调用PASE内的
ss -tan或者netstat -an命令,和Linux/Unix下的用法完全一致,过滤本地9020端口、ESTABLISHED状态的行提取远程端口即可,适合用shell、Python脚本快速开发。
自动检测+异常连接终止逻辑
按以下流程实现即可,全程不会影响9020端口的监听器正常运行:
- 拉取全量TCP连接数据后做第一层过滤:仅保留本地端口为9020、连接状态为ESTABLISHED的条目,直接排除同端口下状态为LISTEN的监听器条目,从筛选逻辑上避免误操作监听器。
- 统计筛选后条目的远程端口总数:如果数量≤1,直接退出程序不做任何操作;如果数量>1,即触发单本地端口挂载多远程连接的异常场景。
- 遍历所有异常连接条目,提取每条连接的远程IP、远程端口,逐次执行
ENDTCPCNN命令终止对应连接,命令标准写法如下:
该命令只会终止匹配「本地端口9020+指定远程IP+指定远程端口」四元组的单条已建立连接,完全不会触碰同端口的监听器,不需要额外做监听器保活操作。ENDTCPCNN PROTOCOL(*TCP) LCLINTNETA('*') LCLPORT(9020) RMTINTNETA('<填入对应远程IP>') RMTPORT(<填入对应远程端口>) - 将写完的程序注册到系统作业调度器,按你需要的检测频率(比如每30秒/1分钟)执行一次,即可自动处理异常,连接终止后数秒业务会自动重连恢复。
注意事项
- 执行终止操作时绝对不能省略远程IP、远程端口参数,模糊匹配终止9020端口连接会直接杀掉监听器,必须传全四元组参数做精准匹配。
- 运行程序的用户配置文件需要带有*IOSYSCFG特殊权限,否则会出现API调用失败、ENDTCPCNN命令执行无权限的问题。
- 如果采用NETSTAT导出outfile的方案,注意端口字段为数值型、连接状态字段为固定编码值,匹配规则不要写错。
内容的提问来源于stack exchange,提问作者geojf3
相关产品推荐
相关产品推荐

