在远程实验室系统上,我有一个Shell脚本,该脚本启动到我的主Jumpbox的反向SSH隧道,每5分钟执行一次cron作业来运行它。如果SSH隧道已启动,则什么也不会发生;如果SSH隧道已关闭,它将启动它。
#!/bin/bash
createTunnel() {
/usr/bin/ssh -N -R :2222:localhost:22 [email protected]
if [[ $? -eq 0 ]]; then
echo Tunnel to jumpbox created successfully
else
echo An error occurred creating a tunnel to jumpbox. RC was $?
fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
echo Creating new tunnel connection
createTunnel
fi
这非常可靠,以确保在重新启动或我的跳箱IP发生更改时,我可以访问远程计算机。但是,我最近在该系统中添加了第二个SSH隧道,并且出现了以下情况:两个隧道之一发生故障,并且从未重新建立。看来,由于建立了一个隧道,因此pidof输出仍返回PID,因此该脚本从未运行过“ createTunnel”。由于我有两个SSH隧道,因此pidof输出显示两个PID:
$ /bin/pidof ssh
28281 28247
如何调整脚本以确定是否只有一条隧道断开?
我的想法:
autossh
。(其他一些答案可能会详细说明这些想法。)
有两个脚本,对不对?(不完全符合DRY)。给他们起不同的名字。您的脚本等待其ssh
退出。附加实例ssh
应该检查自己名称的pid,而不是检查的pid 。恰好一个pid两个pid表示没有先前的脚本仍在运行:
[ $(pidof -x scriptname | wc -w) -eq 2 ] && createTunnel
为什么要两个?因为$()
启动子壳也很重要。很脏,哦。
我认为有些开箱即用。创建两个具有唯一名称的符号链接,例如:
ln -s /usr/bin/ssh ssh-foo
ln -s /usr/bin/ssh ssh-bar
让第一个脚本运行ssh-foo
,让第二个脚本运行ssh-bar
。它们的pidof
调用也应该针对ssh-foo
或ssh-bar
分别针对。这样他们就不会混在一起。作为奖励,额外的费用ssh
(将来可能会以完全不同的原因运行)不会对其产生影响。
最后:
您无需检查任何内容。
/usr/bin/ssh -o ExitOnForwardFailure=yes -N -R :2222:localhost:22 [email protected]
如果隧道已经存在,则端口转发肯定会失败并ssh
退出。我猜您可以直接从crontab运行此行,不需要脚本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句