Запрос Curl в сценарии оболочки не работает

Я пытаюсь выполнить команду curl из сценария оболочки. Эта команда работает правильно из cli. Однако мне нужно выполнить его в сценарии оболочки. Ожидается, что команда curl удалит записи в solr в зависимости от запроса.

curl -v  -o /dev/null  -w %{http_code}    -H Content-Type:text/xml -X POST   http://localhost:8983/solr/content/update?commit=true -d  <delete><query>playlist_id:["" TO *]</query></delete> 

Note: Unnecessary use of -X or --request, POST is already inferred.
  % 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 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8983 (#0)
> POST /solr/content/update?commit=true HTTP/1.1
> Host: localhost:8983
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Type:text/xml
> Content-Length: 30
> 
} [30 bytes data]
* upload completely sent off: 30 out of 30 bytes
< HTTP/1.1 400 Bad Request
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 488
< 
{ [488 bytes data]
100   518  100   488  100    30  63649   3912 --:--:-- --:--:-- --:--:-- 69714
* Connection #0 to host localhost left intact
Note: Unnecessary use of -X or --request, POST is already inferred.
* Rebuilt URL to: TO/
* Could not resolve host: TO
* Closing connection 1
curl: (6) Could not resolve host: TO
curl: (3) [globbing] unmatched close brace/bracket in column 2
400000
status: '400000'
Critical error happened during solr data delete: Verify the state manually
Quitting now

Мне нужно получить код состояния http, чтобы проверить статус. Выполняется следующий код сценария оболочки.

curl_command_tmp="http://localhost:8983/solr/content/update?commit=true -d <delete><query>playlist_id:["" TO *]</query></delete>"
    curl_command_tmp="curl -v  -o /dev/null  -w %{http_code}    -H Content-Type:text/xml -X POST   $curl_command_tmp"
            echo "Curl delete command $curl_command_tmp"
           status=`$curl_command_tmp`
            echo $status
            echo "status: '$status'"
           if [ "$status" != "200" ]; then
                     echo "Critical error happened during solr data delete: Verify the state manually"
                     echo "Quitting now"
                     exit 0
           fi

Я пробовал разные варианты curl (например, -G , --data-urlencode). но они не работают. Я предполагаю, что если я смогу передать полное тело запроса без его усечения, тогда это сработает. Но он усекается перед «TO» в теле запроса solr http. Я прошел через различные форумы, но это еще не решено. Нужна ваша помощь, чтобы решить это


person Dumbledore    schedule 27.01.2018    source источник
comment
Двойные кавычки здесь ["" TO *] сбивают с толку оболочку скрипта. Он считает, что первый " соответствует " в начале команды, а второй "" начинает новую строку, совпадающую с " в конце команды. Результат таков, что "" исчезает. Попробуйте переписать это выражение, используя обратную косую черту, чтобы защитить каждую из этих двойных кавычек от обработки в качестве разделителей строк, например [\"\" TO *].   -  person ottomeister    schedule 28.01.2018


Ответы (1)


Я попробовал предложение в комментарии, но это не сработало. Вместо этого я поместил данные (<delete><query>playlist_id:["" TO *]</query></delete>) в файл и использовал их так:

-d @FILE_NAME

Это работало без каких-либо недостатков. Я предполагаю, что если в данных есть специальные символы, которые curl не может обработать на cli, вместо этого используйте файл.

Примечание. Я не ставил никаких дополнительных кавычек или двойных кавычек в ФАЙЛ. Просто поместите данные, которые действительно должны быть отправлены.

person Dumbledore    schedule 28.01.2018
comment
Вы также можете заключить свой XML в одинарные кавычки. - person MatsLindh; 28.01.2018