从本地主机发起并控制两台远程主机间的端口转发(数据不经过本地)
从本地主机发起并控制两台远程主机间的端口转发(数据不经过本地)
我来给你梳理下正确的解决思路,你之前的命令主要是方向搞反了,再加上参数组合不对,才导致了报错。
首先明确你的核心需求:让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
相关产品推荐
相关产品推荐

