在 ControlMaster SSH 会话中以编程方式删除端口转发

在 ControlMaster SSH 会话中以编程方式删除端口转发

不久前我收到了回答告诉我如何在正在运行的 SSH ControlMaster 进程中添加端口转发。了解这一点很有帮助,但我仍然不知道如何在不再需要端口转发后删除该端口转发。

据我所知,您可以通过正常连接上的内部命令键序列来执行此操作,但对于 ControlMaster 客户端,此功能似乎已被禁用。即使可以做到这一点,我也需要一个可以使用脚本自动执行的解决方案,而这种方式肯定不那么容易。

有办法做到吗?而且容易实现自动化吗?

答案1

作为我之前的回答注释,ssh 手册页-O ctl_cmd详细解释了,ctl_cmd其中是check、、或forward之一。cancelexit

-O ctl_cmd
        Control an active connection multiplexing master process.  When the -O option is
        specified, the ctl_cmd argument is interpreted and passed to the master process.
        Valid commands are: “check” (check that the master process is running), “forward”
        (request forwardings without command execution), “exit” (request the master to
        exit), and “stop” (request the master to stop accepting further multiplexing
        requests).

您可以使用ctl_cmd来实现脚本所需的自动化。您需要先使用 创建一个ControlMaster套接字-S,然后 ssh 到远程主机,如下所示:

ssh -v -M -S/tmp/controlmaster-remotehost remotehost

然后,您就可以从本地计算机随意forward转发端口。您可以使用一个命令转发多个端口:cancel

ssh -O forward -S/tmp/controlmaster-remotehost -L5555:localhost:22 -L3333:localhost:22 remotehost

和/或一次处理一个:

ssh -O cancel  -S/tmp/controlmaster-remotehost -L5555:localhost:22 remotehost
ssh -O cancel  -S/tmp/controlmaster-remotehost -L3333:localhost:22 remotehost

我创建了一个并排会话要点显示ssh -O ctl_cmd正在运行的;左侧为来自 localhost 的端口forward/ ,右侧为 ssh 连接到 remotehost 的输出:cancel

https://gist.github.com/raw/4265549/999d90b8f85190a41eed00e4d60d5d22da6c67b9/ssh-controlmaster-side-by-side.log

这些命令仅可用OpenSSH 6.0

 * ssh(1): support for cancelling local and remote port forwards via the
   multiplex socket. Use ssh -O cancel -L xx:xx:xx -R yy:yy:yy user@host"
   to request the cancellation of the specified forwardings
 * support cancellation of local/dynamic forwardings from ~C commandline

如果你使用的是较早版本,则需要升级。如果你使用的是 Mac OS X,则可以安装 macports进而升级使用:sudo port install openssh将其安装到/opt/local/bin

相关内容