извлечение токена из результата curl скриптом оболочки

#json #shell #curl #token

#json #оболочка #curl #токен

Вопрос:

Я пишу этот скрипт

 #!/bin/bash
# cm.sh

  curl -i 
  -H "Content-Type: application/json" 
  -d '
{ "auth": {
    "identity": {
      "methods": ["password"],
      "password": {
        "user": {
          "name": "admin",
          "domain": { "id": "default" },
          "password": "secret"
        }
      }
    }
  }
}' 
  "http://localhost/identity/v3/auth/tokens" ; echo



echo $tokenizer1 
echo $tokenizer2
  

Но все они (awk или sed) одинаковы

   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   540  100   312  100   228    312    228  0:00:01 --:--:--  0:00:01  5142
  

Моя цель — поместить токен в переменную на потом.
Заранее спасибо, ребята.

Комментарии:

1. Я снова открыл это, потому что речь идет не о разборе JSON, а о HTTP-заголовках

Ответ №1:

Вместо того, чтобы использовать прямой результат cURL, вы могли бы сохранить результат в файле и использовать для него свою команду grep. Возможно, что-то вроде этого :

 curl -o boulou.txt http://localhost/identity/v3/auth/tokens amp;amp; cat boulou.txt | grep "X-Subject-Token" | awk '{printf $2}'
  

Редактировать, если вы просто хотите получить желаемый результат, добавьте --silent в команду cURL :

 curl -o boulou.txt http://localhost/identity/v3/auth/tokens --silent amp;amp; cat boulou.txt | grep "X-Subject-Token" | awk '{printf $2}'
  

Правка 2: Если вы хотите экспортировать его и удалить свой файл, вы могли бы использовать что-то вроде этого :

 export OS_TOKEN=$(curl -o billy.txt hhttp://localhost/identity/v3/auth/tokens --silent amp;amp;  cat billy.txt | grep "X-Subject-Token" | awk '{printf $2}') amp;amp; rm billy.txt
  

Комментарии:

1. Я обновил свой ответ @Khalfe, скажите мне, если вам нужно еще что-то

Ответ №2:

«Как мне использовать grep / awk для извлечения заголовка в поле из curl, когда я передаю ему документ JSON, когда содержимое хранится в переменной?» — это действительно очень сложная и уникальная проблема.

Однако, если вы постепенно обработаете каждую часть своего кода, чтобы сузить круг поиска, вы обнаружите, что это гораздо более простой вопрос, который вы могли бы исследовать или задать вместо этого:

Как мне использовать grep / awk для содержимого переменной?

У меня есть переменная, содержащая HTTP-заголовки, и я хочу извлечь значение одного из них. Вот пример:

 variable='Foo: 1
Bar: 2
Baz: 3'
  

Это то, что я пытался получить 2 от Bar :

   # Just hangs
  tokenizer1=$variable `grep "Bar" | awk '{printf $2}'`
  # Is empty
  tokenizer2=$variable | `grep "Bar" | awk '{printf $2}'`
  

Ответ здесь заключается в том, чтобы использовать echo для передачи содержимого, чтобы grep мог прочитать его в stdin:

 tokenizer3=$(echo "$variable" | grep "Bar" | awk '{printf $2}')
  

Это легко применить к вашему примеру:

 tokenizer3=$(echo "$token" | grep "X-Subject-Token" | awk '{printf $2}')
echo "The value is $tokenizer3"
  

Комментарии:

1. awk '/Bar/ { print $2 }' — нет необходимости в предварительном grep .