命令
curl http://localhost/ --data @hello
将尝试从文件中读取hello
。如何转义该@
符号?
答案1
在不尝试了解更多有关curl内部的信息的情况下,我建议直接通过管道进入它:
printf @hello | curl http://localhost/ --data @-
正如 @ulrich-schwarz 在评论中建议的那样,
--data @<(echo @hello)
如果更方便的话您也可以使用(并非所有 shell 都支持此语法)。
查看curl-7.41.0的源代码,我没有看到任何方法来转义符号@
以防止解释为文件名:
if('@' == is_file) {
/* a '@' letter, it means that a file name or - (stdin) follows */
if(curlx_strequal("-", p)) {
file = stdin;
set_binmode(stdin);
}
else {
file = fopen(p, "rb");
if(!file)
warnf(config,
"Couldn't read data from file \"%s\", this makes "
"an empty POST.\n", nextarg);
}
/* ... */
}
因此,不幸的是,我们似乎陷入了上面的管道解决方案。
答案2
数据以内容类型发送application/x-www-form-urlencoded
。原则上,%40
应解码为@
,因此以下命令应发送等效数据:
curl http://localhost/ --data %40hello
然而,这可能有效也可能无效,具体取决于服务器端应用程序是否实际执行 URL 解码。如果它需要未编码的数据(当应用程序不希望数据包含任何特殊字符时,这种情况相当常见),应用程序可能会将其解释为%40hello
.
如果应用程序不进行解码,通过管道将数据传递给curl。