![SSH 双跳,带端口转发和立即返回的远程命令](https://linux22.com/image/1536023/SSH%20%E5%8F%8C%E8%B7%B3%EF%BC%8C%E5%B8%A6%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%92%8C%E7%AB%8B%E5%8D%B3%E8%BF%94%E5%9B%9E%E7%9A%84%E8%BF%9C%E7%A8%8B%E5%91%BD%E4%BB%A4.png)
我在堡垒后面有一个远程主机,需要设置端口转发,我想出了以下方法:
bastion=xyz.com
user=$( whoami )
function doSSH () {
ssh $user@$bastion -t -A \
-L 5900:127.0.0.1:5900 \
ssh $user@$1 -t -A \
-L 5900:127.0.0.1:5900 \
'/opt/enableVNC && while [ 1 ]; do echo "Keeping forwards alive..." && sleep 60; done'
}
我面临的问题是,通过 SSH 连接到远程节点后,我必须运行一个脚本来启用节点上的 VNC 服务器,不幸的是,0
一旦服务器启动并运行,此脚本很快就会返回。我调用的脚本不是阻塞脚本,即使我已经建立了端口转发,ssh 会话也会结束。
$ doSSH node1
[email protected]'s password:
user@node1's password:
VNC is now Enabled
Listening on 127.0.0.1:5900
Connection to node1 closed.
Keeping forwards alive...
Keeping forwards alive...
似乎在命令的第一部分返回后立即与第二台主机的连接断开,并且我无法保持与第二台主机的连接打开。
在拨打并立即返回的电话后,如何才能保持端口转发的建立?
答案1
我假设您在运行命令时使用了引号(否则,while 循环将在本地执行)。您能在远程主机上创建脚本吗?如果可以,您可以创建一个脚本
#!/usr/bin/env bash
/opt/enableVNC && while [ 1 ]; do sleep 1; done
并在您的会话中运行该脚本ssh
。
答案2
这段丑陋的代码怎么样:
bastion=xyz.com
user=$( whoami )
function doSSH () {
ssh $user@$bastion -t -A \
-L 5900:127.0.0.1:5900 \
'bash -c "ssh '$user'@'$1' -t -A \
-L 5900:127.0.0.1:5900 \
bash -c \"/opt/enableVNC && while [ 1 ]; do echo Keeping forwards alive... && sleep 60; done\""'
}