我是linux的初学者,也是ssh和tunnels的新手。
无论如何,我的目标是在后台保持一个ssh隧道打开。
为了做到这一点,我编写了以下批处理,然后将其添加到crontab中(该批处理在工作日从上午8点到晚上9点每5分钟自动处理一次)。我在stackoverflow中的其他一些线程中读到,应该使用autossh,这将确保ssh通过定期检查总是可以的。我也是
#!/bin/bash
LOGFILE="/root/Tunnel/logBatchRestart.log"
NOW="$(date +%d/%m/%Y' - '%H:%M)" # date & time of log
if ! ps ax | grep ssh | grep tunnelToto &> /dev/null
then
echo "[$NOW] ssh tunnel not running : restarting it" >> $LOGFILE
autossh -f -N -L pppp:tunnelToto:nnnnn nom-prenom@193.xxx.yyy.zzz -p qqqq
if ! ps ax | grep ssh | grep toto &> /dev/null
then
echo "[$NOW] failed starting tunnel" >> $LOGFILE
else
echo "[$NOW] restart successfull" >> $LOGFILE
fi
fi
我的问题是,有时隧道停止工作,虽然一切看起来都很好(ps ax| grep ssh >结果显示了两个预期的任务:autossh主任务和ssh隧道本身)。实际上我知道这个问题,因为隧道被第三方软件使用,一旦隧道不再响应,该软件就会触发错误。
因此,我想知道我应该如何改善我的一批,以便它将能够检查隧道,并重新启动它,如果它碰巧是死的。我在there中看到了一些想法,但它是由“autossh”提示得出的结论...我已经在用了所以,我没办法了…如果你们中的任何人有,我很乐意看看他们!
谢谢你对我的问题感兴趣,以及你的(可能)建议!
3条答案
按热度按时间ig9co6j11#
您可以使用以下技巧来代替使用
ps
检查ssh
进程创建脚本,执行以下操作并通过
crontab -e
将其添加到crontab实际上,这个脚本将打开两个端口
请检查并通过评论向我发送进一步的问题
dsf9zpds2#
你不需要bash来做这个!
现在大多数linux机器都带有**
systemd
**,它对启动/停止/重新启动服务提供了可靠的支持,并具有可配置的条件和超时。1.以root用户身份创建
systemd
服务单元:1.将以下配置粘贴到新文件中:
1.启用并启动服务单元:
1.(可选)检查服务状态:
如何操作?
StartLimitIntervalSec
配置服务开始计数的间隔。如果一个服务在此时间间隔内启动超过StartLimitBurst
次 *,则不允许再启动。TimeoutStartSec
配置systemd
在服务被视为处于失败状态之前等待服务启动的最长时间。使用上面的配置,如果SSH隧道关闭,例如,由于临时网络故障,
systemd
将等待10秒,然后重新启动隧道。这种方法是可靠的,可配置的,并实现了与其他答案或实用程序(如autossh)中给出的脚本相同的结果,但可以与任何其他工具一起使用的通用方式。
这里的关键是在 foreground 模式下启动SSH(即不要使用
-fn
交换机将其发送到后台),以便systemd
可以监视服务是否仍处于活动状态,并在出现故障时重新启动它。另请参阅:
a14dhokn3#
好了,我成功地运行了批处理来启动ssh隧道(我必须指定我的主机名而不是localhost,以便它可以被触发):
然而,我得到了一些即时消息(如下),当隧道运行时,当cron试图再次启动批处理...听起来好像它听不进去。此外,因为我需要一些时间来得到一个证明,我不能说,但它将成功地重新启动,如果隧道是。
下面是对批处理第二次启动的响应。
bind:地址已在使用channel_setup_fwd_listener:无法侦听端口:10022结合:地址已在使用channel_setup_fwd_listener:无法侦听端口:8082无法请求本地转发。