如何使用第三台机器在两台遥控器之间传输大型文件?

我需要通过慢速链接(1 Mbps)自动镜像两个unix机器中的大量(TB)文件。 这需要频繁地完成,但数据不会变化太大(delta传输不会使链路饱和)。

通常的解决scheme是rsync ,但还有一个额外的要求:从安全angular度来看,不希望源或目标机器具有(无密钥)ssh密钥或任何types的文件系统访问权限。 这两台机器之间的所有通信都应该通过第三台机器进行初始化(和调解)。

我已经在这里特别提出了一个关于rsync的单独问题。 我还有其他明显的解决scheme吗?

不完全是你问的。 但是,以防万一…

您可以轻松授权特定的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环境variables中find(有些从sshd手册页引用)换句话说,当有人使用该密钥login时,唯一将要运行的命令是validation脚本。你可以让它们运行或不运行,所以你的validation脚本可以做如下的事情:

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

而由于其他没有select,这个关键是不能做任何其他有害的事情。

更新:有一个现成的脚本 ,简化了这个configuration一点点。 – Mikko

我认为你最大的需求是只转移三angular洲,所以如果你不想要安全妥协/开销,我怀疑你将不得不保留第三个副本来做到这一点。

我一直在做这个(没有三angular洲!):

 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