当前位置:  开发笔记 > 编程语言 > 正文

为什么ssh从crontab失败但在从命令行执行时成功?

如何解决《为什么ssh从crontab失败但在从命令行执行时成功?》经验,为你挑选了2个好方法。

我有一个bash脚本,它对远程机器执行ssh并在那里执行命令,如:

ssh -nxv user@remotehost echo "hello world"

当我从命令行执行命令时它工作正常,但是当作为crontab的一部分执行时它失败(errorcode = 255 - 无法建立SSH连接).细节:

...
Waiting for server public key.
Received server public key and host key.
Host 'remotehost' is known and matches the XXX host key.
...
Remote: Your host key cannot be verified: unknown or invalid host key.
Server refused our host key.
Trying XXX authentication with key '...'
Server refused our key.
...

在本地执行时,我充当root用户,crontab也以root身份运行.从crontab和命令行执行'id'会得到完全相同的结果:

$ id
> uid=0(root) gid=0(root) groups=0(root),...

我从一些本地机器ssh到运行crond的机器.我有ssh密钥和凭据ssh到crond机器和脚本连接到的任何其他机器.

PS.请不要问/抱怨/评论以root身份执行任何错误/错误/等等 - 这不是这个问题的目的.



1> krlmlr..:

keychain

以无痛的方式解决这个问题.它在Debian/Ubuntu的回购中:

sudo apt-get install keychain

也许对于许多其他发行版(看起来它起源于Gentoo).

ssh-agent如果没有运行,该程序将启动,并提供可以为sourced的shell脚本,并将当前shell连接到此特定shell ssh-agent.

对于bash使用命名的私钥id_rsa,将以下内容添加到您的.profile:

keychain --nogui id_rsa

这将启动ssh-agentid_rsa在重新启动后首次登录时添加密钥.如果密钥受密码保护,它也会要求密码短语.无需再使用不受保护的密钥!对于后续登录,它将识别代理,而不是再次要求密码.

另外,添加以下内容作为您的最后一行.bashrc:

. ~/.keychain/$HOSTNAME-sh

这将让shell知道到达管理的SSH代理的位置keychain.确保.bashrc来自.profile.

然而,似乎cron工作仍然没有看到这一点.作为补救措施,请crontab在实际命令之前包含上面的行:

* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command



2> dave4420..:

我猜通常当你从本地机器ssh到运行crond的机器时,你的私钥被加载到ssh-agent中并通过连接转发.因此,当您从命令行执行命令时,它会在ssh-agent中找到您的私钥并使用它来登录远程计算机.

当crond执行命令时,它无法访问ssh-agent,因此无法使用您的私钥.

您必须在运行crond的计算机上为root创建一个新的私钥,并将其公共部分复制到authorized_keys您希望crond登录的远程计算机上的相应文件中.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有