2013-12-15 3 views
1

Я хочу загрузить файл автоматически в файлы rackspace, для которого требуется обновляемый токен-токен, поэтому я хочу создать скрипт, который получает токен аутентификации, а затем использует его в скрипте для загрузки файла.Использование вывода JSON в скрипте curl bash

Это команда, чтобы получить маркер аутентификации, который выводит ключ отлично:

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

спасибо, я сделал это и попытался повторить его, используя: echo "$ token" и ошибка была токена: команда не найдена. Разве это не правильный способ использования переменных в командах? –

+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

Я настоятельно рекомендую пропускать локон и используя один из специальных языковых SDKs найденных на http://developer.rackspace.com

Они все аутентификации ручки легко и повторной аутентификации для долгоживущих процессов. У всех есть примеры того, как загружать файлы.

+0

спасибо, но все, что я хочу, это очень простой скрипт, который можно запускать ежедневно на машине с низким энергопотреблением –

2

Я знаю, что это немного не по теме, но я хотел поделиться своим «рабочим процессом», который может помочь многим людям.

Если вы загружаете эти две холодные игрушки (замена для скручивания и 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) 

Easy лексем использования для последующего использования:

auth="X-Auth-Token:$token" 

Get конечных точек для Сидней облачных файлов (изменение SYD для ваш любимый центр данных) (измените publicURL на internalURL, если вы работаете изнутри DC):

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" 

Получить публичный URL CDN для my_container:

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

Просмотр вашего файла:

firefox "$pub_url/python1.jpg" 

Все API Docs здесь: http://docs.rackspace.com/files/api/v1/cf-devguide/content/API_Operations_for_Storage_Services-d1e942.html

Наслаждайтесь :)

+0

, это потрясающе! определенно сохраняя это для будущего использования, но на данный момент основные завитки и mstool.json будут делать –

 Смежные вопросы

  • Нет связанных вопросов^_^