Cocatenate 2 переменные, чтобы положить в JSON не работает - PullRequest
0 голосов
/ 11 мая 2019

Мне нужно объединить 2 переменные, но когда я выполняю код bash, я получаю эту ошибку filters.api.malformed_request_body.

Мне нужно получить текущие IP-адреса, чтобы иметь возможность добавить новый IP-адрес в фильтрЭто потому, что мне нужно использовать две переменные, $a - это текущий IP-адрес, указанный в правиле моего брандмауэра, а $b - это новый IP-адрес, который я добавлю.

С Cloudflare

Чтобы сохранить существующие значения, выполните запрос GET и на основе ответа определите, какие поля (и соответствующие значения) следует включить в запрос PUT и, таким образом, избегайте любых нежелательных перезаписей.

Код:

a=122.16.89.10
b=137.77.77.77

curl -X PUT \
     -H "X-Auth-Email: EMAIL" \
     -H "X-Auth-Key: KEY" \
     -H "Content-Type: application/json" \
     -d '[
{
   "id": "ID",
   "paused": false,
   "expression": "(ip.src in {'$a'" "'$b'})",
   "description": "Block IP"
}
]' "https://api.cloudflare.com/client/v4/zones/ZONE/filters"

Я также пытался: "(ip.src in {'$a $b'})" и:

new_filter="$a $b"
...
...
"(ip.src in {'$new_filter'})"

Если я echo $new_filter, то он показывает правильный результат:

new_filter="$a $b"
echo $new_filter
#122.16.89.10 137.77.77.77

Когда я использую переменную $new_filter, она также показывает эту ошибку curl: (3) [globbing] unmatched close brace/bracket in column 13 строка 13: -H "Content-Type: application/json" \.

Ничего не сработало, почему?Я получаю эту ошибку:

{                                                                   
  "result": null,                                                   
  "success": false,                                                 
  "errors": [                                                       
    {                                                               
      "code": 10014,                                                
      "message": "filters.api.malformed_request_body"               
    }                                                               
  ],                                                                
  "messages": []                                                    
}    

Это работает: "(ip.src in {'$a'})".

1 Ответ

1 голос
/ 11 мая 2019

Хорошо, давайте возьмем ваш первый пример и изменим его для печати тела JSON:

export a=122.16.89.10
export b=137.77.77.77

echo '[
{
   "id": "ID",
   "paused": false,
   "expression": "(ip.src in {'$a'" "'$b'})",
   "description": "Block IP"
}
]'

Вывод такой:

{
   "id": "ID",
   "paused": false,
   "expression": "(ip.src in {122.16.89.10" "137.77.77.77})",
   "description": "Block IP"
}
]

Вы видите, что JSON недействителен. Двойные кавычки не сбалансированы в expression.

Вместо этого попробуйте "expression": "(ip.src in {'$a' '$b'})", - это даст действительный JSON.

...