我需要在防火墙后面的私有服务器和公共服务器之间建立一个永久的 ssh 隧道,以便我可以随时通过公共服务器 ssh 进入私有服务器。
当我在私人服务器中手动执行此操作时,
ssh -R 6666:localhost:22 username@public_host
一切正常。但是,当我将这条线放入crontab -e
以便重新启动时自动重新建立隧道时,它不起作用。知道出了什么问题吗?
笔记:服务器之间的公钥/私钥对已经设置并且工作正常。
答案1
使用 autossh,它会为您完成此操作。它专为不需要手动启动或重新启动的持久连接而设计,具有自我监控功能,并且可以执行与普通 ssh 客户端相同的任何隧道作业。
答案2
您正在ssh
会话上下文之外执行该命令,因此您可能会丢失一些通常可用的内容。
据推测,您正在使用密钥进行身份验证。密钥可以从 cron 作业中获得吗?
- 如果密钥文件受密码保护,则显然该密钥不可用,因为您可能尚未输入密码。即使您输入了密码,密钥也会保存在会话密钥代理的内存中。
ssh
从会话启动的命令知道如何通过环境变量联系密钥代理SSH_AUTH_SOCK
,但从ssh
crontab 启动的命令没有此变量。 - 如果您的主目录已加密,则密钥文件在启动时尚不可用,因为尚未安装解密的主目录。在输入解密密码之前,无法安装解密的主目录。
如果问题在于密钥以某种方式受密码保护,那么您无法在输入密码之前建立隧道。您有两种解决方案:
- 等到会话开始建立隧道。这保留了设置的安全性,但意味着隧道稍后才可用。您可以将隧道建立添加到会话启动脚本中。
- 使用以明文形式存储在磁盘上的私钥来建立隧道。