多跳隧道:
我正在通过跳转服务器打开到远程服务器的隧道。
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
跳转主机上存储的特定配置,则这种方法可能会不方便。 - 我使用了小写的变量名;参见这个答案。