是否有任何好的解决方案可以将文件从主机 A 移动到主机 C,使用主机 B 作为被动中间存储区域。
A->B->C
限制
- 主机 A 和主机 C 位于不同的网络,无法互相访问。A 和 C 之间无法打开隧道。
- 主机 A 和主机 C 均可运行和调度定期进程。
- 主机 B 仅提供存储区域,可以通过 SSH 从主机 A 和主机 C 进行访问。
- B 将是“被动的”,仅提供存储区域。
- 因此 A 将充当(B 上文件的)写入者,而 C 将充当(B 上文件的)读取者。
- 然后可以在主机 A 上删除已成功从主机 A 复制到主机 C(通过 B)的文件。
- 在有保证(包含文件校验和的收据?)文件成功登陆主机 C 之前,不应删除主机 A 上的任何文件。
- 特殊情况包括网络停机、磁盘已满、进程中断等管理
目的是定期将文件从 A 移动到 C,使用 B 作为中间存储区域。
我们可以假设所有主机都运行 Unix/Linux。首选工具:ssh/rsync/bash + 其他“标准”工具。
我正在考虑创建一个解决方案,使用一些围绕 rsync 的 bash 脚本分两步,并使用包含校验和的收据来检测文件何时完全成功移动。
有没有现成的解决方案?
答案1
我认为没有必要在 B 上存储任何东西,您只需使用它来代理 A 和 C 之间的连接,使用任何代理软件,如 ssh 端口转发或 socks。也许你甚至可以通过 B 进行路由/nat?
或者,既然你明确要求,你可以按照自己的方式使用 NFS/Samba 复制文件并使用各种方法验证完成情况。我想到的方法是创建一个共享文件,在两个系统之间传递“复制完成”或“可以删除”类型的消息。或者像你说的那样,使用 MD5 等...无论你怎么做,我都很确定这将是一项自定义工作。但并不困难。我怀疑是否存在以这种方式解决你的问题的方法。
答案2
斯文对你的问题的评论肯定是正确的做法。
你可以这样做:
从
A
SSH 到B
,在端口 5000 上创建隧道ssh someuser@B -L 5000:127.0.0.1:5000
从该 shell 开始
B
,通过 SSHC
创建第二个隧道,终止于C
的 ssh 服务器。ssh someuser@C -NL 5000:127.0.0.1:22
从第二个终端
A
,将文件直接 rsync 到C
rsync -avz -e "ssh -p 5000" --progress --remove-source-files /source/directory [email protected]:/destination/directory
甚至可能只需一个命令即可设置步骤 1 和 2 中的隧道,但在我进行的快速测试中,我无法做到这一点。它可能需要在B
和上设置 ssh 密钥C
。
如果你要自动化复制过程,那么你可能需要查看类似自动SSH通过服务为您设置和拆除隧道。或者您也可以通过 cron 来完成。