我正在尝试使用
在两台服务器之间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,以便它只复制差异(如果它们存在...)
由于
答案 0 :(得分:15)
rsync可能在运行交互式shell时位于远程计算机上的路径中,但在通过ssh运行rsync时(使用非交互式shell)则不行。例如,.bashrc通常仅针对交互式shell运行,因此如果在那里定义了路径,则在远程端运行rsync --server
时将不会对其进行解析。试试/ etc / profile。有关详细信息,请参阅bash(1)。
您可以使用--rsync-path
指定远程计算机上rsync二进制文件的路径。
答案 1 :(得分:7)
关于这个问题有很多很好的信息,包括上面的答案。但就我而言,我是源计算机和目标计算机的管理员,我希望了解发生了什么以及“正确”的配置选项会使这个问题消失。我没有完全成功,但似乎其他人可能会发现这些信息有用。
如上面的答案所述,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在Why does an SSH remote command get fewer environment variables then when run manually?发表了一篇很好的文章,讨论了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”,那么我可能会在我的服务器上进行安全审核失败。在我对组织的安全审核有更多经验之后,我可能会重新审视这个问题。