#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(" ","")
— удалить пробелы из поля # 2print $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, а затем разделите строку на две части на основе регулярных выражений. Замените строку для второго раздела и распечатайте.