在bash脚本中使用curl并获取curl:(3)在URL中找到非法字符

gre*_*inn 43 linux bash awk curl

所以我有一个非常简单的bash脚本,它正在向一个auth服务器发送标题.标题url被写入var,然后在下一个curl调用中使用.当在第一个curl调用中使用var set时,我得到"curl:(3)在URL中找到非法字符".我能够回显var并且所有看起来都很好,我甚至可以重置var(在我下面的示例中)并且它可以工作.

Bash脚本

URL=$(curl -i -X GET -H "X-Auth-User: MyUserna,e" -H "X-Auth-Key: MyAPIKey" "https://urlToAuthServer.tld/auth/v1.0/" | grep "X-Storage-Url:" | awk '{print $2}')

curl -X GET -H "X-Auth-Token: MyAuthTok" "${URL}/folder/myfile.txt" -o ./myfile.txt
Run Code Online (Sandbox Code Playgroud)

运行上面的例子时,我得到:

curl: (3) Illegal characters found in URL
Run Code Online (Sandbox Code Playgroud)

URL var看起来像这样(没有非法字符)

https://somesecureurl.com/auth/AUTH_67383834-45245453-g34g34t5-34534
Run Code Online (Sandbox Code Playgroud)

当我在终端中这样做时它起作用:

$ URL = $(卷曲-i -X GET -H "X-AUTH-用户:MyUserna,E" -H "X-验证密钥:MyAPIKey"" HTTPS://urlToAuthServer.tld/auth/v1.0/ "| grep"X-Storage-Url:"| awk'{print $ 2}')

$ echo $ URL

https://somesecureurl.com/auth/AUTH_67383834-45245453-g34g34t5-34534

现在我复制并粘贴字符串并将其重新分配到URL,如此(再次在终端中):

>$ URL="https://somesecureurl.com/auth/AUTH_67383834-45245453-g34g34t5-34534"
>$ curl -X GET -H "X-Auth-Token: MyAuthTok" "${URL}/folder/myfile.txt" -o ./myfile.txt
Run Code Online (Sandbox Code Playgroud)

有用.

那么为什么我在第一个例子中得到"curl:(3)在URL中发现的非法字符"错误?

更新 我跑了这个: printf %s "$URL" | xxd

这是输出(解决了改变你得到的想法)

0000000: 6874 7470 733a 2f2f 6461 6c30 352e 6f62  https://server.ob
0000010: 6a65 6374 7374 6f72 6167 652e 736f 6674  jectstorage.lite
0000020: 6c61 7965 722e 6e65 742f 7631 2f41 5554  sabers.com/v1/AUT
0000030: 485f 6665 3235 3339 3434 2d38 6433 322d  H_aE2563981-7d32-
0000040: 3432 3138 2d61 6566 632d 6665 6638 3465  4201-bdoi-fef94a
0000050: 6166 3331 6232 0d                        ag11c8.
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 95

$ URL \r在末尾包含(CR)(0d).删除它

URL=${URL%$'\r'}
Run Code Online (Sandbox Code Playgroud)

在使用它之前curl.

  • @Noumenon:因为''\ r'`是两个字符,反斜杠和`r`,而`$'\ r'`是一个字符,CR.`$'...'`是不同于'''''的引号. (6认同)
  • 令人敬畏的简洁解释。TIL Ansi-C 引用。 (2认同)

小智 10

我有同样的问题,但这是因为我通过 Windows 创建了脚本,这意味着行尾有一个不必要的 \r。

一个简单的 dos 到 unix 转换修复了它。

dos2unix <scriptname>
Run Code Online (Sandbox Code Playgroud)