通过ftp将程序的输出直接上传到远程文件

时间:2011-08-16 15:02:16

标签: linux bash ftp

我有一些程序可以生成大量数据,具体是加密tarball。我想在远程ftp服务器上上传结果。

文件非常大(大约60GB),所以我不想浪费硬盘空间来获取tmp目录和时间。

有可能吗?我检查了ncftput util,但是没有选项可以从标准输入中读取。

4 个答案:

答案 0 :(得分:3)

从stdin读取时,

curl可以上传:

  

-T, - upload-file

     

[...]

     

使用文件名“ - ”(单个破折号)来使用stdin而不是给定   文件。或者,文件名“。” (单个期间)可能是   指定而不是“ - ”以在非阻塞模式下使用stdin来允许   正在上传stdin时读取服务器输出。

     

[...]

答案 1 :(得分:1)

我想你可以用任何使用命名管道的上传程序来做到这一点,但是如果上传的某些部分出错并且你必须重新启动上传我会预见到问题:数据已经消失了你即使您只丢失了1个字节,也无法重新开始上传。这也适用于从stdin 策略中读取。

我的策略如下:

  1. 使用mkfifo创建命名管道。
  2. 启动加密过程,在后台写入该命名管道。很快,管道缓冲区将被填满,加密过程将被阻止,试图将数据写入管道。当我们稍后从管道读取数据时,它应该取消阻止。
  3. 从命名管道中读取一定数量的数据(假设为1 GB)并将其放入文件中。可以使用实用程序dd
  4. 通过ftp以标准方式上传该文件。然后,您可以处理重试和网络错误。上传完成后,删除该文件。
  5. 返回步骤3,直到从管道中获得EOF。这意味着加密过程已完成写入管道。
  6. 在服务器上,将文件附加到空文件中,一旦附加文件就逐个删除文件。使用touch next_file; for f in ordered_list_of_files; do cat $f >> next_file; rm $f; done或某些变体应该这样做。
  7. 当您上传前一个文件时,您当然可以准备下一个文件,以最大限度地使用并发。瓶颈将是您的加密算法(CPU),网络带宽或磁盘带宽。

    此方法将在客户端浪​​费2 GB的磁盘空间(或者根据文件的大小更少或更多),以及服务器端的1 GB磁盘空间。但是如果你的上传工作接近尾声,你可以确定你不必再这样做了。

    如果你想对转移的结果有双重肯定,你可以在客户端将它们写入磁盘时计算文件的哈希值,并且只有在服务器端验证哈希后才删除客户端文件。在使用dd ... | tee local_file | sha1sum将文件写入磁盘的同时,可以在客户端计算哈希值。在服务器端,您必须在执行cat之前计算哈希值,并且如果哈希值不好则避免执行cat,因此如果不读取文件两次(一次用于哈希,一次),我无法看到如何执行此操作对于猫)。

答案 2 :(得分:0)

您可以使用ssh:

写入远程文件
program | ssh -l userid host 'cd /some/remote/directory && cat - > filename'

答案 3 :(得分:0)

这是通过curl上传到ftp网站的示例

wget -O- http://www.example.com/test.zip | curl -T - ftp://user:password@ftp.example.com:2021/upload/test.zip