【问题标题】:Bash getting escaped variable key value with scriptBash 使用脚本获取转义的变量键值
【发布时间】:2021-11-12 07:18:36
【问题描述】:

我想使用 jq 从 Traefik API 服务中获取价值。服务的输出如下所示:

{
  "loadBalancer": {
    "servers": [
      {
        "url": "http://172.18.0.19:3000"
      },
      {
        "url": "http://172.18.0.17:3000"
      },
      {
        "url": "http://172.20.0.3:3000"
      }
    ],
    "healthCheck": {
      "path": "/health",
      "interval": "10s",
      "timeout": "10s",
      "followRedirects": true
    },
    "passHostHeader": true
  },
  "status": "enabled",
  "serverStatus": {
    "http://172.18.0.17:3000": "UP",
    "http://172.18.0.19:3000": "UP",
    "http://172.20.0.3:3000": "DOWN"
  },
  "provider": "docker",
  "type": "loadbalancer"
}

我想动态获取serverStatus 的值。首先从 docker inspect 分配一个具有正确 IP 地址的变量。我正在使用curljq 来检查容器是否正在被服务。

问题是当使用变量获取它时,我似乎无法转义 url 键中的特殊字符。 不返回任何内容

这是我使用的命令是:

TRAEFIK_URL="http://someurl.com/"
TRAEFIK_URL="'Authorization: Basic hashkey"
NEW_IPADDRESS=$(docker container inspect some_container_name | jq -r .[].NetworkSettings.Networks.proxy.IPAddress)
NEW_ENV_URL="http://${NEW_IPADDRESS}:3000"

curl --location --request GET "$TRAEFIK_URL" --header "$TRAEFIK_AUTH_HEADER" | jq -r '.serverStatus["${NEW_ENV_URL}"]'

我已尝试使用此命令和其他一些明显的选项,但都不起作用。

jq -r .serverStatus[$NEW_ENV_URL]

当我不使用变量来获取状态时,我确实得到了正确的值:

 jq -r '.serverStatus["http://172.18.0.17:3000"]'

欢迎任何帮助。

【问题讨论】:

    标签: bash docker jq traefik


    【解决方案1】:

    使用选项--arg 将参数传递给jq

    jq --arg url http://172.18.0.17:3000 -r '.serverStatus[$url]'
    

    始终使用此选项以避免注入带来的安全问题。

    【讨论】:

      【解决方案2】:

      将特定环境变量传递给 jq 的首选方法之一是使用--arg 命令行选项;在你的情况下:

      jq -r --arg url "${NEW_ENV_URL}"  '.serverStatus[$url]'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-10
        • 2017-01-29
        • 2021-11-04
        • 1970-01-01
        • 2015-08-17
        • 2021-12-26
        • 2020-01-02
        • 2017-09-15
        相关资源
        最近更新 更多