是否可以通过 sftp 使用 rsync(没有 ssh shell)?

Tom*_*ner 69 ssh rsync sftp

Rsync over ssh,每次都很好用。

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

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

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

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

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

          ssh remotehost /bin/true > out.dat
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

有没有机会让 rsync sftp 工作?

Dav*_*ett 41

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

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

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

如上所述的乱搞可能违反主机政策,即使它完全有效,并且可能会让你被踢。您最好询问是否可以为该帐户启用完整的 shell,并且要么放弃该主机的 rsync,要么放弃该主机并移至其他地方(如果他们不这样做)。

  • 请注意,它不必是完整的外壳;它只需要允许带有正确参数的 rsync 命令运行。scponly 对此很有用。 (2认同)

xio*_*xox 24

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

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
Run Code Online (Sandbox Code Playgroud)

  • 虽然这篇文章没有回答这个问题,但它提供了一个有用的替代方案 (2认同)
  • [rclone](https://serverfault.com/a/1060521/232254) 是另一种选择,但具有更加自动化友好的 CLI。 (2认同)
  • 我测试了你的建议,但 rclone 使用 sftp 非常慢。lftp性能更好。 (2认同)

Kam*_*iel 22

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

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

omi*_*nug 14

rclone支持从/向 SFTP 网络共享同步以及挂载 SFTP 网络共享,而不是 Rsync 。

  1. 安装rclone
  2. rclone config并按照步骤添加新的远程端点配置。sftp在协议后端选择处输入。
  3. rclone sync local_path remote:remote_path文档)。这可能会导致数据丢失。

IMO, rclone 提供了比LFTP更加自动化友好的 CLI 。

我知道这并不能回答最初的问题,但可能是来到这里的一些人的需求。

  • **此命令可以删除目标上的文件。** 您可能希望使用 `rclone copy` 来代替,它更接近 rsync 的默认行为。 (3认同)

小智 6

有点晚了,但这是我使用 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
Run Code Online (Sandbox Code Playgroud)

  • 正如@David Spillett 在他对早期答案的评论中所说的那样 (http://serverfault.com/questions/135618/is-it-possible-to-use-rsync-over-sftp-without-an-ssh-shell/135649 #135649),这会起作用,但对 rsync 协议的使用有点低效。 (3认同)
  • 乔纳森,我认为您的解决方案是错误的。如果您挂载远程驱动器并执行 rsync 就像同步两个本地文件夹一样,则始终会在同步时传输所有内容,因为本地计算机上的 rsync 进程会计算远程文件的哈希值。这意味着整个文件都被传输了,而 rsync 的好处就失去了。编辑:啊,这个答案已经多次给出......复制:D (2认同)

Sté*_*hon 5

结合最佳选择

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

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

我还没有测试过它,但我已经成功地使用了所有这些功能,除了rrsync.

怎么做

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

然后你可以正常从客户端rsync。

如果您需要更多详细信息

限制 SSH 访问 rsync | 盖·鲁腾伯格

超越上述链接的一步

该页面末尾的命令可以缩短。在~/.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/
Run Code Online (Sandbox Code Playgroud)

变成

rsync -av user@remote: etc2/
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这与将 rsync 与 SFTP 服务器一起使用没有任何关系,这是关于配置 OpenSSH 服务器以允许运行 `rsync`,避开 SFTP 方面。如果您看到其他人的 SFTP 服务器您无法控制,则此答案无法解决问题。 (5认同)