【发布时间】:2017-12-22 15:55:16
【问题描述】:
我正在编写一个脚本,它从我们远程部署的虚拟机双跳 SSH 转发端口 80,并在本地浏览器中打开这个“状态页面”。要打开它,SSH 隧道必须是“背景的”,但是这样做会导致 SSH 隧道退出,并且在我正在通过隧道的 SSH 服务器上保留一个持久隧道 (bastion)。到目前为止,这是脚本:
#!/bin/sh
# SSH needs a HUP when this script exits
shopt -s huponexit
echo "SSH Forwards the VM status page for a given host..."
read -p "Host Name: " CODE
PORT=$(($RANDOM + 1024))
# "-t -t" (force tty) needed to avoid orphan tunnels on bastion after exit. (Only seems to work when not backgrounded?)
ssh -t -t -4L $PORT:localhost:$PORT user1@bastion sudo ssh -4NL $PORT:localhost:80 root@$CODE.internal-vms &
PID=$!
# Open browser to VM Status Page
sleep 1
open http://localhost:$PORT/
# Runs the SSH tunnel in the background, ensuring it gets killed on shell's exit...
bash
kill -CONT $PID
#kill -QUIT $PID
echo "Killed SSH Tunnel. Exiting..."
sleep 2
不幸的是,考虑到 SSH 隧道的背景(在第 10 行使用 &),当脚本被终止(通过 CTRL-C)时,“堡垒”服务器最终会无限期地保留一个孤立的 SSH 连接。
“-t -t”和“shopt -s huponexit”已修复,我试过了,但似乎没有帮助。我还在最终的kill 中尝试了各种 SIG。我在这里做错了什么?感谢您的帮助!
【问题讨论】:
-
很遗憾,我在这个系统中继承了一些奇怪的约束。最大的需求是需要使用 sudo 从堡垒 ssh 到虚拟机。并且有许多虚拟机,因此将 user1 的 SSH 密钥部署到所有虚拟机会很困难。
-
我可以建议 Ansible 管理您的虚拟机并为所有虚拟机部署密钥吗?这将使您的生活更轻松,虚拟机更安全。
-
实际上,我们现在正在推出 Ansible 配置管理。 Ansible 很棒。不幸的是,有很多遗留服务需要我们一点一点地“Ansiblize”。
-
我几乎可以肯定,我什至已经看到
-t -t -t在 SSH 上取得了一些成功,但不记得正在解决的具体问题。值得一试。祝你好运。
标签: bash ssh ssh-tunnel