You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从本地主机发起并控制两台远程主机间的端口转发(数据不经过本地)

从本地主机发起并控制两台远程主机间的端口转发(数据不经过本地)

我来给你梳理下正确的解决思路,你之前的命令主要是方向搞反了,再加上参数组合不对,才导致了报错。

首先明确你的核心需求:让compute_remote_1的某个端口直接转发到compute_remote_2上,全程数据不经过本地的compute_mine,同时由本地发起并控制这个转发进程,本地进程终止时转发自动停止。

前提条件

首先要确保compute_remote_2能直接通过SSH访问compute_remote_1(最好配置无密码密钥登录,避免每次输入密码)——因为如果compute_remote_2不能直连compute_remote_1,数据必然要经过本地中转,就不符合你“数据不经过本地”的要求了。

正确的命令执行方式

在你的本地compute_mine终端里执行以下命令:

ssh -t user@compute_remote_2 'ssh -N -L 0.0.0.0:转发端口:compute_remote_1:源端口 user@compute_remote_1'

参数解释:

  • 本地的ssh -t:强制给远程会话分配伪终端,这样当你在本地按下Ctrl+C、关闭终端,或者本地进程意外终止时,compute_remote_2上的转发进程会跟着终止,完美满足“本地控制生命周期”的需求。
  • 远程的ssh -N:告诉SSH只做端口转发,不执行任何远程命令。
  • -L 0.0.0.0:转发端口:compute_remote_1:源端口:把compute_remote_1上的源端口,转发到compute_remote_2的转发端口上。如果只允许compute_remote_2自身访问这个转发端口,把0.0.0.0换成localhost即可;如果需要其他机器也能通过compute_remote_2访问,保留0.0.0.0。

为什么你之前的命令报错?

你之前用的ProxyCommand是用来**让本地通过compute_remote_1作为跳板连接compute_remote_2**的,完全和你要的方向相反。另外参数里的-P port_number是指定SSH连接的远程端口(默认22),不是转发端口;-T参数会禁用伪终端,导致本地进程终止后,compute_remote_2上的转发进程可能还在后台残留,这也不符合你的需求。

额外优化:避免多SSH实例

如果需要多次执行这类操作,不想每次都新建SSH连接,可以给本地的SSH命令加上控制主连接的参数,复用现有连接:

ssh -t -o ControlMaster=auto -o ControlPath=~/.ssh/cm_%h_%p_%r user@compute_remote_2 'ssh -N -L 转发端口:compute_remote_1:源端口 user@compute_remote_1'

这样后续连接到compute_remote_2时会复用同一个SSH会话,减少资源占用。

备注:内容来源于stack exchange,提问作者manifold_destiny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:48:16