假设我有一台计算机 compute_mine。我可以通过 ssh 访问两台远程计算机 compute_remote_1 和 compute_remote_2。我想将端口从 compute_remote_1 转发到 compute_remote_2。但是,我想从 compute_mine 启动和控制端口转发过程。compute_remote_1 或 compute_remote_2 中的任何数据都不应转发到 compute_mine。
我需要当 compute_mine 上的进程因任何原因终止时自动终止端口转发。我还想避免多个 ssh 实例。
粗略估计是从 compute_mine 发出的 ssh ProxyCommand 如下:在 compute_mine 上:ssh 进入 compute_remote_2‘ProxyCommand forward port from compute_remote_1 to local port on compute_remote_2’
我尝试了各种 ssh ProxyCommands,但至今没有任何效果。有什么建议吗?
我尝试过从 compute_mine 向 remote_compute_2 发出的各种 ssh ProxyCommand。例如:ssh -o 'ProxyCommand=ssh -W host:port user@remote_compute_1 -v' user@remote_compute_2 -P port_number -NTC
退出并出现错误:横幅交换:连接到未知端口 65535:格式无效
答案1
尝试在“compute_mine”上运行:
ssh -L 本地主机:8081:本地主机:8080 -o “ProxyCommand=ssh -W %h:%p 用户@compute_remote_2” 用户@compute_remote_1 -N
此命令使用 ProxyCommand 而不是 -J 设置 SSH 隧道。ProxyCommand 中的 -W 选项指定要转发到的主机和端口(%h:%p 将替换为目标主机和端口)。
答案2
这不完全是你想要的,但它可能会解决你的问题:
ssh compute_remote_1 ssh -L 8080:localhost:80 compute_remote_2 sleep 10
假设您要在机器上运行使用隧道的某些程序。执行上述命令后,您有 10 秒钟的时间开始使用隧道(将 sleep 10 更改为其他值)。
一旦 SSH 隧道投入使用,SSH 命令就不会终止,但是一旦最后一个连接停止使用隧道,SSH 命令就会终止 - 这将拆除隧道。
nohup
如果您希望本地 SSH 命令立即返回,也可以使用远程 ssh 命令。
答案3
我认为它不能ProxyCommand
帮助你。它充当原始 TCP 连接的替代方案。要了解这个想法,请参阅这个答案whereProxyCommand
不用于代理。无论您ProxyCommand
在调用ssh -L
或ssh -R
上指定什么命令计算矿,隧道的一端将是计算矿。并且指定的命令ProxyCommand
在本地运行,因此如果您依次使用ssh -L
或ssh -R
内部ProxyCommand
,则隧道的一端将是计算矿也一样。
同样地ssh -J
所有连接都从本地计算机开始,即计算矿在你的情况下。如果ssh -J
运行于计算矿,端口转发-L
或-R
将涉及计算矿。
转发端口计算_远程_1到计算_远程_2不是通过计算矿,你需要一个从计算_远程_1或者计算_远程_2。
从计算矿你可以这样做:
# not an answer yet
ssh compute_remote_1 'ssh -NL 5678:localhost:1234 compute_remote_2'
隧道将通过以下方式建立ssh -NL … compute_remote_2
:计算_远程_1. 问题是,在运行ssh
时它不会自动退出ssh
计算矿已终止。
解决方案是ssh -tt
使用计算矿:
ssh -tt compute_remote_1 'exec ssh -NL 5678:localhost:1234 compute_remote_2'
(-t
通常就足够了,但是-tt
即使没有本地终端也会做我们想做的事情。)
这将分配一个 tty计算_远程_1并启动一个 shell 作为 tty 的控制进程。shell 将执行exec ssh …
一个,从而用 替换自身ssh
。关键是我们要ssh
成为控制进程。有些 shell会exec
自动执行最后一个命令(一种优化,当没有其他事情要做时,这是一种明智的行为),但最好exec
明确地执行,以防 shell计算_远程_1没那么聪明。
终止端口转发的最简单方法是计算矿方法是在运行我们的终端上输入Ctrl+ (如果存在这样的终端)。这不会直接杀死,而是进入cssh -tt
ssh -tt
^C
计算_远程_1并且那里的 tty 将会被杀死ssh -NL
(见这个答案)。我们的本地ssh -tt
稍后会退出。
ssh
在计算矿可能出于任何原因先退出,例如,您可能kill
先退出。如果发生这种情况,sshd
并且计算_远程_1通知(视情况而定,可能会或可能不会立即通知,请参阅这个答案),然后 tty 开启计算_远程_1将被关闭,控制进程将收到 SIGHUP。我们确保控制进程是ssh
处理端口转发的进程,SIGHUP 将终止它。这样,当ssh
进程计算矿终止。
这取决于你是否ssh -tt
来自计算矿到计算_远程_1或者计算_远程_2;如果您在那里使用ssh -NL
或ssh -NR
。端口转发的“目标”不必是localhost
,因此ssh -NL 5678:compute_remote_2:1234 compute_remote_3
例如计算_远程_1可能有意义。请根据您的需要调整解决方案。