后台多跳隧道;关闭本地隧道不会关闭远程隧道

后台多跳隧道;关闭本地隧道不会关闭远程隧道

多跳隧道:

我正在通过跳转服务器打开到远程服务器的隧道。

ssh ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

现在,当我打开一个连接时,localhost:port它将转发到 jump:port,然后又转发到remote:port

在后台运行本地隧道:

问题在于它会打开一个 shell remote,而我只希望隧道在后台运行。

因此,我-f向本地隧道添加了选项,以请求它在后台运行

ssh -f ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

然而,这会返回一个错误:

Pseudo-terminal will not be allocated because stdin is not a terminal.

jump据推测,这个错误是来自从到 的隧道remote,并且是因为stdin在我的本地隧道守护进程时关闭而导致的。

告诉远程隧道我不会运行命令:

然后我尝试运行jump-> remote隧道并-N告诉它我不会运行远程命令。

ssh -f ${JUMP_HOST} -l ${JUMP_HOST_USER} -L ${PORT}:localhost:${PORT} \
    ssh -N ${REMOTE_HOST} -l ${REMOTE_HOST_USER} -L ${PORT}:localhost:${PORT}

这很有效 – 隧道在后台运行,我可以remote:port通过连接到成功连接localhost:port

问题:

我遇到的问题是当我想关闭隧道时。

如果我向本地 ssh 隧道的 pid 发送终止信号,它将关闭,但正在运行的 ssh 隧道jump仍保持运行。

看来,当我守护我的本地隧道时,隧道jump也被守护了。

问题:

是否可以在后台运行我的本地隧道,但是当我终止它时,它会关闭所有远程服务器上生成的所有隧道吗?

答案1

在本地运行这两个ssh命令。首先连接到跳转服务器并创建一个隧道,以便您ssh当地的电脑:

ssh -fN $jump_host -l $jump_host_user -L ${helper_port}:${remote_host}:22

然后使用该隧道连接到远程主机,创建所需的隧道;仍然从本地计算机:

ssh -fN localhost -p $helper_port -l ${remote_host_user} -L ${port}:localhost:${port}

由于这两个ssh进程都是本地的,因此您可以kill随时使用它们;但我认为杀死第一个就足够了,尝试一下。


笔记:

  • 如果您的“辅助”ssh依赖于ssh_config跳转主机上存储的特定配置,则这种方法可能会不方便。
  • 我使用了小写的变量名;参见这个答案

相关内容