微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个bsh脚本,执行ssh远程机器,并执行一个命令,如:

ssh -nxv user@remotehost echo "hello world"

当我从命令行执行命令时,它工作正常,但作为crontab的一部分执行时失败(errorcode = 255 – 无法build立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机器和脚本连接到的任何其他机器。

Bash命令检查在Linux上是否安装了Oracle或OpenJDK Java版本

用shell中的内容创build多个文件

在bash中可变增量

一线FTP服务器

如何在shell脚本中使用curl?

PS。 请不要问/抱怨/评论说,以root身份执行任何事情是坏的/错误的/等 – 这不是这个问题的目的。

Bash脚本只有在以前没有下载文件时才从FTP下载文件

从shell脚本parsing文件中的键/值的代码

剥离whitspace并将小写字母缩写为连字符 – 文件

redirect杀死的可执行文件的标准输出

将数据从java传递给cupsfilter

我猜测,通常当你从本地机器ssh到运行crond的机器,你的私钥加载到ssh-agent并通过连接转发。 所以当你从命令行执行命令时,它会在ssh-agent中找到你的私钥并使用它登录到远程机器。

当crond执行命令时,它不能访问ssh-agent,所以不能使用你的私钥。

您将不得不在运行crond的机器上为root创建一个新的私钥,并将其公有部分复制到想要crond登录到的远程机器上相应的authorized_keys文件中。

keychain

以无痛的方式解决这个问题。 这是在Debian / Ubuntu的回购:

sudo apt-get install keychain

也许还有很多其他的发行版(它看起来像是源自Gentoo)。

如果没有任何程序正在运行,这个程序将启动一个ssh-agent ,并提供可以作为source d的shell脚本,并将当前shell连接到这个特定的ssh-agent 。

对于bash ,使用名为id_rsa ,将以下内容添加到.profile :

keychain --nogui id_rsa

这将启动一个ssh-agent并在重新启动后的第一次登录添加id_rsa密钥。 如果密钥被密码保护,它也会要求密码不再需要使用不受保护的密钥! 对于后续登录,它将识别代理,而不再要求密码

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

. ~/.keychain/$HOSTNAME-sh

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

但是, cron作业似乎还没有看到这一点。 作为补救措施,请在实际的命令之前在crontab包含上面的行:

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

不要使用密码来暴露您的SSH密钥。 改为使用ssh-cron ,它允许您使用SSH代理来安排任务。

所以我有一个类似的问题。 我来到这里,看到了各种答案,但在这里的一些实验是如何使用sshkeys与密码,ssh-agent和cron。

首先,我的SSH设置在我的bash init脚本中使用了以下脚本。

# JFD Added this for ssh SSH_ENV=$HOME/.ssh/environment # start the ssh-agent function start_agent { echo "Initializing new SSH agent..." # spawn ssh-agent /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" echo succeeded chmod 600 "${SSH_ENV}" . "${SSH_ENV}" > /dev/null /usr/bin/ssh-add } if [ -f "${SSH_ENV}" ]; then . "${SSH_ENV}" > /dev/null ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi

当我登录时,我输入一次密码,然后再使用ssh-agent自动验证。

ssh-agent的详细信息保存在.ssh / environment中。 以下是该脚本的外观:

SSH_AUTH_SOCK=/tmp/ssh-v3Tbd2Hjw3n9/agent.2089; export SSH_AUTH_SOCK; SSH_AGENT_PID=2091; export SSH_AGENT_PID; #echo Agent pid 2091;

关于cron,你可以通过各种方式设置一个普通用户的工作。 如果以root用户身份运行crontab -e,它将设置一个root用户cron。 如果以crontab -u davis -e的形式运行,它将以userid davis的形式添加一个cron作业。 同样,如果以用户davis的身份运行并执行crontab -e,它将创建一个以userid davis身份运行的cron作业。 这可以通过以下条目进行验证:

30 * * * * /usr/bin/whoami

这将每隔30分钟将whoami的结果邮寄给用户戴维斯。 (我做了一个crontabe -e用户davis。)

如果您尝试查看用户戴维斯使用的密钥,请执行以下操作:

36 * * * * /usr/bin/ssh-add -l

它会失败,通过邮件发送的日志会说

To: [email protected] Subject: Cron <davis@hostyyy> /usr/bin/ssh-add -l Could not open a connection to your authentication agent.

解决方案是为上面的ssh-agent提供env脚本。 这是最终的cron条目:

55 10 * * * . /home/davis/.ssh/environment; /home/davis/bin/domythingwhichusesgit.sh

这将在10:55运行脚本。 注意领先。 在脚本中。 它说在我的环境中运行这个脚本类似于.bash初始化脚本。

昨天我有类似的问题…

我有一台服务器,在其他服务器上启动一些行动,使用ssh的cron作业…问题是用户权限和密钥…

在crontab我有

* * * * * PHP /path/to/script/doSomeJob.PHP

而它根本没有工作(没有权限)。 我尝试运行cron作为特定的用户,这是连接到其他服务器

* * * * * user PHP /path/to/script/doSomeJob.PHP

但没有效果

最后,我导航到脚本,然后执行PHP文件,它的工作..

* * * * * cd /path/to/script/; PHP doSomeJob.PHP

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐