Как использовать переменную для URL внутри команды cURL GET - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь получить определенное поле json из команды cURL GET в bash-скрипте из индекса Elasticsearch. Для этого я настроил скрипт для передачи переменных в команду cURL. Жесткое кодирование значений дает правильный ответ, поэтому мне просто нужно выяснить, как использовать переменные, чтобы я мог получить разные ответы для разных целей.

Это желаемый результат и текущая рабочая команда:

docs=`curl -k -u admin:hunter1 -HContent-Type:application/json -X GET 'https://10.10.15.15:9200/logstash-linux-pci-2019.03.15/_stats' | jq '._all.primaries.docs.count'`
echo "The document count is "$docs

Количество документов 183 283 999

Я импортирую построчные индексы из текстового файла, который может выглядеть примерно так:

list.txt

logstash-linux-pci-2019.03.15
logstash-linux-pci-2019.03.16
logstash-linux-pci-2019.03.17
logstash-linux-pci-2019.03.18

Мне нужно поместить переменную ip вместе с этими ^ в команду curl следующим образом:

reindex.sh

user='admin'
pass='hunter1'
ip='https://10.10.15.15:9200'
indexList=(`cat "list.txt"`)

for index in "${indexList[@]}"
do
    echo "Reindexing: "$index
    docs=`curl -k -u $user:$pass -HContent-Type:application/json -X GET '$ip/$index/_stats' | jq '._all.primaries.docs.count'`
    echo "index "$index" has a doc count of "$docs
done
echo "Complete!"

Единственное, что не работает в приведенном выше примере, это ....GET '$ip/$index/_stats'....

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

Я пытался:

....GET '$ip/$index/_stats'....

Ошибка выбрасывания: curl: (52) Empty reply from server

.

....GET "${ip}/${index}/_stats"....

Ошибка броска: curl: (52) Empty reply from server

.

....GET 'http://10.10.15.15/'"$index"'/_stats'....

Ошибка бросков: curl: (52) Empty reply from server

.

....GET '$ip/$index/_stats'....

Ошибка бросков: curl: (52) Empty reply from server

.

url="${ip}/${index}/_stats"
....GET $url ....

Ошибка бросков: curl: (52) Empty reply from server

.

Я искал в Интернете несколько часов, но все, что я нахожу, связано с curl PUT и помещением переменных в видеJSON на серверах. Как я могу свернуться с переменной URL и индексом?

1 Ответ

1 голос
/ 11 октября 2019

Редактировать: Для тех, кто найдет это в будущем. Фактическая причина проблемы заключалась в использовании http вместо https.

Вы используете неверные кавычки.

Переменные внутри '...' расширяться не будут. Тем не менее, они будут расширяться почти везде, как в двойных кавычках. Например, эта строка:

echo "index "$index" has a doc count of "$docs

Здесь вторая двойная кавычка завершает первую. Они не могут быть вложенными. Вы могли бы просто написать это как:

echo "index $index has a doc count of $docs"

Таким образом, это означает, что ваши переменные не будут расширяться здесь:

....GET '$ip/$index/_stats'....

Это эквивалентно фактической отправке литеральной строки $ip/$index/_stats,Вы хотите использовать двойные кавычки здесь: ....GET "$ip/$index/_stats".....

Еще одна вещь, на которую следует обратить внимание, это процитировать результат присваивания переменной. Если по какой-либо причине результат этой команды:

curl -k -u $user:$pass -HContent-Type:application/json -X GET '$ip/$index/_stats' | jq '._all.primaries.docs.count'

был foo bar, то присвоение переменной превращается в docs=foo bar. Это то же самое, что сказать установить переменную docs=foo и выполнить программу bar. Таким образом, вы должны процитировать все назначение. Однако взгляните на это с помощью цитируемого задания:

docs="`curl -k -u $user:$pass -HContent-Type:application/json -X GET "$ip/$index/_stats" | jq '._all.primaries.docs.count'`"

Это начинает выглядеть довольно уродливо и запутанно. Это одна из причин, почему рекомендуется использовать синтаксис $(...) над обратными галочками. Они функционально эквивалентны, но здесь легче прочитать, что происходит:

docs="$(curl -k -u $user:$pass -HContent-Type:application/json -X GET "$ip/$index/_stats" | jq '._all.primaries.docs.count')"

Итак, я немного коснулся, но это важная вещь. В действительности, это решение, которое вы попробовали, должно было сработать: ....GET "${ip}/${index}/_stats"..... Я думаю, что ваша проблема на самом деле может быть больше связана с тем, что она есть в сценарии, поскольку она отлично работала за ее пределами. Я не вижу линии Шебанга, и вы, возможно, даже не используете Bash. Вы используете некоторые функции (например, массив), специфичные для bash. Попробуйте добавить #!/bin/bash в начало скрипта. Если это не работает, попробуйте запустить ваш скрипт следующим образом: bash -x reindex.sh. Это похоже на режим отладки для bash, и он покажет вам интерпретируемые команды, которые выполняются.

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