rsync代码可以运行,但无法在cron中运行

9

我有一个网页服务器(odin)和一个备份服务器(jofur)。在jofur上,我可以运行以下代码通过密钥验证从odin同步我的网页目录到jofur:

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

如果我在命令行中输入这个命令,所有的rsync都可以完美同步:
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个字节)[接收器] rsync错误:在io.c(605)[接收器=3.0.9]处出现未解释的错误(代码255)

我不确定这个错误的含义。我不想盲目地操作权限,因为我不想留下任何后门。有什么建议吗?

8个回答

2
很难确定cron是否在使用错误的rsync二进制文件,或者rsync需要一些未在cron中设置的变量。请按照下面所示设置stdout/stderr,并传递日志文件的输出。
此外,请尝试从命令行执行“which 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

嗨,Kevin -"which rsync" 返回:/usr/bin/rsync但是当我将其添加到我的cron命令的末尾时:> /tmp/cron_output.log 2>&1即使设置为每分钟运行,crontab也无法运行。我知道这是因为当我将其设置为每分钟运行(* * * * * *)时,它会抛出错误邮件,但如果我放置您的代码,则不会抛出任何错误,也不会更新输出日志。 - peteyreplies
嗨,凯文 - 抱歉耽搁了。这是cron_output.log的内容:/bin/sh: 1: /home/user/scripts/cron_rsync.sh: Permission denied - peteyreplies
嗨,凯文 - 我错过了感叹号。一旦我加上它,日志文件就会显示/home/user/scripts/cron_rsync.sh: 2: /home/user/scripts/cron_rsync.sh: /usr/sbin/rsync: not found. 确实,在/usr/sbin/下没有rsync,但在/usr/bin下有,所以我修改了cron_rsync.sh的内容为#!/bin/sh /usr/bin/rsync -avz -e ssh backups@odin.mydomain.net:/home/backups /home/user/mydomain. 现在日志显示receiving incremental file list sent 23 bytes received 2368 bytes 4782.00 bytes/sec total size is 497303674 speedup is 207989.83. 这是否意味着它正在工作? - peteyreplies
从命令行执行/home/user/scripts/cron_rsync.sh。 - souser
我已经完成了,它运行得非常完美:`user@jofur: /home/user/scripts/cron_rsync.sh receiving incremental file list backups/www/ backups/www/www-2013-01-11-06-51.tgzsent 70 bytes received 12598479 bytes 3599585.43 bytes/sec total size is 521668061 speedup is 41.41` - peteyreplies
显示剩余3条评论

2

我遇到了类似的问题。我的HOME目录被加密了。

如果你的用户已登录,known_hosts文件就可以正常使用。

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


3
这不是一个答案,更像是一条评论。你的解决方案在哪里? - Steve Robbins

1

使用正确的密钥环解决了我的问题。将以下行添加到您的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并没有提供很多调试输出。帮助我识别问题的是将一个虚拟的scp命令(更详细)放在我的crontab中。用于故障排除的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复制到您的本地计算机。所有日志(标准输出和标准错误)都写入/home/myuser/odin/dummy.txt.log。检查这些日志以查看错误的确切来源。

参考:上述故障排除方法引导我找到了解决方案:https://unix.stackexchange.com/a/332353/395749


1

我和你一样遇到了同样的错误。

最终我发现用户主目录是一个“挂载点”,当登录时,它会改变。

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

因此,我登录并“cd /”,然后执行以下操作:

```

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

```

可能会失败,因为您需要检查${HOME}是否有写入权限,如果没有,请尝试使用sudo或将可写权限添加到${HOME}。

之后,一切都正常了。


0

我采取了几个步骤使其正常工作。

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

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

  3. 添加(记得使用 which)ssh-agent && [your ssh-command] 以便它可以通过 ssh 连接。

  4. 当在此时身份验证仍然失败时,请尝试生成无密码 ssh-key。这样,您就可以跳过密码提示。

为了调试,在 rsync 的 ssh 命令中添加 -vvv 很有用。它可以清楚地显示出问题所在。



0

我通过与服务器管理员沟通解决了这个问题。以下是他们告诉我的内容:

为了提高安全性和性能,我们使用1H(Hive),它利用用户的chrooted环境。 库和二进制文件应复制到chrooted环境中以使它们可访问。

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


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

本地

在你的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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接