如何使用 upstart 启动 SSH 隧道

如何使用 upstart 启动 SSH 隧道

我不太习惯系统管理员,最近使用以下命令在两台服务器(在 Ubuntu 12.4 上)之间创建了 SSH 隧道:

ssh -fNg -L 3307:127.0.0.1:3306 [email protected]

它成功了,我还将此命令添加到 /etc/rc.local,它在启动时成功启动了 SSH 隧道。但是,我尝试在 /etc/init/my_tunnel.conf 中的一个文件中添加我的隧道,它成功了,但每次启动时都会启动近 12 个隧道!我使用了以下代码:

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel[016]
respawn
exec ssh -fNg -L 3307:127.0.0.1:3306 [email protected]
exit 0

我花了几个小时才搞明白,为什么这个脚本要执行这么多次。我也试过start on[2345],完全读完了 upstart 的手册,但结果还是一样。我肯定我这里漏掉了什么。

如果有人能帮助我。谢谢。

答案1

正如 c4f4t0r 所评论的,respawn 将在脚本退出时再次运行该命令。通过使用 -f,它会在后台运行,从而有效地退出并导致 upstart 重新启动它。如果删除 -f,它将保持运行状态,upstart 可以在它意外退出时观察到它。

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel[016]
respawn
exec ssh -Ng -L 3307:127.0.0.1:3306 [email protected]
exit 0

答案2

我做的完全一样,这是设置 Linux 机器远程访问的好方法:即使本地配置或连接的 IP 发生变化,您仍然可以保留远程访问权限。

首先,我编写了一个脚本,仅当隧道不存在时才设置隧道:(我删除了这里的所有评论)

$ cat /root/scripts/tunnels.sh
if [ "$1" == "WAIT" ]; then sleep 20; fi
TUNNELOK=`ps aux | grep ssh | grep 3307 | sed 's/.*3307.*/TUNNELALLOK/' | sort -u`
if [ "$TUNNELOK" != "TUNNELALLOK" ]; then
  ssh -R 8877:localhost:22 -Ng [email protected] &
fi

然后,我将其添加到 crontab 而不是 initab/upstart:

# crontab -l |grep tunnel
@reboot /root/scripts/tunnel.sh WAIT
*/5 * * * * /root/scripts/tunnel.sh

就这样……!过去我曾经使用 initab/upstart,但上面的解决方案终于完美地运行了。在最坏的情况下,您必须等待 5 分钟才能再次显示连接,但您可以在 crontab 中更改这一点。当然,您必须检查“ps aux”是否适合您的系统。

相关内容