通过 ssh 进行 Rsync 每次都运行良好。
但是,尝试 rsync 到仅允许 sftp 登录但不允许 ssh 登录的主机时,会出现以下错误:
rsync -av /源 ssh 用户@远程主机:/目标/
协议版本不匹配 —— 你的 shell 干净吗?(请参阅 rsync 手册页了解解释)rsync 错误:协议不兼容(代码 2)在 compat.c(171) [sender=3.0.6]
以下是 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 的 fuse 完成此任务 - 但是它非常慢,不适合生产使用。
rsync sftp 有可能正常工作吗?
答案1
不幸的是,不是直接的。rsync
需要与 shell 建立一个干净的链接,以便它rsync
在以这种方式运行时启动的远程副本。
如果您有某种方式可以在主机上运行长期监听进程,则可以尝试启动 rsync 手动监听非特权端口上的连接,但大多数实现此目的的技术也需要通过 SSH 进行适当的 shell 访问,并且它依赖于主机防火墙安排允许在您选择的端口上进行连接(并且主机首先安装了 rsync)。不过,对于非公开数据,通常不建议将 rsync 作为可公开寻址的服务运行(而不是通过 SSH 或类似方式间接运行)。
如果您的主机允许使用 PHP 或类似脚本,并且没有将其锁定,以便exec
用户脚本无法编辑额外的进程,那么您可以尝试以这种方式在监听模式下启动 rsync。如果您的终端是可连接的(您正在运行可供外界访问的 SSH),您可以反向尝试此操作 - 让脚本在服务器上运行 rsync,但不是监听传入连接,而是让它联系您的本地服务并以此方式同步。这仍然依赖于 rsync 是否实际安装在主机上(这不是给定的),或者您是否可以上传工作副本,但不具有以可公开寻址的方式运行 rsync 守护程序并通过未加密的通道与其通信的安全隐患。
如上所述,即使这样做有效,也可能违反主机政策,并可能导致您被踢出。您最好询问是否可以为该帐户启用完整 shell,然后放弃该主机的 rsync,或者放弃该主机并移至其他地方(如果他们不这样做)。
答案2
另一种使用 rsync 的方法是使用 lftp(可以连接到 sftp)并使用 mirror 命令。例如,可以执行
lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
答案3
理论上是的。你可以在本地机器上挂载远程文件系统使用 FUSE。然后,您可以在挂载目录和本地目录之间运行 rsync 的本地副本。我个人没有尝试过,但理论上应该可行。这可能比通过 SSH 执行 rsync 效率低很多,因为它需要传输每个文件的至少一部分来执行比较。
答案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