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

是否有任何好的现有解决scheme将文件从主机A移动到主机C,使用主机B作为被动中间存储区域。

A→B→C

限制

  • 主机A和主机C在不同的networking上,不能互相访问。 A和C之间不能打开隧道
  • 主机A和主机C都可以运行并安排周期性进程。
  • 主机B只提供一个存储区域,可以通过SSH从主机A和主机C进行访问。
  • B将是“被动”,只会提供存储区域。
  • 因此,A将充当(B上的文件)的作者,而C将充当(B上的文件的)读者。
  • 然后可以在主机A上删除从主机A成功复制到主机C的文件(通过B)。
  • 在存在保证(包含文件校验和的收据?)之前,主机A上的任何文件都不应该被删除,它已经成功登陆到主机C上
  • 案例包括networking停机时间pipe理,磁盘已满,中断进程等

目的是定期将文件从A移动到C,使用B作为中间存储区域。

我们可以假设所有主机都运行Unix / Linux。 首选工具:ssh / rsync / bash +其他“标准”工具。

我正在考虑通过在两个步骤中使用一些围绕rsync的bash脚本来创build解决scheme,并使用包含校验和的收据来检测文件何时成功移动。

有没有现有的解决scheme?

我没有看到需要在B上存储任何东西,你可以使用它代理A和C之间的连接,使用任何代理软件,如SSH端口转发或袜子。 也许你甚至可以通过B路由/ nat?

或者,因为您特意提出要按照自己的方式进行操作,您可以使用NFS / Samba来复制文件并使用各种方法validation完成情况。 想到的就是在共享上创build一个文件,在两个系统之间传递“复制完成”或“确定删除”types的消息。 或者就像你说的,MD5的东西,等等…但是你这样做,我敢肯定,这将是一个自定义的工作。 但不是一个困难的。 我怀疑现在有没有办法以这种方式处理你的问题。

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

你可以这样做:

  1. 从SSH到B ,在端口5000上创build隧道

     ssh someuser@B -L 5000:127.0.0.1:5000 
  2. B上的shell,SSH到C创build第二个隧道终止在C的ssh服务器。

     ssh someuser@C -NL 5000:127.0.0.1:22 
  3. A的第二个terminal,rsync你的文件直接C

     rsync -avz -e "ssh -p 5000" --progress --remove-source-files /source/directory [email protected]:/destination/directory 

甚至可以用一个命令在步骤1和步骤2中设置隧道,但是在我做的快速testing中,我无法做到。 可能需要在BC上设置ssh密钥。

如果你要自动化复制过程,那么你可能需要看看autossh之类的东西,通过服务为你设置和拆卸隧道。 或者你可以通过cron来做到这一点..