不使用@file将二进制数据传递给curl


30

是否可以使用curl和发布二进制数据而不传递文件名?例如,您可以通过--data-binary使用二进制文件发布表单:

curl -X POST --data-binary @myfile.bin http://foo.com

但是,这需要文件存在。我希望能够将curl的文本记录为HTTP调用(例如,休息服务),以重现请求。(例如,这大大有助于调试这些服务)

但是,记录引用文件的curl命令将没有用,所以我希望我实际上可以记录原始的二进制数据(大概是base64编码),但仍然允许您复制并粘贴记录的curl命令并执行它。

那么,有可能使用curl并发布二进制数据而不引用文件吗?如果是这样,那将如何工作?一个例子看起来像什么?


如果您没有将其记录到文件中,那么它将记录到哪里?
slm

@slm,我想您误会了。我将我的客户端rest调用记录到纯文本的日志文件中(作为逐字等效的curl命令)。但是,我不想为我记录的每个二进制curl命令引用一些随机文件。我希望curl命令的整个文本完全独立,以便有人可以将文本复制到终端中并运行它以重现调用。
柯克·沃尔

Answers:


45

您可以通过STDIN将数据传递到curl中,如下所示:

echo -e '...data...\n' | curl -X POST --data-binary @- http://foo.com

@-通知curl从STDIN拉英寸

管道传输二进制数据以进行卷曲(例如):

echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com

但这仍然不允许二进制数据成为curl命令文本的一部分。那不可能吗?
柯克·沃尔

您的要求听起来不可行。curl命令的数据可以通过管道传递到curl或通过@ <filename>工具拉入。据我所知,没有其他方法。
slm

1
实际上,您的答案是完美的-您的示例应该只使用二进制。:)即 原始二进制数据echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com 在哪里\x03\xF1是十六进制,这几乎正是我想要的。
柯克·沃尔

大。我没有完全跟着你。因此,您想将二进制数据传递到curl中,我想您还需要其他东西。很高兴它对你有效。
slm

2
我尝试了这个:cat 1.jpg | curl -X POST --data-binary @- http://foo.com。像魅力一样工作。为了验证,我还尝试了:cat 1.jpg | md5summd5sum 1.jpg。他们都返回了相同的值。
dimitarvp 2014年

0

不知道为什么,但是slm建议的确切命令行对我不起作用。稍作修改,以下工作:

echo -e '...data...\n' | curl -s -T - sftp://user@10.10.10.10/~/test.txt

1
原因是SFTP是与HTTP完全不同的协议,具有非常不同的功能,并且手册页和帮助消息都说--data-binary仅适用于HTTP(和HTTPS)。
dave_thompson_085

那讲得通。我整合了多个在线资源来使之正常工作,因此我错过了使该问题成为HTTP特定问题的部分。如果有人需要,我将在这里留下答案。
理查德·尼纳伯

0

添加到此答案的echo命令默认情况下会在其输出后添加换行符。这会\n在二进制数据的末尾添加a ,因此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的字节将恰好是您传递给的字节echo

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.