Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 从curl请求中提取令牌并在另一个shell命令中使用_Json_Bash_Curl_Jq - Fatal编程技术网

Json 从curl请求中提取令牌并在另一个shell命令中使用

Json 从curl请求中提取令牌并在另一个shell命令中使用,json,bash,curl,jq,Json,Bash,Curl,Jq,我已经开始学习bash脚本,我被困在一些我正努力想解决的问题上 我有一个输出令牌的curl命令,我需要在以下命令中使用它: curl -k 'https://server:port/session' -X POST -H 'Content-Type: application/json' -d '{"username":"admin","password":"password"}' 然后在此处输出一个令牌: {"token":"ac07098ad59ca6f3fccea0e2a2f6cb080d

我已经开始学习bash脚本,我被困在一些我正努力想解决的问题上

我有一个输出令牌的curl命令,我需要在以下命令中使用它:

curl -k 'https://server:port/session' -X POST -H 'Content-Type: application/json' -d '{"username":"admin","password":"password"}'
然后在此处输出一个令牌:

{"token":"ac07098ad59ca6f3fccea0e2a2f6cb080df55c9a52fc9d65"}
然后我需要在后续命令中使用它

curl https://server:port/ -k -X POST -H 'Content-Type: application/json' -H 'X-Cookie:token=token' -d '
我想我可以将令牌输出到一个文件,然后让一个sed命令将令牌写入一个文件,然后新命令使用一个变量,其中token=$token

谢谢

使用``语法:

cmd1result=$(command1 | cut -d ':' -f 2 | grep -Po "[a-z0-9-]+")
command2 $cmd1result

这就是JSON解析工具的用武之地(例如:

所以

json=$(curl-k'https://server:port/session'-X POST-H'内容类型:application/json'-d'{“username”:“admin”,“password”:“password”})

token=$(jq-r).token“如果安装了Python,并且希望它在现代系统上,您可以执行以下操作:

OUTPUT="$(curl -k 'https://server:port/session' -X POST -H 'Content-Type: application/json' -d '{"username":"admin","password":"password"}' | python -c "import sys, json; print json.load(sys.stdin)['token']")"
这将为您提供:

echo $OUTPUT
ec2e99a1d294fd4bc0a04da852ecbdeed3b55671c08cc09f

除了bash之外没有其他工具(已测试Centos/Rhel7/GitBash):

然后使用以下命令:

curl https://server:port/ -k -X POST \
                          -H 'Content-Type: application/json' \
                          -H 'X-Cookie:token=$token' -d ...'

但是,它可以工作,我只需要“ac07098ad59ca6f3fccea0e2a2f6cb080df55c9a52fc9d65”部分,不带引号。它将始终是一个随机的48个字符字符串。例如:“X-Cookie:token=AC07098AD59CA6F3FCCEA0E2A2F6CB080DF55C9A52C9D65”
$()
是现代的替代品。Backticks实际上是传统的支持,有严重的缺点——很容易嵌套
$($())
,而将Backticks放在Backticks中是痛苦的。而且您的grep命令会从令牌中删除十六进制数字。因此,它不准确/损坏,并且(由于不必要地使用非标准选项
-P
)不必要地特定于平台。(请注意,
标记
中的
e
是需要保留的字符集的一部分,因为
e
[0-9a-f]
范围内,因此仅剥离字符范围是完全不可行的)。安装WSL并在Windows上安装Linux。Hi@teikitel如果我使用格式为Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.Eyjzdwiiij5bwfUdWnoyxJPyW4IlcjleHaiOjE2mji3OTC5mzl9.d7yT6r8pf0QEh-sMDxNiObDSdF2K17l3WqcjHnv9800Hello@MichaelKors的Bear Token怎么办?通常情况下,如果您的身份验证服务重新运行的响应负载仅包含一个st类似于“Bearer eyJhbG…”的环。因此它更简单,无需解析:
token=$json
。那么您应该使用的http头是
-H'Authorization:$token'
,而不是
-H'X-Cookie…
echo $OUTPUT
ec2e99a1d294fd4bc0a04da852ecbdeed3b55671c08cc09f
json=$(curl -k 'https://server:port/session' \
            -X POST -H 'Content-Type: application/json' \
            -d '{"username":"admin","password":"password"}') \
&& token=$(echo $json | sed "s/{.*\"token\":\"\([^\"]*\).*}/\1/g") \
&& echo "token = $token"
curl https://server:port/ -k -X POST \
                          -H 'Content-Type: application/json' \
                          -H 'X-Cookie:token=$token' -d ...'