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

Ask*_*man 4 ssh command-line bash scripts networking

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

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

.sh 脚本将由工作中的计算机每 5 分钟执行一次,这就是我希望它执行的操作:

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

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

如果 ssh 连接尝试由于某种原因挂起,例如超过 2 分钟,则强制退出脚本(不确定这是否可行,如果不可行,则不必存在)

非常感谢您的建议。

pa4*_*080 5

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

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

我们可以用它ps -aux | grep "<our command>" | 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
Run Code Online (Sandbox Code Playgroud)

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

* * * * * $HOME/bin/my_autossh
Run Code Online (Sandbox Code Playgroud)

如果您不想使用 Cron,请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
Run Code Online (Sandbox Code Playgroud)

并使用nohup将其推入后台:

nohup my_autossh >/dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

另请阅读: