我有一个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身份执行任何错误/错误/等等 - 这不是这个问题的目的.
keychain
以无痛的方式解决这个问题.它在Debian/Ubuntu的回购中:
sudo apt-get install keychain
也许对于许多其他发行版(看起来它起源于Gentoo).
ssh-agent
如果没有运行,该程序将启动,并提供可以为source
d的shell脚本,并将当前shell连接到此特定shell ssh-agent
.
对于bash
使用命名的私钥id_rsa
,将以下内容添加到您的.profile
:
keychain --nogui id_rsa
这将启动ssh-agent
并id_rsa
在重新启动后首次登录时添加密钥.如果密钥受密码保护,它也会要求密码短语.无需再使用不受保护的密钥!对于后续登录,它将识别代理,而不是再次要求密码.
另外,添加以下内容作为您的最后一行.bashrc
:
. ~/.keychain/$HOSTNAME-sh
这将让shell知道到达管理的SSH代理的位置keychain
.确保.bashrc
来自.profile
.
然而,似乎cron
工作仍然没有看到这一点.作为补救措施,请crontab
在实际命令之前包含上面的行:
* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command
我猜通常当你从本地机器ssh到运行crond的机器时,你的私钥被加载到ssh-agent中并通过连接转发.因此,当您从命令行执行命令时,它会在ssh-agent中找到您的私钥并使用它来登录远程计算机.
当crond执行命令时,它无法访问ssh-agent,因此无法使用您的私钥.
您必须在运行crond的计算机上为root创建一个新的私钥,并将其公共部分复制到authorized_keys
您希望crond登录的远程计算机上的相应文件中.