为什么SSH从命令行执行时从crontab中,但succedes失败?
题
我有一个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
,并提供可source
d壳脚本和当前壳连接到这个特定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