2013-12-15 49 views
1

我要自動將文件上傳到Rackspace公司需要一個auth令牌每天更新的文件,所以我想創建一個腳本,獲取身份驗證令牌,然後使用該腳本上傳文件。在捲曲bash腳本使用JSON輸出

這是命令來獲得身份驗證令牌,輸出完美的關鍵:

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 

,但它沒有工作,我猜它是與引號,但我不知道有足夠的瞭解慶典知道什麼問題是。

謝謝!

+0

的語法來捕獲命令的輸出是'令牌= $(捲曲...)'。當第一個空格之後的選項作爲命令嘗試時,您只需簡單地分配靜態字符串值'token = curl'並獲取一條錯誤消息(您應該包含這些錯誤消息用於診斷)。 – tripleee

+0

謝謝,我這樣做,並試圖用它回聲: 回聲「$令牌」 和錯誤是令牌:未找到命令。這不是在命令中使用變量的正確方法嗎? –

+1

您需要避免在等號周圍留出空白。 – tripleee

回答

4

這應該工作:

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

這是你應該使用模式:

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

注意,如triplee指出,那你一定不會對等號兩邊的空間。

1

我強烈建議跳過捲曲和使用上http://developer.rackspace.com

他們都處理身份驗證輕鬆,再認證的長壽命過程中發現的特定語言的SDK的一個。他們都有如何上傳文件的例子。

+0

謝謝,但我想要的只是一個非常簡單的腳本,可以在非常低功耗的linux機器上每日運行 –

2

我知道這是一個有點題外話,但我想分享我的「工作流程」,這可以幫助很多人。

如果你下載這兩個很酷的玩具(更換捲曲和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 GET令牌:

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(而不是一個可供下載,這是更高版本):

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

享受:)

+0

這太棒了!明確保存,以備將來使用,但現在基本捲曲和mstool.json會做 –