如何使用第三台机器在两个远程设备之间传输大文件?

如何使用第三台机器在两个远程设备之间传输大文件?

我需要通过慢速链接(1 Mbps)在两台 unix 机器上自动镜像大量(TB)文件。这需要经常执行,但数据不会发生太多变化(增量传输不会使链接饱和)。

通常的解决方案是rsync,但还有一个额外的要求:从安全角度来看,源计算机或目标计算机之间最好不要有(无密钥的) ssh 密钥,或任何类型的文件系统访问权限。因此,两台计算机之间的所有通信都应通过第三台计算机进行初始化(和调解)。

我特别问了一个关于 rsync 的问题这里. 我还遗漏了其他明显的解决方案吗?

答案1

这不是你真正想问的。但以防万一……

你可以很容易地授权一个特定的 ssh 密钥只允许在远程机器上运行某些命令(这​​类似于 gitosis 和 gitolite 以及可能任何其他安全的git-over-ssh 实现可以正常工作)。长话短说,将这些选项添加到目标用户的authorized_keys文件中:

  • command="/path/to/validation/script"
  • no-port-forwarding
  • no-X11-forwarding
  • no-agent-forwarding
  • no-pty

该文件最终应如下所示:

command="/path/to/validation/script",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2E.....

这些no-*选项是不言自明的。

command=选项运行“强制”命令“忽略客户端提供的任何命令”。客户端最初提供的命令在SSH_ORIGINAL_COMMAND环境变量中可用”(部分引自sshd手册页)。换句话说,当有人使用该密钥登录时,将运行的唯一命令是验证脚本。是否允许他们运行它取决于您。因此,您的验证脚本可以执行以下操作:

#!/bin/bash
if [[ "$SSH_ORIGINAL_COMMAND" == "rsync --server -vtr --delete /source/path/ /destination/path/" ]]; then
     $SSH_ORIGINAL_COMMAND
fi

并且由于其他no-选项的存在,这个键不允许做任何其他过于有害的事情。

更新:有一个现成的脚本这稍微简化了这个配置。--米科

答案2

我认为您最大的需求是仅传输增量,因此,如果您不想损害安全性/增加开销,我认为您必须保留第三份副本才能做到这一点。

我一直这样做(没有增量!):

dir=`mktemp -d` && cd $dir \
&& rsync -avz user1@host1:~/source . \
&& rsync -avz . user2@host2:~/dest \
&& rm -rvf $dir

你需要

rsync -avz user1@host1:~/source mirror \
&& rsync -avz mirror user2@host2:~/dest \

--delete也可能想要

相关内容