Как передать и правильно экранировать заголовки / аргументы HTTP для скручивания в скрипте bash?Работает нормально на оболочке: - / - PullRequest
0 голосов
/ 03 декабря 2018

Я запускаю

/usr/local/bin/curl -V
    curl 7.63.0-DEV (x86_64-pc-linux-gnu) libcurl/7.63.0-DEV OpenSSL/1.1.1a zlib/1.2.11 brotli/1.0.3 libidn2/2.0.5 libpsl/0.20.2 (+libidn2/2.0.5) libssh2/1.8.1_DEV nghttp2/1.36.0-DEV

bash --version
    GNU bash, version 4.4.23(1)-release (x86_64-suse-linux-gnu)

Этот запрос curl к конечной точке API прекрасно работает в оболочке

TOKEN="testtoken" /usr/local/bin/curl \
 -H "content-type: application/json" \
 -H "Authorization: Bearer ${token}" \
-X GET ${url}/endpoint

и возвращает ожидаемый результат, например,

{
  "result" : "blah"
}

Меняется только последняя строка команды.Я хочу обернуть остальное в сценарий удобства bash.

Пытаясь избежать выхода из ада, после прочтения

Я пытаюсь поместить команду в переменную, носложные случаи всегда терпят неудачу!http://mywiki.wooledge.org/BashFAQ/050

и @ stackoverflow

передают массив заголовков для скручивания в скрипт bash

Я собрал этот скрипт,

cat test.sh
    #!/bin/bash
    token="testtoken" 

    mk_keyval() {
      local mkey=${1}
      local mval=${2}
      echo "\"${mkey}: ${mval}\""
    }

    mk_hdrs() {
      HDR=()
      HDR[0]=$(mk_keyval "content-type" "application/json")
      HDR[1]=$(mk_keyval "Authorization" "Bearer ${token}")
    }

    mk_hdrs
    echo -e "${HDR[@]/#/-H }\n"
    /usr/local/bin/curl "${HDR[@]/#/-H }" "@"

в exec

bash ./test.sh -X GET ${url}/endpoint

вместо этого он возвращает

-H "content-type: application/json" -H "Authorization: Bearer testtoken"

curl: (6) Could not resolve host:

Заголовки echo'd соответствуют использованию в оболочке, сверху,

 -H "content-type: application/json" \
 -H "Authorization: Bearer ${token}" \

Как правильно настроить экранирование сценария, чтобы он выполнялся так же, как команда оболочки?

1 Ответ

0 голосов
/ 03 декабря 2018

Полагаю, проблема в последней строке, где вы на самом деле выполняете команду curl.См.

/usr/local/bin/curl "${HDR[@]/#/-H }" "@"
#                                     ^^^ this is an incorrect token, should have been "$@"

Фактический список позиционных аргументов в bash равен "$@", который должен был использоваться в вашей команде как

/usr/local/bin/curl "${HDR[@]/#/-H }" "$@"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...