我想自动将文件上传到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知道问题是什么。
谢谢!
答案 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
它们都可以轻松处理身份验证,并为长期存在的进程重新进行身份验证。他们都有如何上传文件的例子。