当管道断开时,如何终止连接端口转发?

当管道断开时,如何终止连接端口转发?

我所在的连接不断断线,这很烦人,但目前我对此无能为力。我使用 -R 9000:localhost:9000 连接到 SSH(使用 xdebug 进行调试)。

问题是,当我断开连接并重新连接时,服务器仍然在端口 9000 上看到以前的连接,并且当我尝试加载网页时,服务器正在尝试将 XDEBUG 数据发送到死去的 SSH 连接。

如果我运行,netstat -nlp | grep 9000我可以看到有一个旧连接处于打开状态,我可以将其终止。如果我之后重新连接,则端口转发将转到新连接,一切将重新开始工作。

当管道断开时,有什么办法可以让服务器终止该进程?(我想它可能不知道连接已断开)

或者

有没有一种方法,当我使用同一端口的端口转发重新连接 SSH 时,它会识别出已经有另一个连接打开(死连接)并终止该进程,以便新连接能够接受端口转发?

答案1

您没有告诉我们有关您使用的本地操作系统、远程操作系统、SSH 客户端和服务器的任何信息。我​​假设 Linux 中的 OpenSSH。

当管道断开时,有什么办法可以让服务器终止该进程?(我想它可能不知道连接已断开)

足够低(但不为零)的值ClientAliveIntervalClientAliveCountMax/etc/ssh/sshd_config服务器上应该这样做。

ClientAliveInterval
设置超时间隔(以秒为单位),如果在此间隔后未收到来自客户端的数据,sshd(8)则将通过加密通道发送消息以请求客户端响应。默认值为0,表示不会将这些消息发送给客户端。

ClientAliveCountMax
设置可以发送而无需从客户端收到任何消息的客户端活动消息数sshd(8)。如果在发送客户端活动消息时达到此阈值,sshd将断开客户端连接并终止会话。[…]

这些设置正是用于检测断开的连接。您可以在这是我的另一个答案. 以下示例值

ClientAliveInterval 15
ClientAliveCountMax 4

将使 SSH 服务器检测到断开的连接并在大约一分钟后终止它(释放端口)。您可能希望将值设得更低,ClientAliveInterval以便更快地终止。请注意,如果您的连接不稳定并且有时会停滞,但随后恢复而没有真正断开您的连接,在这种情况下,太低的值可能会让服务器断开您的连接。

设置相同的值ServerAliveInternalServerAliveCountMax在您的本地ssh_config(或更确切地说是您的私人~/.ssh/config)中是一个好主意。这样,当您的客户端放弃连接时,您就知道服务器几乎同时做了同样的事情。

还有一件事你可以做。我真的不了解 Xdebug,我没有任何使用经验,但我发现了这一点:

string xdebug.remote_host = localhost

选择运行调试客户端的主机,您可以使用主机名、IP 地址或unix:///path/to/sockUnix 域套接字。[…]

Xdebug 2.6 引入了对 Unix 域套接字的支持。

我想如果ssh -R 9000:localhost:9000 …你不使用类似

ssh -R /home/dab/xdebug-socket:localhost:9000 …

(是的,ssh可以通过这种方式转发套接字)并告诉 Xdebug 使用

xdebug.remote_host = unix:///home/dab/xdebug-socket

那么它就可以正常工作了。现在您可以利用StreamLocalBindUnlinksshd_config服务器上:

StreamLocalBindUnlink
指定在创建新的 Unix 域套接字文件之前是否删除用于本地或远程端口转发的现有 Unix 域套接字文件。如果套接字文件已存在且未StreamLocalBindUnlink启用,sshd则无法将端口转发到 Unix 域套接字文件。此选项仅用于将端口转发到 Unix 域套接字文件。

参数必须是yesno。默认值是no

使用套接字,告诉 SSH 服务器StreamLocalBindUnlink yes,这样即使旧的 SSH 会话尚未终止,您也将能够重新创建隧道。

请注意,取消链接套接字不会干扰已经使用该套接字的程序(例如取消链接常规文件不会干扰程序)。Xdebug 可能仍会使用未链接的套接字。再说一遍,我不了解 Xdebug。请自行测试。

您可能能够配置第一种方法(活动消息),并且这将足够。

答案2

相信这将起作用(在我的实验中有效,尽管我只能手动中断连接,所以不确定我是否完全复制了你的管道破裂情况):

ssh -o ExitOnForwardFailure=true -R 9000:localhost:9000 -Nf remote-server

主要的技巧是,您创建一个“独立”的 ssh 连接,仅用于端口转发并将其置于后台(-Nf选项)。这样,当连接终止(例如管道断开)时,它应该释放端口。

ExitOnForwardFailure选项的作用只是,当您下次尝试建立连接时,您将在 STDOUT 上看到该端口在服务器上仍处于打开状态。如果您仍需要执行更复杂的操作来手动终止服务器上的连接,您可以使用失败的退出代码sshExitOnForwardFailure选项来执行更复杂的操作。

相关内容