我有一台位于 NAT 后面的 PC,它与我的 Digitalocean VPC 建立反向 SSH 连接。我利用这种反向 SSH 连接从家里登录到我的办公室 PC(我有权这样做)并复制文件并执行其他重要操作。
虽然不常见,但我注意到我的办公室 PC 重新启动(由于电源故障等)并中断了它与我的 VPC 建立的反向 SSH 连接。在这种情况下,我无法从家庭电脑连接到办公室电脑。
我运行以下脚本来进行反向连接+动态代理,以匿名化我在办公室电脑上生成的流量(因为我不需要共享浏览信息)。
autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
我无法在重新启动后在我的办公室电脑上再次运行该脚本,因为我实际上并不在那里。为了解决这个问题我安装了以下crontab。
注意:rev.sh
文件包含以上行。证书“digitalOcean”和 rev.sh 位于Ubuntu home
.因此,当我./rev.sh
在 Ubuntu 终端中执行时,我获得了一个动态代理,并且还可以访问 ym DigitalOcean 服务器。这个方法100%有效。
但是,当我按照以下方法安装 chrontab 时,我的 ubuntu PC 永远不会创建动态代理。我可以看到这一点,因为当我从 Google Chrome 检查此代理时,它说代理拒绝连接。
以下是我作为根 cronejobs 尝试过的 cronejobs。我也以普通用户的身份尝试过这些,但仍然不起作用。
@reboot bash /home/user/rev.sh
@reboot /home/user/rev.sh
@reboot cd /home/user && ./rev.sh
然后我在当前时间前几分钟安装了一个 chrontab 并等待它执行。
24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh
这些也没有执行。
请好心帮助我发现我的错误。这个网站上有很多关于我的问题的类似问题。因此我提到了很多答案,但似乎没有一个有帮助。
答案1
我不确定cron
在启动时运行脚本是否是一个好主意。我认为更合适的另一种选择是创建 SystemD 服务,如下所述这里. 创建一个名为的文件/etc/systemd/system/autossh.service
:
[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target
然后以 root 身份运行以下命令:
systemctl enable autossh.service
答案2
您可以尝试以下几件事:
chmod +x rev.sh
有时您的路径在启动时或通过 cronjobs 未完全设置,因此在我的系统上将 autossh 替换为完整路径
/usr/bin/autossh
@reboot 主题取决于 cron 守护进程的启动时间,因此它可能会在其他子系统(网络?)启动并运行之前被调用
还有你的 crontab 示例:
24 12 8 * * * bash /home/user/rev.sh
只会在每个月的8号调用。它有一个额外的字段。尝试
24 12 * * * /home/user/rev.sh
答案3
看来,当通过 crontab 执行脚本时,它找不到您的证书。
当您作为用户执行脚本时,它使用 /home/ubuntu-user/.ssh/... 中的证书。但是,当从 crontab 执行脚本时,它会以 root 身份运行。 root 从 /root/.ssh 获取证书
所以你有多种方法可以让它工作,但我认为运行脚本crontab 中的 ubuntu 用户可以。
编辑:
确保提供证书的完整合格路径
答案4
由于问题中没有太多数据,我将从头开始我会做什么
我会将所有配置放在 /etc/ssh/ssh_config 中:
Host mytunnel
HostName IPofDigitalOcean
User root # Are you sure about this??
IdentityFile /etc/ssh/mytunnel_key
RemoteForward 8081 localhost:22
DynamicForward 8080
我会把钥匙放进去/etc/ssh/mytunnel_key
然后我会尝试使用 cron 条目(一个新贵/systemd 服务会更好),如下所示:
@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel