Анализировать и форматировать заголовок в переменную из ответа curl?

#json #bash #shell #curl

#json #bash #оболочка #curl

Вопрос:

Я пытаюсь проанализировать строку access_token из заголовка «Set-Cookie» в запросе curl POST, выполняемом каждые 10 секунд, и сохранить ее в переменной.

Эту переменную необходимо будет использовать для выполнения запроса GET, который выполняется каждые 5 минут. Переменная будет частью запроса. Переменная is — это строка cookie токена доступа, которая изменяется каждый раз, когда выполняется запрос POST. Эта строка токена доступа будет использоваться во втором запросе curl для его правильной работы.

Мой вопрос в том, как получить только текст после «access_token=» и перед «;» ?

Код

 echo $(curl -D text.txt -ivk -H "Content-type: application/json"  --data '{"username":"username", "password":"password", "grant_type":"password" }' https://192.168.0.20/api/v1/auth/login | grep -Fi Set-Cookie)
echo $result
 

Ответ терминала

 $ /c/Users/mark.fomin/Desktop/test1.sh
> POST /api/v1/auth/login HTTP/1.1
> Host: 192.168.0.20
> User-Agent: curl/7.70.0
> Accept: */*
> Content-type: application/json
> Content-Length: 73
>
} [73 bytes data]
* upload completely sent off: 73 out of 73 bytes
{ [5 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Type: application/json
< X-Powered-By: Plural
< Access-Control-Allow-Origin: *
< Cache-Control: no-store
< Pragma: no-cache
< Set-Cookie: access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJXQS0yMjAwIiwibmJmIjoxNjA3NDUzNDY5LCJleHAiOjE2MDc0NTM3Njl9.KG4GXVLaTQ1TCe2nxOIVjLAHZyGNizbgM0Wb94-dkZI ;refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoicmVmcmVzaF90b2tlbiIsImlzcyI6IldBLTIyMDAiLCJuYmYiOjE2MDc0NTM0NjksImV4cCI6MTYwNzQ1Mzc2OX0.hjJ6Ik5k6mVd19Yb9XVVlojq0_EIL-AGkZnSXmtdGe0; Path=/api; Secure
< Content-Length: 462
< Date: Tue, 08 Dec 2020 18:51:08 GMT
< Server: lighttpd/1.4.45
<
{ [5 bytes data]
100   535  100   462  100    73   1113    175 --:--:-- --:--:-- --:--:--  1286
* Connection #0 to host 192.168.0.20 left intact
Set-Cookie: access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJXQS0yMjAwIiwibmJmIjoxNjA3NDUzNDY5LCJleHAiOjE2MDc0NTM3Njl9.KG4GXVLaTQ1TCe2nxOIVjLAHZyGNizbgM0Wb94-dkZI ;refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoicmVmcmVzaF90b2tlbiIsImlzcyI6IldBLTIyMDAiLCJuYmYiOjE2MDc0NTM0NjksImV4cCI6MTYwNzQ1Mzc2OX0.hjJ6Ik5k6mVd19Yb9XVVlojq0_EIL-AGkZnSXmtdGe0; Path=/api; Secure
 

Ответ №1:

Одна awk идея, которая заменяет grep и возвращает только нужный токен:

 curl ... | awk -F'[=;]' '/Set-Cookie/{gsub(" ","",$2);print $2;exit}'
 

Где:

  • -F'[=;]' — использовать = и ; в качестве разделителей полей ввода
  • /Set-Cookie/ — сопоставьте любую строку со строкой Set-Cookie (я предполагаю, что вызовом будет только 1 такая строка curl )
  • dsub(" ","") — удалить пробелы из поля # 2
  • print $2 — распечатать поле # 2 (желаемый токен)
  • exit — мы нашли то, что хотим, поэтому выйдите

Применение этого awk кода к текстовому блоку (выше, под ответом терминала) генерирует:

 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJXQS0yMjAwIiwibmJmIjoxNjA3NDUzNDY5LCJleHAiOjE2MDc0NTM3Njl9.KG4GXVLaTQ1TCe2nxOIVjLAHZyGNizbgM0Wb94-dkZI
 

Для сохранения в переменной:

 $ result=$(curl ... | awk -F'[=;]' '/Set-Cookie/{gsub(" ","",$2);print $2;exit}')
$ echo "${result}"
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJXQS0yMjAwIiwibmJmIjoxNjA3NDUzNDY5LCJleHAiOjE2MDc0NTM3Njl9.KG4GXVLaTQ1TCe2nxOIVjLAHZyGNizbgM0Wb94-dkZI
 

Ответ №2:

Альтернатива Sed:

 curl ... | sed -rn '/Set-Cookie/s/(^.*Set-Cookie: access_token=)(.*$)/2/p'
 

Найдите строку в выводе curl с помощью «Set Cookie», используя sed, а затем разделите строку на две части на основе регулярных выражений. Замените строку для второго раздела и распечатайте.