在curl bash脚本中使用JSON输出

时间:2013-12-15 09:57:31

标签: bash curl rackspace-cloud

我想自动将文件上传到rackspace文件,这需要每天更新的auth-token,因此我想创建一个获取auth令牌的脚本,然后在脚本中使用该脚本上传文件。

这是获取完全输出密钥的身份验证令牌的命令:

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

我需要将第一个命令中的令牌放入第二个命令中的TOKENGOESHERE位置。

到目前为止我尝试的是:

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知道问题是什么。

谢谢!

4 个答案:

答案 0 :(得分:5)

这应该有效:

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

答案 1 :(得分:2)

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

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

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

(只需将您的真实用户和密钥替换为第一行的USER和KEY,其他所有用户都可以复制和粘贴。

获取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"

获取悉尼云文件的端点(更改您最喜欢的数据中心的SYD)(如果您在DC内部运行,请将publicURL更改为internalURL):

url=$(echo $json | jq '.access | .serviceCatalog | .[] | select(.name == "cloudFiles") | .endpoints | .[] | select(.region == "SYD") | .publicURL' | sed s/\"//g)

- 努力工作。现在变得容易了 -

获取容器列表:

http "$url" $auth

创建一个容器:

http PUT "$url/my_container" $auth

上传文件:

cat python1.JPG | http PUT "$url/my_container/python1.jpg" $auth

列出文件:

http "$url/my_container"

获取CDN API URL(不是下载的URL,稍后):

cdn_url=$(echo $json | jq ' .access | .serviceCatalog | .[] | select(.name == "cloudFilesCDN") | .endpoints | .[] | select(.region == "SYD") | .publicURL' | sed s/\"//g)

CDN启用容器:

http PUT "$cdn_url/my_container" $auth "X-Cdn-Enabled: True"

获取my_container的公开CDN网址:

pub_url=$(http -h HEAD "$cdn_url/my_container" $auth  | awk '/X-Cdn-Uri/{print $2;}')

查看您的文件:

firefox "$pub_url/python1.jpg"

所有API文档都在这里:http://docs.rackspace.com/files/api/v1/cf-devguide/content/API_Operations_for_Storage_Services-d1e942.html

享受:)

答案 2 :(得分:1)

这是您应该使用的模式:

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

注意,正如三元组指出的那样,你不能在=符号的两边都有空格。

答案 3 :(得分:1)

我强烈建议您跳过curl并使用http://developer.rackspace.com上找到的一种特定于语言的SDK

它们都可以轻松处理身份验证,并为长期存在的进程重新进行身份验证。他们都有如何上传文件的例子。