【问题标题】:bash - PUT data with curl with variables from filebash - 使用文件中的变量使用 curl 放置数据
【发布时间】:2016-11-23 08:47:35
【问题描述】:

我有一个这样的 bash 脚本

#!/bin/bash

while read fqdn hostname; do
curl -H "Content-Type:application/json" -XPUT "https://server/api/hosts/${fqdn}" -d '{"host":{"name": "'${hostname}'"}}' --cacert bundle.pem --cert pnet-pem.cer --key privkey.pem
done <curl1.txt

文件 curl1.txt 包含的

fqdn (tab)主机名

.......

我必须使用 Foreman API 更新一些数据。我有很多 fqdns 和主机名,所以我编写了上面的脚本。问题出在 JSON 上,因为我收到这样的错误:

{"status":400,"error":"There was a problem in the JSON you submitted: 795: unexpected token at '{\"host\":{\"name\": \"ptesrv02-lub\r\"}}'"}

当我输入'{"host":{"name": "${hostname}"}}' 而不是'{"host":{"name": "'${hostname}'"}}' 时,我得到了

{
  "error": {"id":130,"errors":{"interfaces.name":["is invalid"],"name":["is invalid"]},"full_messages":["Name is invalid","Name is invalid"]}
}

那么问题出在哪里?你能帮帮我吗?

【问题讨论】:

  • 您的 ${hostname} 值中有一个尾随 \r 字符:ptesrv02-lub\r。这很可能是问题所在。
  • 好的,那么 \r 是什么意思?在文本文件中我没有这样的标志,该文件是由 ruby​​ 脚本生成的。
  • @Inian,因为您是第一个提出可行解决方案的人,请将您的评论作为答案,以便 OP 接受。
  • @salih 您还应该提供您的答案,因为它是另一种有用的方法。
  • @alaSmith:您可以点击下方答案左侧的小勾号接受帖子,从而将帖子标记为已解决。

标签: json bash curl theforeman


【解决方案1】:

要从从 Windows 复制的文件中删除琐碎的特殊字符(CR-LF 结尾)'tr' 命令可以用作

hostname=$(echo $hostname|tr -d '\r')

在你上面的例子中。这些特殊字符的存在破坏了bash 对待字符的方式。

感谢threadp 指出hostname 变量中存在特殊字符。

如果您怀疑文件有这样的CR-LF 结尾,您可以通过使用grep 搜索它们来确认,将文件视为二进制文件

grep -U $'\015' curl1.txt

【讨论】:

    【解决方案2】:

    正如threadp 所指出的,您有一个尾随\r 字符。你可以试试这个删除它。

    ${hostname%?}
    

    这种用法只是删除最后一个字符,在这种情况下,它是尾随\r。 但是,最好使用

    ${hostname/$'\r'/}
    

    谢谢123

    【讨论】:

    • 这只会删除最后一个字符,最好使用"${hostname/$'\r'/}"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2011-04-22
    • 2017-04-12
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多