Баш, фигурные скобки и цитаты и curl -d - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь отправить некоторые заголовки и пары значений ключей на мой сервер с помощью curl. Похоже, у меня проблема с цитированием bash, мои пары ключ-значение обрабатываются как хосты.

curl -v --header "Content-Type: application/json" \
--header "Foo: Bar 123456"  \
-d \"\{ "baz": "glern", "froboz": "foo again"\}\" \
https://example.com > foo.html 2> error.txt 

example.com говорит мне:

HTTP 404 Not Found: URL or Document not found (dns_unresolved_hostname) 

HTTP 404: Your requested host "baz" could not be resolved by DNS. The document at the specified URL does not exist.

HTTP 404 Not Found: URL or Document not found (dns_unresolved_hostname) 

HTTP 404: Your requested host "glern," could not be resolved by DNS. The document at the specified URL does not exist.

и error.txt начинается следующим образом:

* Rebuilt URL to: baz:/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 10.196.133.236...
* TCP_NODELAY set
* Connected to http.proxy.mycompanyproxy.com (10.196.133.236) port 8000 (#0)
> POST http://baz:/ HTTP/1.1
> Host: baz
> User-Agent: curl/7.54.0
> Accept: */*
> Proxy-Connection: Keep-Alive
> Content-Type: application/json
> Foo: Bar 123456
> Content-Length: 2
> } [2 bytes data]
* upload completely sent off: 2 out of 2 bytes
< HTTP/1.1 404 Not Found
...

Я, конечно же, не хочу бить хостов baz, glern и т. Д. И, конечно, это похоже на проблему цитирования оболочки. Но после того, как я попробовал много разных вещей, таких как добавление дополнительных \ "рядом с существующим оголенным" вокруг моих пар ключ-значение, я немного растерялся.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Подумайте, как будут выглядеть ваши данные, если у вас просто будет файл:

$ cat tmp.json
{ "baz": "glern", "froboz": "foo again" }

В этом случае вы просто используете

$ curl ... -d "$(cat tmp.json)"

Теперь просто выполните подстановку команд, так сказать, «вручную» (переключаясь с двойных на одинарные кавычки, чтобы избежать экранирования кавычек в командной строке):

$ curl ... -d '{ "baz": "glern", "froboz": "foo again" }'
# with double quotes, it's
#  curl ... -d "{ \"baz\": \"glern\", \"froboz\": \"foo again\" }"
# ... ew.

В общем, лучше позволить инструменту типа jq генерировать для вас JSON, а не пытаться писать его вручную; это может значительно упростить цитирование, когда это необходимо.

$ curl ... -d "$(jq -n '{baz: "glern", froboz: "foo again"}')"

Практически обязательно использовать такой инструмент, если ваш JSON не жестко запрограммирован, а из таких переменных, как {"baz": "$SOME_VAR"}. Вместо того, чтобы прыгать через обручи, чтобы убедиться, что все в SOME_VAR правильно экранировано, пусть jq сделает это за вас: jq -n --argjson x "$SOME_VAR" '{baz: $x}'. Обратите внимание, что $x является , а не переменной оболочки; это jq переменная.

0 голосов
/ 02 ноября 2018

После -d только \"\{ формирует аргумент для -d. Не совсем понятно, что вы ищете, но возможно:

curl -v --header "Content-Type: application/json" \
     --header "Foo: Bar 123456"  \
     -d '{ "baz": "glern", "froboz": "foo again"}' \
     https://example.com > foo.html 2> error.txt 

Таким образом, аргумент -d:

{ "baz": "glern", "froboz": "foo again"}

Нет вызова использовать двойные кавычки вокруг строки, которая содержит обильные двойные кавычки; это только усложняет жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...