我有一个cronjob:
0 9 * * * rsync -a mydir remote_machine:
我用'crontab -e'安装了这个。 我有一个ssh代理程序运行,当我执行rsync命令本身,它工作不W / o任何用户交互或密码input,但cronjob失败,出现以下消息:
Date: Wed, 9 Dec 2009 11:11:00 -0600 (CST) From: Cron Daemon <me@my_machine.my_domain> To: me@my_machine.my_domain Subject: Cron <me@my_machine> rsync -a /home/me/mydir remote_machine: Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,gssapi-with-mic,password). rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-35.2/rsync/io.c(452) [sender=2.6.9]
为什么这不工作? 我知道cronjobs运行w /我作为用户(如果我运行'* * * * * touch / tmp / a'我拥有该文件),所以我假设rsynclogin作为我使用我的私钥…
你的cron会话shell没有ssh代理的知识,所以不能和它交谈。
代理启动后,您可以将代理所需的信息放在cron会话的某个位置。
例:
AGENT="ssh-agent -s" if [ ! -d $HOME/.ssh/agent ]; then mkdir -p $HOME/.ssh/agent fi # # Start an agent if there isn't one running already. # pid=`ps -u$LOGNAME | grep ssh-age | awk '{print $1}'` if [ -z "$pid" ]; then $AGENT | grep -v echo > $HOME/.ssh/agent/$HOST & pid=$! sleep 1 # Let it fork and stuff fi
然后将您的密钥添加到代理。
ssh-add $HOME/.ssh/id_dsa
现在你的cron工作应该在尝试使用ssh之前完成这个工作:
# # Get our parent to pick up the required SSH env vars. # . $HOME/.ssh/agent/$HOST
…之后,ssh会话应该正常进行。
钥匙扣是你需要的! 只需安装它,并添加以下代码在您的.bash_profile
(或等效):
if [ -x /usr/bin/keychain ]; then /usr/bin/keychain --quiet --clear $HOME/.ssh/id_rsa fi
对于config.fish( 2 ):
if not status --is-interactive keychain --eval --quiet --quick $HOME/.ssh/id_rsa end
然后在脚本中使用下面的代码来加载ssh-agent环境variables:
. ~/.keychain/`/bin/hostname`-sh
对于鱼类:
source $HOME/.keychain/(hostname)-fish
如果你的钥匙有密码,钥匙串会问你一次(有效的,直到你重新启动机器或杀死SSH代理)。
注意:钥匙串还会生成csh
和fish
shell的代码,所以只需将后缀“-sh”replace为“-csh”或“-fish”即可。
我没有足够的代表投票第一个答案,但它解决了我所遇到的问题。 在ssh-agent方面,你可能已经有一个运行。 这里有一个脚本来从环境中提取SSH_AGENT_PID&SSH_AUTH_SOCK,没有任何额外的东西来保存启动ssh-agent。 (假设你有perl)
把下面的脚本。 (例如findagent.pl)
并在您的cron脚本中添加行:
eval`{path to script} / findagent.pl`
\#!/usr/bin/perl -w use strict; my $agents = `ls -tr /tmp/ssh-*/*`; my @agents; (@agents) = split/\n/,$agents; my $sshpid = `ps aux|grep ssh-agent|grep -v grep|awk '{print \$2}'|head -1`; chomp($sshpid); my @parts; for (@agents) { chomp($_); if (!$_) { next; } my $agentfile = $_; (@parts) = split/\./,$agentfile; my $masterpid = `ps aux|grep $parts[1]|grep enlightenment`; if ($agentfile =~ m/$parts[1]/) { my $line1 = "SSH_AUTH_SOCK=" . $agentfile . '; export SSH_AUTH_SOCK'; my $line2 = 'SSH_AGENT_PID=' . $sshpid . '; export SSH_AGENT_PID;'; my $line3 = 'echo Agent pid ' . $sshpid . ';'; print("$line1\n$line2\n$line3\n"); last; } else { next; } }
我想你正在使用基于密钥的身份validation来validation自己与远程机器。 尝试下面的行:
rsync -av --delete -e "ssh -i .ssh/id_rsa" mydir [email protected]:~/backupDir
其中.ssh / id_rsa是私钥的path。 这是我用来做我的备份的确切的线路,它总是适合我。
最好的祝愿,
法比安
作为一种替代方法,我使用脚本代替使用ssh代理,在调用rsync之前,先导出RSYNC_RSH =“ssh -i /home/user/.ssh/id_rsa”,然后取消设置SSH_AGENT_PID,取消设置SSH_AUTH_SOCK。 通过将它放在RSYNC_RSH而不是使用'-e …',可以很容易地调整正在使用的基于主机的id文件。
希望这有助于,乙