如何使用Shell脚本运行带有头部的curl命令

4

我尝试运行一个包含curl命令和必需头部的shell脚本,如下所示。

counter=1
H1='Content-Type: application/json'
H2='Accept: application/json'
H3='Authorization: Bearer a0a9bb26-bb7d-3645-9679-2cd72e2b4c57'
URL='http://localhost:8280/mbrnd_new/v1/post'

while [ $counter -le 10 ]

do

TEST="curl -X POST --header $H1 --header $H2 --header $H3 -d @s_100mb.xml $URL"
echo $TEST
RESPONSE=`$TEST`
echo $RESPONSE
sleep 5
done
echo "All done"

它会报错,错误信息为

curl: (6) Could not resolve host: application
curl: (6) Could not resolve host: Bearer
curl: (6) Could not resolve host: a0a9bb26-bb7d-3645-9679-2cd72e2b4c57
<ams:fault xmlns:ams="http://wso2.org/apimanager/security"><ams:code>900902</ams:code><ams:message>Missing Credentials</ams:message><ams:description>Required OAuth credentials not provided. Make sure your API invocation call has a header: "Authorization: Bearer ACCESS_TOKEN"</ams:description></ams:fault>

给定的访问令牌和其他头参数是正确的。直接调用“curl”时,它运行良好。
我尝试过使用\"等不同的方法,但都没有成功。如果有人能够提供一个合适的答案,我将非常感激。
谢谢。

你的示例会出错,因为替换单个头变量($H1,...)会扩展为包含空格的字符串。 - David
1个回答

7
您想要执行的命令类似于以下内容:
curl -X POST --header "$H1" --header "$H2" --header "$H3" -d @s_100mb.xml "$URL"

为了更简洁明了,我会用-H代替--header

最简单的方法是:

response=$(curl -X POST -H "$H1" -H "$H2" -H "$H3" -d @s_100mb.xml "$URL")

你的解决方案存在问题,就是你根本没有对头部值进行分隔:
curl -X POST -H $H1

如果 H1 的内容是 foo: bar,那么它将会展开为:
curl -X POST -H foo bar

并将被解释为

curl -X POST -H (foo:) bar

(仅使用 () 来说明优先级,这种方法在 shell 中是不可行的)即 bar 将被视为第一个位置参数,而它实际上是主机名,从而导致您看到的奇怪错误。

您需要的是:

curl -X POST -H (foo: bar)

通过正确地将扩展包含在引号中,就可以实现上述所示。

此外,你应该 使用 $(cmd) 代替 `cmd`

最后的建议是,如果你正在学习如何使用 shell,最好避免多重扩展,也就是不要将命令存储在 CMD 变量中以后再使用 $($CMD),因为这会导致多个位置的多重扩展(第一个是在分配 CMD 的位置,第二个是在 $(...) 子 shell 中扩展 CMD),使得很难理解到底发生了什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接