重击无法读取变量

时间:2018-08-13 14:26:43

标签: bash shell azure azure-log-analytics

我正在卷曲Azure Log Analytics以获取一些信息,但是首先我需要从1个命令中获取OAuth令牌,并将其传递给下一个。我有以下经过自我测试良好的Curl命令(复制粘贴输出以供下一个输入使用),但是我想将OAuth令牌输出作为变量传递给自动化任务,但由于某种原因,它无法执行将该变量读入下一个命令。

token=$(curl -X POST \
  https://login.microsoftonline.com/{{subscriptionID}}/oauth2/token \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=client_credentials&client_id={{clientID}}&client_secret={{clientSECRET}}&resource=https%3A%2F%2Fapi.loganalytics.io' \
  | jq .access_token)


curl -X POST \
  https://api.loganalytics.io/v1/workspaces/{{workspaceID}}/query \
  -H 'Authorization: Bearer $token' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{ "query": "AzureActivity | summarize count() by Category" }'

不幸的是,当我运行此命令时,它会回复需要令牌。

{"error":{"message":"Valid authentication was not provided","code":"AuthorizationRequiredError"}}

但是,如果我要回显$token变量,则表明它已保存

beefcake@ubuntu:~$ echo $token
"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1...."

正如我所说,如果删除token=$(..)并仅将输出复制/粘贴到下一个输入中,则命令可以正常工作。有什么想法为什么对自动化不起作用?

1 个答案:

答案 0 :(得分:1)

@Aserre有正确的心态。事实证明,jq从字符串中复制了反向逗号" ",而不记名令牌则不需要。因此,我的第一个命令应该看起来像这样:

token=$(curl -X POST \
  https://login.microsoftonline.com/{{subscriptionID}}/oauth2/token \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=client_credentials&client_id={{clientID}}&client_secret={{clientSECRET}}&resource=https%3A%2F%2Fapi.loganalytics.io' \
  | jq -r .access_token)

请注意,最后一行具有-r命令,用于删除双引号。显示回显:

beefcake@ubuntu:~$ echo $token
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIs....

请注意,从回声中删除了" "。除此之外,我还必须更改下一个命令,将'Authorization: Bearer $token'替换为"Authorization: Bearer $token"

curl -X POST \
  https://api.loganalytics.io/v1/workspaces/{{workspaceID}}/query \
  -H "Authorization: Bearer $token" \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{ "query": "AzureActivity | summarize count() by Category" }'