在curl-bash脚本中使用JSON输出

在curl-bash脚本中使用JSON输出,bash,curl,rackspace-cloud,Bash,Curl,Rackspace Cloud,我想将一个文件自动上载到rackspace文件,该文件需要每天更新的身份验证令牌,因此我想创建一个脚本,获取身份验证令牌,然后在脚本中使用该令牌上载文件 此命令用于获取能够完美输出密钥的身份验证令牌: curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens\ -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"USER", "apiKey":"KEY

我想将一个文件自动上载到rackspace文件,该文件需要每天更新的身份验证令牌,因此我想创建一个脚本,获取身份验证令牌,然后在脚本中使用该令牌上载文件

此命令用于获取能够完美输出密钥的身份验证令牌:

curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens\
     -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"USER", "apiKey":"KEY" } } }'\
     -H "Content-type: application/json" | python -mjson.tool |\
python -c 'import sys, json;\
           print json.load(sys.stdin)[sys.argv[1]][sys.argv[2]][sys.argv[3]]'\
access token id
这是上载文件的命令:

curl -X PUT -T file.xml -D - \
-H "Content-Type: text/xml" \
-H "X-Auth-Token: TOKENGOESHERE" \
URL
我需要将第一个命令中的令牌放入第二个命令中的tokengoesher位置

到目前为止,我尝试的是:

token = curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"USER", "apiKey":"KEY" } } }' -H "Content-type: application/json" | python -mjson.tool | python -c 'import sys, json; print json.load(sys.stdin)[sys.argv[1]][sys.argv[2]][sys.argv[3]]' access token id

curl -X PUT -T file.xml -D - \
-H "Content-Type: text/xml" \
-H "X-Auth-Token: $token" \
URL
但它不起作用,我猜它与引号有关,但我对bash了解不够,不知道问题出在哪里


谢谢

这是您应该使用的模式:

token=`cat /etc/passwd`
echo "file contents: $token"

请注意,正如triplee所指出的,在=符号的两侧不能有空格。

这是您应该使用的模式:

token=`cat /etc/passwd`
echo "file contents: $token"
请注意,正如triplee所指出的那样,=符号的两边都不能有空格。

这应该可以:

token=$(curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens \
    -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"USER", "apiKey":"KEY" } } }' \
    -H "Content-type: application/json" \
    | python -mjson.tool \
    | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["id"]')

curl -X PUT -T file.xml -D - \
    -H "Content-Type: text/xml" \
    -H "X-Auth-Token: $token" \
    URL
这应该起作用:

token=$(curl -s -X POST https://auth.api.rackspacecloud.com/v2.0/tokens \
    -d '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"USER", "apiKey":"KEY" } } }' \
    -H "Content-type: application/json" \
    | python -mjson.tool \
    | python -c 'import sys, json; print json.load(sys.stdin)["access"]["token"]["id"]')

curl -X PUT -T file.xml -D - \
    -H "Content-Type: text/xml" \
    -H "X-Auth-Token: $token" \
    URL

我强烈建议跳过curl并使用在上找到的特定于语言的SDK之一


它们都可以轻松地处理身份验证和长寿命进程的重新身份验证。他们都有如何上传文件的例子

我强烈建议跳过curl并使用在上找到的特定于语言的SDK之一


它们都可以轻松地处理身份验证和长寿命进程的重新身份验证。他们都有如何上传文件的例子

我知道这有点离题,但我想分享我的“工作流程”,这可能会帮助很多人

如果您下载这两个很酷的玩具(替换curl和python的json):

然后你可以做所有这些有趣的事情:

(只需在第1行中用真实用户和密钥替换用户和密钥,其他所有用户和密钥都可以复制和粘贴

获取json:

json=$(echo '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"USER", "apiKey":"KEY" } } }' | http POST https://auth.api.rackspacecloud.com/v2.0/tokens)
使用http获取令牌:

token=$(echo $json | jq '.access | .token | .id' | sed s/\"//g)
便于以后使用令牌:

auth="X-Auth-Token:$token"
获取Sydney cloud文件的端点(更改您喜爱的数据中心的SYD)(如果您是从DC内部运行,请将publicURL更改为internalURL):

--艰苦的工作已经完成,现在变得容易了--

获取容器列表:

http "$url" $auth
创建一个容器:

http PUT "$url/my_container" $auth
http PUT "$cdn_url/my_container" $auth "X-Cdn-Enabled: True"
pub_url=$(http -h HEAD "$cdn_url/my_container" $auth  | awk '/X-Cdn-Uri/{print $2;}')
上载文件:

cat python1.JPG | http PUT "$url/my_container/python1.jpg" $auth
列出文件:

http "$url/my_container"
获取CDN API URL(不是用于下载的URL,以后再说):

CDN启用容器:

http PUT "$url/my_container" $auth
http PUT "$cdn_url/my_container" $auth "X-Cdn-Enabled: True"
pub_url=$(http -h HEAD "$cdn_url/my_container" $auth  | awk '/X-Cdn-Uri/{print $2;}')
获取my_容器的公共CDN url:

http PUT "$url/my_container" $auth
http PUT "$cdn_url/my_container" $auth "X-Cdn-Enabled: True"
pub_url=$(http -h HEAD "$cdn_url/my_container" $auth  | awk '/X-Cdn-Uri/{print $2;}')
查看您的文件:

firefox "$pub_url/python1.jpg"
所有API文档都在这里:


享受:)

我知道这有点离题,但我想分享我的“工作流程”,它可能会帮助很多人

如果您下载这两个很酷的玩具(替换curl和python的json):

然后你可以做所有这些有趣的事情:

(只需在第1行中用真实用户和密钥替换用户和密钥,其他所有用户和密钥都可以复制和粘贴

获取json:

json=$(echo '{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"USER", "apiKey":"KEY" } } }' | http POST https://auth.api.rackspacecloud.com/v2.0/tokens)
使用http获取令牌:

token=$(echo $json | jq '.access | .token | .id' | sed s/\"//g)
便于以后使用令牌:

auth="X-Auth-Token:$token"
获取Sydney cloud文件的端点(更改您喜爱的数据中心的SYD)(如果您是从DC内部运行,请将publicURL更改为internalURL):

--艰苦的工作已经完成,现在变得容易了--

获取容器列表:

http "$url" $auth
创建一个容器:

http PUT "$url/my_container" $auth
http PUT "$cdn_url/my_container" $auth "X-Cdn-Enabled: True"
pub_url=$(http -h HEAD "$cdn_url/my_container" $auth  | awk '/X-Cdn-Uri/{print $2;}')
上载文件:

cat python1.JPG | http PUT "$url/my_container/python1.jpg" $auth
列出文件:

http "$url/my_container"
获取CDN API URL(不是用于下载的URL,以后再说):

CDN启用容器:

http PUT "$url/my_container" $auth
http PUT "$cdn_url/my_container" $auth "X-Cdn-Enabled: True"
pub_url=$(http -h HEAD "$cdn_url/my_container" $auth  | awk '/X-Cdn-Uri/{print $2;}')
获取my_容器的公共CDN url:

http PUT "$url/my_container" $auth
http PUT "$cdn_url/my_container" $auth "X-Cdn-Enabled: True"
pub_url=$(http -h HEAD "$cdn_url/my_container" $auth  | awk '/X-Cdn-Uri/{print $2;}')
查看您的文件:

firefox "$pub_url/python1.jpg"
所有API文档都在这里:


享受:)

捕获命令输出的语法是
token=$(curl…
。当第一个空格后的选项被尝试作为命令时,您只需分配静态字符串值
token=curl
,并获得一条错误消息(您应该将其包含在诊断中)。谢谢,我这样做了,并尝试使用:echo“$token”来回显它,错误是:找不到token:command。这不是在命令中使用变量的正确方法吗?您需要避免等号周围出现空格。捕获命令输出的语法是
token=$(curl…
)。当第一个空格后的选项被尝试作为命令时,您只需分配静态字符串值
token=curl
,并获得一条错误消息(您应该将其包含在诊断中)。谢谢,我这样做了,并尝试使用:echo“$token”来回显它,错误是:找不到token:command。这不是在命令中使用变量的正确方法吗?您需要避免等号周围的空格。谢谢,但是我想要的是一个非常简单的脚本,可以在非常低功耗的linux机器上每天运行,但是我想要的是一个非常简单的脚本,可以在非常低功耗的linux机器上每天运行。这太棒了!当然,这是为了将来使用而保存的,但是现在基本的curl和mstool.json都可以了,这太棒了!当然可以保存它以备将来使用,但现在基本的curl和mstool.json就可以了