我有一个bash脚本,它的ssh到远程机器和执行命令在那里,这样的:

ssh -nxv user@remotehost echo "hello world"

当我从它工作正常命令行执行命令,但被作为crontab中的一部分被执行时失败(错误代码= 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.
...

当执行局部我充当根,crontab的工作原理根为好。 从crontab中和命令行执行的“id”使完全相同的结果:

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

我做的ssh一些本地机的机器上运行的crond。我有ssh密钥和证书ssh到的crond机和任何其它机器将这些脚本连接到

PS。请不要问/抱怨/评论,即执行任何作为根是坏/错误的/ etc - 它不是这个问题的目的

有帮助吗?

解决方案

我猜测,通常当你从本地机器的ssh到本机运行crond的,您的私人密钥在SSH代理加载并转发了该连接。所以,当你在命令行中执行命令,发现在的ssh-agent你的私钥,并使用它来登录到远程机器。

在crond的执行命令,它没有进入的ssh-agent,所以不能用你的私钥。

您必须创建在机器上运行的根一个crond的新的私钥,它的公共部分复制到相应的文件authorized_keys要crond的登录到远程计算机上。

其他提示

keychain

这解决了一个无痛的方法。它在回购为Debian / Ubuntu的:

sudo apt-get install keychain

和或许其它许多发行版(它看起来像它源自的Gentoo)。

如果没有运行时,此程序将启动一个ssh-agent,并提供可sourced壳脚本和当前壳连接到这个特定ssh-agent

有关bash,配有私人键名为id_rsa,以下内容添加到您的.profile

keychain --nogui id_rsa

这将启动ssh-agent和重新启动后添加在第一登录的id_rsa键。如果关键是密码保护的,它也将要求提供密码。 无需再使用未受保护的钥匙!:用于以后登录时,它会识别代理,而不是再次索要密码。

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

. ~/.keychain/$HOSTNAME-sh

这将让壳知道在哪里达到由keychain管理的SSH剂。确保.bashrc.profile来源。

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

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

不要在没有密码暴露你的SSH密钥。使用 SSH-cron的,它可让您使用SSH代理来安排任务。

所以,我也有类似的问题。我来到这里,看到各种答案,但这里有一些实验是怎么我得到了它与密码,ssh-agent和cron的sshkeys工作。

首先,我的ssh设置使用下面的脚本在我的bash初始化脚本。

# 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 /环境。下面是该脚本将是什么样子:

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的,你可以设置一个工作作为以各种方式普通用户。 如果您运行的crontab -e root用户身份它会建立一个root用户的cron。如果你作为运行的crontab -u戴维斯-e它会增加一个cron作业的用户ID戴维斯。同样,如果你运行的用户戴维斯和做的crontab -e这将创建运行作为用户标识戴维斯cron作业。这可以用下面的条目进行验证:

30 *  *   *   *     /usr/bin/whoami

这将寄给的WHOAMI每30分钟至用户戴维斯的结果。 (I做了crontabe -e作为用户戴维斯。)

如果你尝试看看使用了哪些键为用户戴维斯,做到这一点:

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

这将失败,邮寄日志会说

To: davis@xxxx.net
Subject: Cron <davis@hostyyy> /usr/bin/ssh-add -l

Could not open a connection to your authentication agent.

的解决方案是源上方对SSH剂将env脚本。以下是所得的cron项:

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

这将在10:55运行脚本。注意前导。在脚本。它说,在我的环境类似于在.bash初始化脚本运行此脚本。

昨天我有类似的问题...

我有一服务器,该服务器启动其他服务器上的一些行动计划作业,使用ssh ...问题是用户权限,和键...

在crontab中我不得不

* * * * * php /path/to/script/doSomeJob.php

和它根本没有工作(没有必须的权限)。 我tryed运行的cron为特定用户,其被连接到其它服务器

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

,但没有效果。

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

* * * * * cd /path/to/script/; php doSomeJob.php
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top