不久前我收到了回答告诉我如何在正在运行的 SSH ControlMaster 进程中添加端口转发。了解这一点很有帮助,但我仍然不知道如何在不再需要端口转发后删除该端口转发。
据我所知,您可以通过正常连接上的内部命令键序列来执行此操作,但对于 ControlMaster 客户端,此功能似乎已被禁用。即使可以做到这一点,我也需要一个可以使用脚本自动执行的解决方案,而这种方式肯定不那么容易。
有办法做到吗?而且容易实现自动化吗?
答案1
作为我之前的回答注释,ssh 手册页-O ctl_cmd
详细解释了,ctl_cmd
其中是check
、、或forward
之一。cancel
exit
-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
这些命令仅可用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
。