rsync代码将运行,但不会在cron中运行

时间:2012-12-28 17:34:06

标签: cron backup rsync

我有一个Web服务器(odin)和一个备份服务器(jofur)。在jofur上,我可以运行以下代码来将我的web目录(通过密钥认证)从odin发送到jofur:

rsync -avz -e ssh backups@odin.mydomain.net:/home/backups /home/myuser/odin

如果我将其输入命令行,那么所有内容都完美无缺:

myuser@jofur:~$ rsync -avz -e ssh backups@odin.mydomain.net:/home/backups /home/myuser/odin

receiving incremental file list

sent 23 bytes  received 1921 bytes  1296.00 bytes/sec
total size is 349557271  speedup is 179813.41

我希望每天早上都运行,所以我编辑了我的crontab来阅读:

0 4 * * * rsync -avz -e ssh backups@odin.mydomain.net:/home/backups /home/myuser/odin

这不起作用。以下消息存放在/ var / mail / myuser:

  

无法创建目录'/home/myuser/.ssh'。   主机密钥验证失败。   rsync:连接意外关闭(到目前为止收到0个字节)[Receiver]   rsync错误:io.c上的无法解释的错误(代码255)(605)[Receiver = 3.0.9]

我不确定这个错误意味着什么。我担心盲目地使用权限,因为我不想让任何后门打开。有什么建议?

8 个答案:

答案 0 :(得分:2)

很难判断cron是否使用了错误的rsync二进制文件,或者rsync是否需要一些未在cron中设置的变量。请设置stdout / stderr,如下所示,并传递日志文件的输出

另外,尝试做一个"其中rsync"从命令行;这将告诉您从命令行使用哪个rsync。

0 4 * * * rsync -avz -e ssh backups@odin.mydomain.net:/home/backups /home/myuser/odin > /tmp/cron_output.log 2>&1

编辑:

是否可以创建名为SOME_DIR / cron_job_rsync.sh的shell脚本,其中包含以下内容。确保设置执行位。

#!/bin/sh
/usr/sbin/rsync -avz -e ssh backups@odin.mydomain.net:/home/backups /home/myuser/odin

修改cronjob,如下所示

0 4 * * * SOME_DIR/cron_job_rsync.sh >/tmp/cron_output.log 2>&1

答案 1 :(得分:1)

我有类似的问题。我的HOME目录已加密。

如果您的用户已登录,则可以使用known_hosts。

但是当它是cron时,cron使用正确的用户但是它无法访问你的$ HOME /〜/ .ssh目录,因为它是加密的: - (

答案 2 :(得分:1)

我得到了和你一样的错误。

我终于发现用户主目录是一个'挂载点',登录后就更改了。

您可以使用shell命令'mount'来检查您是否使用相同的主目录。

所以,我登录并'cd /',然后执行

```

cp -ar ${HOME}/.ssh /tmp/
sudo umount ${HOME}
mv /tmp/.ssh ${HOME}

```

可能会失败,因为如果你有权写,你需要检查$ {HOME},如果没有,请尝试sudo或添加写入$ {HOME}。

在那之后,一切都很好。

答案 3 :(得分:0)

答案 4 :(得分:0)

我通过与服务器的管理员通信来解决此问题。这是他们告诉我的:

  

对于高级安全性和性能,我们使用1H(Hive)   为用户使用chrooted环境。图书馆和二进制文件   应该被复制到chrooted环境中以使它们可以访问。

他们给我发了一封跟进电子邮件,告诉我已经安装了“Relevent”软件包。那时,问题得到了解决。不幸的是,我没有收到他们的任何其他信息。主持人是Arvixe,但我猜测任何使用1H(Hive)的人都会遇到类似的问题。希望这个答案会有所帮助。

答案 5 :(得分:0)

rrsync脚本与专用ssh密钥一起使用,如下所示:

远程服务器

mkdir ~/bin
gunzip /usr/share/doc/rsync/scripts/rrsync.gz -c > ~/bin/rrsync
chmod +x ~/bin/rrsync

本地电脑

ssh-keygen -f ~/.ssh/id_remote_backup -C "Automated remote backup"      #NO passphrase
scp ~/.ssh/id_remote_backup.pub devel@10.10.10.83:/home/devel/.ssh

远程计算机

cat id_remote_backup.pub >> authorized_keys

在新添加的行前面加上以下

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding

结果看起来像

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...vp Automated remote backup

LOCAL

使用crontab权限加载x以下脚本:

#!/bin/sh
echo ""
echo ""
echo "CRON:" `date`
set -xv
rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -avzP devel@10.10.10.83:/ /home/user/servidor 

来源:http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/

答案 6 :(得分:0)

我做了几个步骤让它发挥作用。

  1. 检查您的路径。对于您将使用的每个命令,请检查which [command]并使用crontab的完整路径

  2. 以您要运行它的用户身份打开crontab,以便它可以访问该用户ssh-key

  3. 添加(记住用户哪个)ssh-agent && [your ssh-command]以便它可以通过ssh连接。

  4. 此时身份验证仍然失败。尝试生成无密码的ssh密钥。这样您就可以跳过密码提示。

  5. 对于调试,将-vvv添加到rsync中的ssh命令很有用。它清楚地表明出了什么问题。

答案 7 :(得分:0)

使用正确的钥匙扣为我解决了这个问题。将以下行添加到您的crontab中:

SSH_AUTH_SOCK=/run/user/1000/keyring/ssh

现在,您的crontab(通过从终端调用crontab -e进行编辑)现在应该如下所示:

SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
0 4 * * * rsync -avz backups@odin.mydomain.net:/home/backups /home/myuser/odin

背景:事实证明,某些Linux发行版使用密钥环来保护您的公共-私有密钥对-因此,密钥对受到密码保护而不会引起您的注意。因此,rsync无法打开您的ssh密钥进行身份验证。

请注意,我也省略了-e ssh;我认为这里没有必要。

进一步的疑难解答: rsync没有提供很多调试输出。帮助我确定问题的原因是在我的crontab中放置了一个虚拟的scp命令,该命令更为冗长。用于故障排除的crontab条目可能类似于:

* * * * * scp -v backups@odin.mydomain.net:/home/backups/dummy.txt /home/myuser/odin/dummy.txt >> /home/myuser/odin/dummy.txt.log 2>&1

以上命令将每分钟运行一次(非常适合开发),它将文件/home/backups/dummy.txt复制到本地计算机。所有日志(stdout和stderr)都写入/home/myuser/odin/dummy.txt.log。检查这些日志以查看错误的确切来源。

参考:上面说明的故障排除方法将我带到了解决方案:https://unix.stackexchange.com/a/332353/395749