PHP中如何关闭使用-N选项开启的SSH端口转发连接?
解决SSH端口转发定时关闭问题
核心问题是-N选项会禁止执行远程命令,导致stop 10失效,因此需要通过本地控制进程存活时间来实现定时关闭SSH连接,避免进程过载,以下是两种实用方案:
方案一:使用timeout命令(推荐)
利用系统自带的timeout工具限制SSH进程的运行时长,无需依赖远程命令执行:
shell_exec("timeout 10s ssh -fNg -L 33066:127.0.0.1:33060 SSHUSER@SSHHOST &");
timeout 10s:强制SSH进程运行10秒后自动终止-f:SSH完成认证后转入后台运行,不阻塞PHP进程-N:仅进行端口转发,不执行远程命令(符合你的数据库连接需求)
这个方案简单可靠,timeout是GNU coreutils的标准工具,绝大多数Linux发行版都预装支持。
方案二:Bash脚本手动计时+Kill(兼容无timeout的系统)
如果系统没有timeout命令,可以用Bash的后台进程管理实现定时终止:
shell_exec("(ssh -Ng -L 33066:127.0.0.1:33060 SSHUSER@SSHHOST & PID=$!; sleep 10; kill $PID 2>/dev/null) &");
ssh ... &:将SSH进程后台运行,记录其PID到变量$!sleep 10:等待10秒kill $PID 2>/dev/null:终止SSH进程,2>/dev/null用来忽略进程已退出时的报错信息- 外层
&:让整个脚本后台执行,不影响PHP处理请求
额外优化建议
- 如果你的REST API请求处理时间通常短于10秒,可以根据实际情况调整超时时间,避免不必要的资源占用
- 可以考虑为SSH连接添加
-o ConnectTimeout=5选项,防止SSH长时间卡在连接阶段
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

