有没有可能使用rsync的sftp(没有SSHshell)?

Rsync通过SSH,每次都很好。

但是,试图rsync到只允许sftplogin但不sshlogin的主机,提供了以下错误:

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

协议版本不匹配 – 你的shell是干净的吗? (请参阅rsync手册页以获取解释)rsync错误:compat.c(171)处的协议不兼容(代码2)[sender = 3.0.6]

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

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

ssh remotehost /bin/true > out.dat 

然后看看out.dat。 如果一切工作正常,那么out.dat应该是一个零长度的文件。 如果您从rsync获得上述错误,那么您可能会发现out.dat包含一些文本或数据。 看看内容,并试图找出是什么产生它。 最常见的原因是错误地configuration了包含非交互式login输出语句的shell启动脚本(如.cshrc或.profile)。

在我的系统上尝试这个在out.dat中产生了以下内容:

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

正如我所想,主机不允许SSHlogin。

以下链接显示可以使用sshfs使用保险丝来完成此任务 – 但是它非常慢,不适合生产使用。

有没有机会获得rsync sftp的工作?

不幸的是不直接。 当以这种方式运行时, rsync需要一个干净的链接,允许它启动rsync的远程副本。

如果你有办法在主机上运行长时间的监听进程,你可以尝试手动启动rsync来监听非特权端口上的连接,但是大部分的技术都需要通过SSH进行正确的shell访问,而且它依赖于主机防火墙安排允许连接在您select的端口上(并且首先安装rsync的主机)。 尽pipe将rsync作为公共可寻址服务(而不是间接通过SSH或类似服务)运行通常不推荐用于非公开数据。

如果您的主机允许使用PHP或类似的脚本,并且没有将其locking,所以额外的进程不能被用户脚本执行,那么您可以尝试以这种方式在侦听模式下启动rsync。 如果你的端是可以连接的(你正在运行的SSH可以访问到外部世界),你可以尝试这个反过来 – 有一个脚本运行在服务器上的rsync,而不是侦听传入的连接,它联系你的本地服务和同步的方式。 这仍然依赖于实际安装在主机上的rsync,或者你可以上传一个工作副本,但是不具有以公开可寻址的方式运行rsync守护进程的安全隐患,并且通过未encryption的方式与之通信渠道。

如上所述,即使这样做可能会违反东道国的政策,也可能会让你开始行动。 你最好询问是否可以为该帐户启用一个完整的shell,并放弃该主机的rsync或放弃该主机,如果他们不这样做,则移动到别处。

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

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

没有rsync通过在另一端运行rsync工作,并与之通信,这意味着某种forms的shell访问是必需的。

另一种方法是启动rsync作为后台进程,并通过SSH隧道连接到它。