我有一些程序可以生成大量数据,具体是加密tarball。我想在远程ftp服务器上上传结果。
文件非常大(大约60GB),所以我不想浪费硬盘空间来获取tmp目录和时间。
有可能吗?我检查了ncftput util,但是没有选项可以从标准输入中读取。
答案 0 :(得分:3)
curl可以上传:
-T, - upload-file
[...]
使用文件名“ - ”(单个破折号)来使用stdin而不是给定 文件。或者,文件名“。” (单个期间)可能是 指定而不是“ - ”以在非阻塞模式下使用stdin来允许 正在上传stdin时读取服务器输出。
[...]
答案 1 :(得分:1)
我想你可以用任何使用命名管道的上传程序来做到这一点,但是如果上传的某些部分出错并且你必须重新启动上传我会预见到问题:数据已经消失了你即使您只丢失了1个字节,也无法重新开始上传。这也适用于从stdin 策略中读取。
我的策略如下:
mkfifo
创建命名管道。dd
。touch next_file; for f in ordered_list_of_files; do cat $f >> next_file; rm $f; done
或某些变体应该这样做。当您上传前一个文件时,您当然可以准备下一个文件,以最大限度地使用并发。瓶颈将是您的加密算法(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