我需要通过慢速链接(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