2012-08-08 103 views
0

我正在编写一个bash脚本来从远程网站下载文件。但是,远程网站需要先提交POST表单然后返回一个文件。我设法找到该解决方案,它的工作原理great.Here是:Bash脚本 - 在POST后获取带有Curl的文件名

curl -F 'data=filename.rar' --user-agent 'Mozilla/4.0 POST' http://somewebsite.com/index.html -v > filename 

现在的问题是,我必须将stdout时,服务器返回的文件,或者我会在screen.What我得到乱码代码想要的是,而不是硬编码的'文件名',以获得文件的真实名称并在那里重定向STDOUT。 使用-sI选项运行curl来获取标题然后解析文件名不是解决方法,因为curl不接受-I和-F选项的组合。它必须是其中之一,但只能使用-FI可以看到标题和服务器也发送文件与them.Is有一种方法来获取只有标题(请记住,我也要发送发布数据以获取文件),所以我可以解析它们并提取文件名?然后,我会做出新的curl请求,但现在将该文件名称作为STDOUT值。或者有办法让curl自动从头文件下载到文件名中?

回答

0

继我对上一个答案的评论之后,您可能需要尝试使用wget。

FILENAME=`wget --post-file=filename.rar -P dir_to_save_files http://somewebsite.com/index.html | grep "filename" | cut -d"=" -f2 | awk '{print$1}'`; wget --post-file=filename.rar -O $FILENAME -P dir_to_save_files http://somewebsite.com/index.html 

您可能需要玩这个,因为我没有测试的方式。如果它实际上不是发布的文件,也可以使用--post-data =数据。

  • 根据评论编辑。这可能不是最优雅的方式,但它应该相对有效。您可能需要使用cut语句和grep语句来使其指向实际的文件名。
+0

刚试过Wget.Und,wget下载文件,但它保留名称'index.php'。不知道如何使它保持原始文件名。 – Zed 2012-08-08 22:28:08

+0

这里有一些info.With - 服务器响应我可以得到标题,这里是从输出“内容处置:附件;文件名=”filenameblablabla.ZIP“现在如果我可以让Wget使用该名称而不是index.php ... – Zed 2012-08-08 22:42:12

+0

如果没有提供正确方向的想法,我的编辑可能会有所帮助 – Lipongo 2012-08-09 16:18:04

0

您可能需要使用curl来尝试-o选项。例如:

curl -F 'data=filename.rar' --user-agent 'Mozilla/4.0 POST' -o outputFileName http://somewebsite.com/index.html -v 
+0

感谢您的评论,但-o实际上是输出重定向器的作用。我希望不知何故,有一个选项可以从头文件中找到文件名并在其中输出数据,但似乎没有。 – Zed 2012-08-08 18:42:31

0

最后......解决方法是使用--content-disposition选项和Wget保留原始文件名。

+0

...这基本上是相同的选项,称为-J,--remote-header-name带卷曲 – 2012-08-09 08:43:09