0

我正在尝试从每 10 秒执行的 curl POST 请求中的“Set-Cookie”标头中解析 access_token 字符串,并将其存储在一个变量中。

此变量将需要用于执行 GET 请求,该请求每 5 分钟一次。该变量将成为请求的一部分。变量 is 是每次执行 POST 请求时都会更改的访问令牌 cookie 字符串。此访问令牌字符串将在第二个 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
4

2 回答 2

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
于 2020-12-08T19:24:56.460 回答
0

Sed 替代方案:

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

使用 sed 在 curl 输出中查找带有“Set Cookie”的行,然后根据正则表达式将该行分成两部分。替换第二部分的行并打印。

于 2020-12-08T20:05:50.860 回答