![在不使用@file的情况下将二进制数据传递给curl](https://linux22.com/image/32571/%E5%9C%A8%E4%B8%8D%E4%BD%BF%E7%94%A8%40file%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%B0%86%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%92%E7%BB%99curl.png)
是否可以使用curl 并发布二进制数据而不传递文件名?例如,您可以通过 --data-binary 使用二进制发布表单:
curl -X POST --data-binary @myfile.bin http://foo.com
然而,这需要一个文件存在。我希望能够将 HTTP 调用(例如休息服务)记录为 curl 命令的文本以重现请求。 (例如,这极大地有助于调试这些服务)
然而,记录引用文件的curl命令是没有用的,所以我希望我能够实际记录原始二进制数据(大概是base64编码的),但仍然允许您复制和粘贴记录的curl命令并执行它。
那么,是否可以使用curl 并发布二进制数据而不引用文件?如果是这样,那将如何运作?一个例子会是什么样子?
答案1
您可以通过 STDIN 将数据传递到curl,如下所示:
echo -e '...data...\n' | curl -X POST --data-binary @- http://foo.com
告诉我们@-
从curl
STDIN 拉入。
将二进制数据通过管道传递给curl(例如):
echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com
答案2
添加到这答案,该echo
命令默认在其输出中附加换行符。这会\n
在二进制数据的末尾添加一个,因此curl也会接收该字符作为输入。
为了避免这种情况,您可以使用命令printf
或-n
开关,如下所示:
printf '\x03\xF1' | curl -X POST --data-binary @- http://foo.com
或者
echo -en '\x03\xF1' | curl -X POST --data-binary @- http://foo.com
这样,curl 输入中就不会添加换行符,并且传递给curl 的字节将正是您传递给的字节echo
。
答案3
不知道为什么,但 slm 建议的确切命令行对我不起作用。经过稍微修改,以下内容有效:
echo -e '...data...\n' | curl -s -T - sftp://[email protected]/~/test.txt