所以我有一个 Ubuntu 16.04 系统,每次系统启动时,它都应该运行我编写的 SSH 脚本。这是我第一次尝试让它工作,所以以前从来没有过。
脚本非常简单:
while true; do sleep 60; ssh root@ip -i ~/.ssh/key -R xxxx:localhost:22; done
它位于名为 的文件中autossh.sh
。
为了使脚本自动运行,我尝试将其包含在 /etc/rc.local 中(退出 0 之前),我尝试将其添加到 Ubuntu 的 GUI 的启动应用程序列表中。
在我两次重启计算机时,我都可以看到脚本确实在运行,但它并没有像命令应该做的那样将远程端口映射到 localhost 22。如果我手动运行命令,它会起作用,但它在启动时不起作用。
我是否遗漏了某些明显的东西,导致该脚本无法正常工作?
答案1
1.波浪号 ( ~
) 将解析为您的主目录,但当您未登录时,它没有任何意义。根据下一个建议,这并不那么重要,但最好强调一下。相关答案。我在这里的建议是按如下方式重写脚本:
#!/bin/bash
while true; do sleep 60; ssh root@ip -i "$HOME/.ssh/key" -N -f -R xxxx:localhost:22; done
或者更好地使用
/the/full/path/to/
而不是$HOME
。-f
请求 ssh 在命令执行之前进入后台。-N
不执行远程命令。这对于仅转发端口很有用。
2.SSH 密钥仅对其所有者可读,因此其他用户无法使用它们,并且它们不能在系统范围内使用。所以我的建议是使用 Cron 来完成这项任务。
以拥有 SSH 密钥的用户身份登录并运行crontab -e
(-e
表示编辑),或使用sudo -u <user-name> crontab -e
(-u
表示以调用的用户身份执行<user-name>
)并在底部添加此行:
@reboot /full/path/to/the/script/autossh.sh > /tmp/autossh.log 2>&1
保存并关闭 Crontab。此行应在系统启动时执行脚本,并将写入一个日志。
参考:
更新: