我正在努力编写我认为应该简单的脚本。
基本上,我在工作时有一台计算机,它隐藏在 NAT 后面,我无法访问它。我需要通过 SSH 进入这台计算机,因此唯一的方法是设置反向端口重定向,这样这台经过 NAT 的计算机将连接到我家里的服务器,同时为自己重定向一个端口,然后我就可以通过我的家庭服务器通过 ssh 进入它。
.sh 脚本将由工作计算机每 5 分钟执行一次,这就是我希望它执行的操作:
检查是否存在与我的服务器的活动 ssh 连接,如果是,则不执行任何操作并退出脚本。
如果没有检测到活动连接,则通过执行“ssh[电子邮件保护]-i key.priv”并退出脚本。
如果 ssh 连接尝试由于某种原因挂起,比如超过 2 分钟,则强制退出脚本(不确定是否可以这样做,如果不能,那么它就不必在那里)
谢谢您的建议。
答案1
假设您使用以下命令建立 SSH 连接(我更愿意使用.ssh/config
可以简化 ssh 命令的文件,但这不是强制性的):
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 "<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
调用此脚本my_autossh
,将其放入~/bin
并使其可执行。然后运行crontab -e
并添加以下作业:
* * * * * $HOME/bin/my_autossh
如果你不想使用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
并使用nohup
将其推入后台:
nohup my_autossh >/dev/null 2>&1 &
另请阅读: