![以编程方式在活动会话中打开 SSH 隧道?](https://linux22.com/image/759640/%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E5%9C%A8%E6%B4%BB%E5%8A%A8%E4%BC%9A%E8%AF%9D%E4%B8%AD%E6%89%93%E5%BC%80%20SSH%20%E9%9A%A7%E9%81%93%EF%BC%9F.png)
我知道后启动新的 SSH 会话我可以打开 SSH shell 来启动新的隧道(Enter
然后~
和最后C
):
>ssh -L 9000:localhost:9000
Forwarding port.
有没有办法在已经通过 SSH 登陆的情况下以非交互的方式完成此操作?
我在这里忽略了安全隐患,这是针对本地开发情况,我可能需要打开一个到将在随机端口上监听的服务器的隧道。
答案1
你可以这样做,但需要事先做一些准备:将(第一个) ssh 命令设置为主 ssh,使用-M
/ControlMaster
和-S
/ControlPath
. 通常控制大师该功能旨在使用其单个 TCP 连接通过单个 ssh 身份验证运行多个 ssh shell 到同一目标。但您也可以使用-O
命令添加额外的转发:
-O ctl_cmd
控制一个活跃的连接复用主进程。当
-O
指定该选项时,这命令参数被解释并传递给主进程有效命令为:“check”(检查主进程是否正在运行),“forward”(请求转发,但不执行命令)、“取消”(取消转发)、“退出”(请求主机退出)和“停止”(请求主机停止接受进一步的多路复用请求)。
1号航站楼:
ssh -S /tmp/exampleinsecuresocket -M remoteuser@remotehost
航站楼2:
ssh -S /tmp/exampleinsecuresocket -O forward -L 9000:localhost:9000 remoteuser@remotehost
请注意,terminal2 的 ssh 将立即退出,并且不会要求身份验证,即使通常应该如此:它没有与远程主机但只是告诉已经在终端 1 中运行的 ssh 执行本地转发。在终端 1 中运行的 ssh 现在有一个额外的端口被转发。当然这是非交互式的,可以在脚本中完成。
通过适当使用参数-o ControlMaster auto
,以及正确的方案和足够的令牌控制路径~/.ssh/config
选项如手册中所述,可以自动执行任何目的地的初始设置。