当前位置:  开发笔记 > 编程语言 > 正文

rsync'ing两个远程服务器之间的文件,得到错误说明远程服务器上找不到rsync命令

如何解决《rsync'ing两个远程服务器之间的文件,得到错误说明远程服务器上找不到rsync命令》经验,为你挑选了2个好方法。

我正在尝试在两个服务器之间rsync文件

rsync -avlzp /source user@server:/destination

但相反,我得到错误说明

bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(635) [sender=3.0.2]

但rsync的安装在两台服务器上.我究竟做错了什么?我也试过了

rsync -av -e "ssh -l ssh-user" /source server:/destination

结果相同.

我主要尝试使用rsync,以便它只复制差异,如果它们存在...

谢谢



1> crb..:

rsync可能在运行交互式shell时位于远程计算机上的路径中,但在通过ssh运行rsync时(使用非交互式shell)则不行.例如,.bashrc通常仅针对交互式shell运行,因此如果在那里定义了路径,则rsync --server在远程端运行时将不会对其进行解析.试试/ etc/profile.有关更多详细信息,请参阅bash(1).

您可以使用--rsync-path它指定远程计算机上rsync二进制文件的路径.



2> 小智..:

关于这个问题有很多很好的信息,包括上面的答案.但就我而言,我是源计算机和目标计算机的管理员,我希望了解发生了什么以及"正确"的配置选项会使这个问题消失.我没有完全成功,但似乎其他人可能会发现这些信息有用.

如上面的答案所述,rsync可能在运行交互式shell时位于远程计算机上的路径中,但在ssh运行rsync时则不行.正如Siddesh在http://siddesh-bg.blogspot.com/2009/02/rsync-command-not-found-error-even.html上所说,这可以通过从本地shell明确指定远程rsync的路径来解决. :

rsync -av --rsync-path=/usr/local/bin/rsync -e "ssh -l ssh-user" /source server:/destination

但作为管理员,我想解决问题,而不仅仅是解决它.OldSchool在https://groups.google.com/group/comp.unix.solaris/browse_thread/thread/0a06a4d382d752d8?pli=1上发布了有用的故障排除方法

他建议你在远程机器上找出为你运行的shell,然后在那里建立了什么PATH:

ssh user@host 'echo $SHELL' 
ssh user@host 'echo $PATH' 

Tom Feiner有一个很好的帖子为什么SSH远程命令获得更少的环境变量然后手动运行?讨论了SSH命令执行shell的环境建立.

OldSchool还指出"man sshd_config"提供了有关ssh会话如何获取环境的一些信息.可以将sshd_config设置"PermitUserEnvironment"设置为允许服务器端的用户〜/ .ssh/environment和AuthorizedKeysFile文件中的环境选项由sshd处理.默认值为no.

因此,使用默认的sshd_config设置,路径将由您的默认shell构建.如果您的ssh命令请求交互式会话(ssh user @ host),那么在远程服务器上,默认shell将执行交互式登录,这可能会导致您期望的PATH.但是如果要为rsync启动ssh会话(rsync -av --rsync-path =/usr/local/bin/rsync -e"ssh -l ssh-user"/ source server:/ destination),那么远程服务器会给出您是一个SSH命令执行shell,它是一个非交互式shell.在我的例子中,远程非交互式shell(bash)没有执行/ etc/profile,因为它只对交互式shell或带有--login选项的非交互式shell执行此操作.我可以像这样强迫它:

ssh user@host 'echo $PATH;source /etc/profile;echo $PATH' 

我还研究了Daniel Barrett和Richard Silverman的"SSH The Secure Shell"(O'Reilly 2001)并在/ etc/ssh/sshrc中设置了一个PATH,我希望它能使rsync可用于SSH命令执行shell,但是,/ etc/ssh/sshrc在调用用户shell或命令之前执行,显然它的环境不会传递给该shell或命令.

此时我将对rsync命令行选项感到满意,即:

rsync -av --rsync-path=/usr/local/bin/rsync -e "ssh -l ssh-user" /source server:/destination

因为我担心如果我更改sshd_config设置"PermitUserEnvironment",那么我可能会在我的服务器上进行安全审核失败.在我对组织的安全审核有更多经验后,我可能会重新审视这个问题.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有