通过 crontab 使用 ssh 代理执行 ssh 上的 rsync 命令

通过 crontab 使用 ssh 代理执行 ssh 上的 rsync 命令

我有一个计划任务:

0 9 * * * rsync -a mydir remote_machine:

我使用“crontab -e”安装了它。我有一个 ssh-agent 正在运行,当我执行 rsync 命令本身时,它可以在没有任何用户交互或密码输入的情况下工作,但 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 以我作为用户运行(如果我运行 '* * * * * touch /tmp/a',我拥有该文件)所以我假设 rsync 是使用我的私钥以我的身份登录的...

答案1

您的 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 会话应该可以正常进行。

答案2

钥匙链.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 环境变量:

. ~/.keychain/`/bin/hostname`-sh

对于鱼类:

source $HOME/.keychain/(hostname)-fish

如果您的密钥有密码,钥匙串将会询问您一次(有效,直到您重新启动机器或终止 ssh-agent)。

注意:keychain 还会生成代码cshfishshell,因此只需将后缀“-sh”替换为“-csh”或“-fish”即可。

答案3

我假设您正在使用基于密钥的身份验证来向远程计算机验证您的身份。请尝试以下行:

rsync -av --delete -e "ssh -i .ssh/id_rsa" mydir [email protected]:~/backupDir

其中 .ssh/id_rsa 是您的私钥路径。这正是我用来进行备份的确切行,它对我来说总是很有效。

祝一切顺利,
法比安

答案4

作为替代方案,我没有使用 ssh 代理,而是让我的脚本在调用 rsync 之前执行 export RSYNC_RSH="ssh -i /home/user/.ssh/id_rsa" unset SSH_AGENT_PID unset SSH_AUTH_SOCK。通过将其放入 RSYNC_RSH 而不是使用“-e ...”,可以轻松根据主机调整正在使用的 id 文件。

希望这有帮助,B

相关内容