制作.sh脚本以检查SSH连接是否存在,如果不存在则连接

我正在努力写下我认为应该是一个简单的脚本。

基本上我有一台计算机在工作,它隐藏在我无法访问的NAT后面。 我需要SSH到这台计算机,所以唯一的方法是设置一个反向端口重定向,这个NATted计算机将连接到我家的服务器,同时重定向端口为自己,然后我可以简单地ssh到它通过我的家庭服务器。

.sh脚本将由计算机每5分钟执行一次,这就是我希望它做的事情:

检查我的服务器是否存在活动的ssh连接,如果是,则不执行任何操作并退出脚本。

如果未检测到活动连接,则通过执行“ssh me@1.2.3.4 -i key.priv”进行连接并退出脚本。

如果ssh连接尝试由于某种原因而挂起,比如超过2分钟,则强制退出脚本(不确定是否可以这样做,如果没有,那么它不必在那里)

谢谢你的建议。

假设您使用以下命令建立SSH连接(我更喜欢使用简化ssh命令的.ssh/config文件,但这不是强制性的):

 ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa 
  • 选项-fTN会将连接推送到后台 – 我写了这个主要部分,因为这组选项对我下面的建议至关重要;
  • 选项-R 2222:127.0.0.1:22将创建反向隧道;
  • 选项-i $HOME/.ssh/id_rsa表示身份文件。

我们可以使用ps -aux | grep "" | sed '$ d' ps -aux | grep "" | sed '$ d' ps -aux | grep "" | sed '$ d'检查连接是否已建立。 基于此,我们的脚本可能是:

 #!/bin/bash SSH_COMMAND="ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa" if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]] then exec $SSH_COMMAND fi 

将此脚本调用my_autossh ,将其放在~/bin并使其可执行。 然后运行crontab -e并添加以下作业:

 * * * * * $HOME/bin/my_autossh 

如果您不想使用Cron, my_autossh以这种方式修改my_autossh

 #!/bin/bash SSH_COMMAND="ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa" while true; do if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]] then eval $SSH_COMMAND else sleep 60 fi done 

并使用nohup将其推入后台:

 nohup my_autossh >/dev/null 2>&1 &