通过ssh进行Rsync,每次都能很好地工作。

但是,尝试将rsync到仅允许sftp登录而不允许ssh登录的主机时,会出现以下错误:


rsync -av / source ssh user @ remotehost:/ target /

协议版本不匹配-您的
shell干净吗? (有关说明,请参见rsync手册页
)rsync错误:
协议不兼容(代码2),位于
compat.c(171)[sender = 3.0.6]


这是rsync手册页中的相关部分:


该消息通常是由您的启动脚本或
远程Shell设施产生的
rsync正在对其传输使用的流上不必要的垃圾。诊断此问题的方法是像这样运行您的
远程外壳程序:

          ssh remotehost /bin/true > out.dat


然后查看out.dat。如果一切正常,那么
out.dat应该是零长度的文件。包含一些文本或
数据。查看其中的内容,并尝试
计算出产生的内容。
最常见的原因是配置错误的shell启动脚本(例如.cshrc或.profile的
)包含了非交互式登录的
输出语句。


在我的系统上进行尝试会在out.dat中产生以下内容:


ssh-dummy-shell:不允许使用命令。


我认为主机不允许SSH登录。非常慢,不适合生产使用。

是否有机会让rsync sftp正常工作?

评论

lftp可以解决问题。我将使用-R开关将本地同步到远程

您知道服务器上命令的限制方式吗?如果是通过在sshd_config中设置ForceCommand,则查看是否可以修改指向的文件。或者,如果它是由authorized_keys中的命令设置的,那么也许您可以通过sshfs访问authorized_keys并进行更改?

您可以尝试csync:csync / home / csync sftp://csync@krikkit.galaxy.site:2222 / home / csync请参阅此答案。

最终,我用lftp做到了:lftp -e“ mirror -eRv / local / dir / / remote / dir; quit;” sftp:// user @ server:port

@nachtigall您知道如何将lftp与多个输入文件/文件和目录列表结合使用吗?

#1 楼

不幸的是不直接。 rsync需要带有外壳的干净链接,以这种方式运行时,将允许它启动rsync的远程副本。尝试手动启动rsync手动侦听非特权端口上的连接,但是大多数这样做的技术也需要通过SSH进行正确的外壳程序访问,并且它依赖于主机防火墙的安排,使连接进入您选择的端口(主机具有rsync首先安装)。但是,一般建议不要将rsync作为可公开访问的服务(而不是通过SSH或类似方式间接运行)用于非公开数据。关闭,这样用户脚本就无法再执行其他进程,那么您可以尝试以这种方式在侦听模式下启动rsync。如果您的终端是可连接的(您正在运行SSH可以被外界访问),则可以反向尝试-让脚本在服务器上运行rsync,但与其监听本地连接,不如直接与本地服务联系并以这种方式同步。这仍然依赖于rsync实际安装在不是给定主机上的rsync,或者您可以上载工作副本,但是不具有以可公开寻址的方式运行rsync守护程序并通过未加密的方式与其对话的安全隐患频道。

尽管如此,按上述步骤进行访问可能会违反主机策略,并且可能会使您开始。您最好询问是否可以为该帐户启用完整外壳程序,或者放弃该主机的rsync或放弃该主机,然后移至其他位置(如果他们不这样做)。

评论


请注意,它不一定是完整的外壳。它只需要允许带有适当参数的rsync命令运行即可。对此很有帮助。

– sciurus
2011-09-20 14:15

#2 楼

从理论上讲,是的。您可以使用FUSE将远程文件系统挂载到本地计算机上。然后,您可以在已安装目录和本地目录之间运行rsync的本地副本。我没有亲自尝试过,但是理论上应该可以。通过SSH执行rsync可能会效率低很多,因为它将需要传输每个文件的至少一部分来执行比较。

评论


当时间戳和大小比较足以决定需要发送什么时,该方法应该起作用。一旦需要校验和,就将通过该行读取整个远程文件以及发送的更新,因此请确保您已设置rsync的选项,以使它对每个文件都执行全部或全部操作(不使用--ignore-次或--checksum并指定--whole-file可能就足够了。诸如--link-dest之类的某些选项极不可能以这种方式正常工作(或根本无法正常工作)。

– David Spillett
2010-4-26的1:11



感谢您添加一些细节David。这就是我所想到的效率限制,只是没有很好地阐明它们:)

–卡米尔·基西尔(Kamil Kisiel)
2010年4月26日在17:42

这是一个有局限性的解决方法,是的,但是如果没有办法调用“适当的” rsync就足够了

– Valery Lourie
14年7月13日在9:15

#3 楼

使用rsync的替代方法是改为使用lftp(可以连接到sftp)并使用mirror命令。例如,一个人可以做

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit


评论


虽然这篇文章没有回答问题,但提供了一个有用的替代方法

– Dmitri Chubarov
19年4月4日在10:52

#4 楼

有点晚了,但这是我使用sshfs的方法

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt


评论


就像@David Spillett在他对较早答案的评论(serverfault.com/questions/135618/…)中说的那样,这可以奏效,但是对rsync协议的使用效率较低。

–埃文·安德森(Evan Anderson)
2011-09-20 12:41

乔纳森,我认为您的解决方案是错误的。如果您像安装两个本地文件夹一样安装远程驱动器并执行rsync,则由于本地计算机上的rsync进程会计算远程文件的哈希值,因此在同步时始终会传输所有内容。这意味着整个文件将被传输,而rsync的好处将丢失。编辑:啊,这个答案已经给出了几次... sry复制:D

– Thekwasti
2012年3月22日在10:20

#5 楼

结合了所有优点的选项

具有以下其他答案所没有的优点:


完全受益于SSH(安全)
完全受益于rsync(带宽有效的协议,所有rsync选项,例如带宽限制)
实际上非常有效(与sshfs有时可以节省时间,但在实践中仍然很慢)
不需要任意shell命令服务器端
不需要服务器允许ssh隧道
不需要服务器运行rsync守护程序

我还没有测试它,但是我已经成功使用了rrsync以外的所有功能。

操作方法


使用ssh-keygen在本地创建密钥(openSSH功能)
仅允许使用该特定密钥,在服务器的~/.ssh/authorized_keys(openSSH功能)中有一个条目79q


然后可以从客户端正常进行rsync。 Guy Rutenberg

超出上面链接的一步

该页面末尾的命令可以缩短。在~/.ssh/authorized_keys中创建一个如下所示的节:

rrsync

,然后从客户端执行rsync命令br />
rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/


评论


不幸的是,这与在SFTP服务器上使用rsync没有任何关系,这是关于配置OpenSSH服务器以允许运行rsync,而避开了SFTP方面。如果您看到别人无法控制的SFTP服务器,则此答案无法解决问题。

–马耳他
18年9月7日在6:14

你是对的。我可能实际上是为了回答另一个问题而写的,却误将其张贴在这里。我正在考虑在这里删除答案。

–StéphaneGourichon
18-09-7在15:31



#6 楼

否。rsync通过在另一侧运行rsync并与之通信来工作,这意味着需要某种形式的shell访问。

#7 楼

另一种选择是将rsync作为守护程序启动,并通过SSH隧道连接到它。

评论


这个答案太短了,不能完全起到帮助作用,但是如果服务器端不能允许外壳程序访问,但是可以允许(1)本地监听的rsync服务器(出于安全原因,无法从外部进行监听),以及(2)ssh隧道,则在原则上,可以通过authorized_keys中的规则登录到服务器,该规则允许特定的隧道并运行,例如睡眠86400。然后客户端可以通过隧道进行rsync。

–StéphaneGourichon
18年1月8日在9:46