我有一台位于 NAT 后面的 PC,它与我的 Digitalocean VPC 建立反向 SSH 连接。我利用这个反向 SSH 连接从家里登录我的办公室 PC(我被授权这样做)并复制文件并执行其他重要操作。
虽然不常见,但我注意到我的办公室电脑会重新启动(由于电源故障等原因)并断开与我的 VPC 建立的反向 SSH 连接。在这种情况下,我无法从家用电脑连接到办公室电脑。
我运行以下脚本来建立反向连接+动态代理,以匿名化我在办公室电脑上生成的流量(因为我不需要共享浏览信息)。
autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
由于我并不在办公室,因此无法在办公室 PC 重启后再次运行此脚本。为了解决这个问题,我安装了以下 crontab。
注意:rev.sh
文件包含上述行。证书“digitalOcean”和 rev.sh 位于Ubuntu home
。因此,当我./rev.sh
在 Ubuntu 终端中执行时,我获得了动态代理,并可以访问我的 DigitalOcean 服务器。此方法 100% 有效。
但是当我按照以下方法安装 crontab 时,我的 ubuntu PC 从未创建动态代理。我之所以能看到这一点,是因为当我从 Google Chrome 检查此代理时,它显示代理拒绝连接。
以下是我尝试过的 root cronjobs。我也以普通用户身份尝试过这些,但仍然不起作用。
@reboot bash /home/user/rev.sh
@reboot /home/user/rev.sh
@reboot cd /home/user && ./rev.sh
然后,我在当前时间前几分钟安装了一个 crontab 并等待它执行。
24 12 * * * bash /home/user/rev.sh
24 12 * * * /home/user/rev.sh
24 12 * * * reboot
这些也没有执行。
我也试过了48 15 * * * bash /home/user/rev.sh >> test3
,*/1 * * * * reboot -f >> test
但 test3 和 test 什么都没有。但是文件已经被创建了!!由 crontab 创建!
请帮我找出我的错误。这个网站上有很多与我的问题类似的问题。我参考了很多答案,但似乎都没有帮助。
答案1
更好的解决方案是使用看门狗。看门狗是一个守护进程,它将监视正在运行的进程,如果它们退出,它将自动重新启动它们。
在 Ubuntu 16.04 上安装看门狗
sudo apt-get install watchdog
看门狗如何工作
这watchdog(8)
守护进程将/etc/watchdog.d
使用参数test
或执行脚本repair
。(见TEST DIRECTORY
watchdog(8)
手册页部分)。您的看门狗脚本在检查某个进程是否正在运行并采取措施修复它时,会处理这两个参数。
您可以通过修改来配置看门狗/etc/watchdog.conf
(参见watchdog.conf(5)
)。
示例watchdog.d
脚本
举例来说/etc/watchdog.d/autossh_script
(具有755
权限并且归 所拥有root
)。
注意:您可能需要
$targetuser
在示例脚本中自定义环境变量。sam
是我的用户名。
#!/bin/bash
targetuser=sam
runTest=false
runRepair=false
case $1 in
test)
runTest=true
;;
repair)
runRepair=true
repairExitCode=$2
;;
*)
echo 'Error: script needs to be run by watchdog' 1>&2
exit 1
;;
esac
if ${runTest}; then
#run a test here which will tell the status of your process
#the exit code of this script will be the repairExitCode if it is non-zero
if ! pgrep autossh &> /dev/null; then
#autossh not running; notify watchdog to repair
exit 1
else
#autossh running; no action necessary
exit 0
fi
fi
if ${runRepair}; then
#take an action to repair the affected item
#use a case statement on $repairExitCode to handle different failure cases
su - ${targetuser} -c 'nohup autossh -f -- -NCD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC'
exit 0
fi
- 我在示例脚本中添加了
-N
您的ssh
命令,因此它仅启动隧道但不会尝试创建登录 shell。 - 我添加了
-f
它autossh
以便它在后台运行。 - 示例脚本使用了一个简单的
pgrep
模式。但是,您可以进一步将测试范围缩小到特定用户,甚至可以为该过程使用模式。请参阅pgrep(1)
了解如何使用 pgrep 进一步定制您的测试。
配置看门狗
/etc/watchdog.conf
是/etc/defaults/watchdog
配置看门狗的地方。请参阅watchdog.conf(5)
。
需要注意的是,默认情况下,用户脚本每秒执行一次。我建议将其增加到至少 30 秒,除非您需要更多实时检查。interval
在 中调整设置watchdog.conf
。
故障排除
您可能需要/etc/watchdog.d
在脚本之前创建目录。
/var/log/watchdog/*
包含与看门狗相关的日志和错误。如果您的脚本输出到 stdout 或 stderr,那么它将被写入那里。在我的系统上,我注意到我的脚本大约每秒执行一次。如果您在脚本中使用 echo,test
它repair
应该只是暂时的,仅用于调试目的。否则,建议丢弃输出,除非出现错误。
如果您的脚本根本没有运行,那么请检查权限:ls -l /etc/watchdog.d
。