是否可以在sftp上使用rsync(没有ssh shell)?


60

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

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

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

协议版本不匹配-您的外壳干净吗?(有关解释,请参见rsync手册页。)rsync错误:compat.c(171)[sender = 3.0.6]上的协议不兼容(代码2)。

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

此消息通常是由您的启动脚本或远程Shell工具在rsync用于其传输的流上产生不必要的垃圾引起的。诊断此问题的方法是像这样运行远程Shell:

          ssh remotehost /bin/true > out.dat

然后看看out.dat。如果一切正常,则out.dat应该是零长度的文件。如果从rsync收到上述错误,则可能会发现out.dat包含一些文本或数据。查看内容并尝试找出产生的内容。最常见的原因是配置错误的shell启动脚本(例如.cshrc或.profile)包含了非交互式登录的输出语句。

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

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

如我所料,主机不允许ssh登录。

以下链接显示可以通过使用带有sshfs的保险丝来完成此任务-但是它非常慢,并且不适合生产使用。

是否有可能使rsync sftp正常工作?


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

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

您可以尝试csynccsync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csync看到此答案
nachtigall 2014年

6
最终,我用lftp做到了:lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall 2014年

@nachtigall您知道如何将lftp与多个输入文件/文件和目录列表一起使用吗?
bortran '16

Answers:


39

不幸的是不直接。rsync需要带有外壳的干净链接,以rsync这种方式运行时将允许外壳启动的远程副本。

如果您可以通过某种方式在主机上运行长期的侦听进程,则可以尝试手动启动rsync来侦听非特权端口上的连接,但是大多数方法也需要通过SSH进行适当的Shell访问,并且它依赖于主机防火墙安排允许您选择的端口上的连接(以及首先安装了rsync的主机)。但是,一般不建议将rsync作为公共可寻址服务运行(而不是通过SSH或类似方式间接运行)作为非公共数据。

如果主机允许使用PHP或类似格式的脚本,并且没有将其锁定exec,则用户脚本无法编辑额外的进程,那么您可以尝试以这种方式在侦听模式下启动rsync。如果您的终端是可连接的(您正在运行SSH可以被外界访问),则可以反向尝试-让脚本在服务器上运行rsync,而不是侦听传入的连接,而是让它与您的本地服务联系并以这种方式同步。这仍然依赖于不是给定主机上实际安装的rsync,或者您可以上载工作副本,但不具有以可公开寻址的方式运行rsync守护程序并通过未加密的方式与之对话的安全隐患。渠道。

如上所述,即使遇到了麻烦,也可能违反主机策略,甚至可能使您开始工作。您最好询问是否可以为该帐户启用完整外壳程序,或者放弃该主机的rsync或放弃该主机,然后移至其他位置(如果他们不这样做)。


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

19

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


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

感谢您添加一些细节David。这就是我一直在考虑的效率限制,只是没有很好地阐明它们:)
Kamil Kisiel 2010年

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

10

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

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

1
尽管这篇文章没有回答问题,但它提供了一个有用的替代方法
Dmitri Chubarov,

5

有点晚了,但是这是我使用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

3
就像@David Spillett在他对较早答案的评论(serverfault.com/questions/135618/…)中所说的那样,这虽然可行,但对rsync协议的使用有点低效。
埃文·安德森

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


2

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


这个答案太短了以至于不能完全有用,但是如果服务器端不允许外壳程序访问,但可以允许(1)本地同步的rsync服务器(出于安全考虑,不能从外部进行监听),以及(2)ssh隧道,则在原则上,可以通过authorized_keys允许特定隧道运行的规则登录服务器sleep 86400。然后客户端可以rsync通过隧道。
斯蒂芬·古里雄

2

结合所有优点的选项

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

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

我尚未对其进行测试,但是我已经成功使用了除之外的所有这些功能rrsync

怎么做

  • 在本地创建密钥ssh-keygen(openSSH功能)
  • 只允许使用该特定密钥登录,并在服务器的条目中使用该项~/.ssh/authorized_keys(openSSH功能)
  • 将此密钥与特定命令关联,并使用~/.ssh/authorized_keys(openSSH功能)将rrsync通过rsync分发的脚本作为命令,例如command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

然后,您可以正常地从客户端进行rsync。

如果您需要更多详细信息

限制对rsync的SSH访问| 盖·鲁滕伯格

超出上面链接的一步

该页面末尾的命令可以缩短。在~/.ssh/config创建一个这样的节:

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

然后您从客户端的rsync命令

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

变成

rsync -av user@remote: etc2/

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

你是对的。我可能实际上是为了回答另一个问题而写的,却误将其张贴在这里。我正在考虑在这里删除答案。
斯蒂芬·古里康
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.