使用中间存储区域在主机之间移动文件

使用中间存储区域在主机之间移动文件

是否有任何好的解决方案可以将文件从主机 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

斯文对你的问题的评论肯定是正确的做法。

你可以这样做:

  1. ASSH 到B,在端口 5000 上创建隧道

    ssh someuser@B -L 5000:127.0.0.1:5000
    
  2. 从该 shell 开始B,通过 SSHC创建第二个隧道,终止于C的 ssh 服务器。

    ssh someuser@C -NL 5000:127.0.0.1:22
    
  3. 从第二个终端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 来完成。

相关内容