![在 ControlMaster SSH 会话中以编程方式添加端口转发](https://linux22.com/image/540166/%E5%9C%A8%20ControlMaster%20SSH%20%E4%BC%9A%E8%AF%9D%E4%B8%AD%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E6%B7%BB%E5%8A%A0%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91.png)
我刚刚发现了 OpenSSH 的 ControlMaster/ControlPath 功能,它允许您使用单个 SSH 连接运行多个终端。
由于我经常使用 SSH 来使用端口转发来获取加密和经过身份验证的 VNC 会话,我立即意识到您无法将端口转发添加到已经建立连接的远程服务器。这很糟糕。
后来我发现,你可以在正在运行的 SSH 终端会话中输入 ~C 来绕过这个限制。这将打开一个命令行,允许你添加或删除端口转发。
我现在的问题是:如何在使用 ControlMaster/ControlPath 功能的现有 SSH 会话上添加端口转发,而无需访问该 SSH 会话内的终端会话。我需要这个来启用我的脚本,该脚本启动安全隧道 VNC 连接,以便我添加并稍后删除其端口转发。
(我知道我可以使用终端多路复用器,例如 GNU Screen 或 tmux,实际上我已经这样做了。但出于多种原因,我喜欢只使用一个 SSH 会话的想法。)
答案1
其实这很简单。只需将 ctl_cmd 添加-O forward
到现有命令中,如下所示:
ssh -M -L5555:localhost:22 remotehost
变成:
ssh -O forward -M -L5555:localhost:22 remotehost
这ssh
手册页讨论-O ctl_cmd
选项:
-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).
当然,这假设您已经ControlMaster yes
在~/ssh/config
文件或-M
命令行中启用它。