Usando uma variável para executar um comando curl

1

Eu tenho um problema ao usar o curl no meu script linux:

#!/bin/bash


userName="user";
passWord="password";
tenantName="tenant";

commande="curl -X POST -H \"Content-Type: application/json\" -H 
\"Cache-Control: no-cache\" -H
 \"Postman-Token: 111131da-8254-21b3-1b95-9c12954152c9\" 
-d '{\"auth\":{\"tenantName\":\"$tenantName\",\"passwordCredentials\":
{\"username\":\"$userName\",\"password\":\"$passWord\"}}}'
 \"http://controller:5000/v2.0/tokens\""

Quando a saída da variável commande é copiada e colada no shell ela funciona, mas quando eu uso:

res= $(eval $commande)
#or
res='$commande'

Nenhum desses comandos funciona, e este é o erro de saída que geralmente recebo:

line 11: {"access":: command not found

PS: Se eu fizer

echo $commande

E então eu copio após o resultado no shell que funciona, Se alguém puder me ajudar, isso seria ótimo!

    
por Kingofkech 13.03.2017 / 12:47

1 resposta

7

Uma variável é para dados, não para código. Defina uma função. Isso também simplifica sua cotação.

#!/bin/bash

userName="user"
passWord="password"
tenantName="tenant"

commande () {
    curl -X POST \
         -H "Content-Type: application/json" \
         -H "Cache-Control: no-cache" \
         -H "Postman-Token: ..." \
         -d@- \
         http://controller:5000/v2.0/tokens <<EOF
    {
      "auth": {
        "tenantName": "$tenantName",
        "passwordCredentials": {
          "username": "$userName",
          "password": "$password"
        }
      }
    }
EOF
}

O acima também lê o JSON de um documento aqui ( @- lê o argumento para a opção -d da entrada padrão) em vez de incorporá-lo em uma sequência para simplificar ainda mais as citações.

No entanto, também é uma má idéia codificar JSON manualmente dessa forma, se você não estiver garantindo que os valores de userName , passWord e tennatnName sejam codificados corretamente em JSON. Uma solução melhor é usar algo como jq para gerar JSON adequado para você.

commande () {
  json_template='{
    auth: {
      tenantName: $tn,
      passwordCredentials: {
        username: $un,
        password: $pw
      }
    }
  }'
  jq -n --arg un "$userName" \
        --arg pw "$passWord" \
        --arg tn "$tenantName" "$json_template" |
    curl -X POST
         -H "Content-Type: application/json" \
         -H "Cache-Control: no-cache" \
         -H "Postman-Token: ..." \
         -d@- \
         http://controller:5000/v2.0/tokens
}
    
por 13.03.2017 / 14:16