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