Usando a saída de uma função (definida localmente) dentro da chamada SSH

4

Eu criei uma função

function getqueue() {
    urlqueuename="urlcall"    
    ouput='curl $urlqueuename'
    queue=$(echo $ouput | jq -r '.queueName')
    echo $queue
}

Estou usando uma chamada ssh do meu script como:

ssh -T -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "$HOME_DIR/<pemfile>" $username@$IP<<EOF
queue=$(getqueue)
echo "Queue name : $queue"
EOF

Mas a fila está chegando como vazia, Tentei também com $(typeset -f) para usar funções na chamada remota, mas ainda assim a variável está vazia

Qualquer orientação sobre o mesmo seria muito apreciada.

    
por Ajith Sasidharan 03.03.2018 / 08:08

1 resposta

7

O documento here não tem aspas, isso significa que a expansão de variáveis e a substituição de comandos são feitas quando o documento é formado, localmente. Neste caso, não terá o efeito desejado, pois acabaria como algo como

queue=somevalue
echo "Queue name : "

Ou seja, ele se expandirá para um script que define o valor da variável queue , mas como a variável também é expandida dentro da sequência impressa por echo , seu valor correto (no momento da execução) será nunca será exibido.

Note que esta expansão é feita mesmo antes de ssh ser chamado.

Se a chamada curl precisar acontecer no host remoto (realmente não haveria um motivo para enviar um script here-document de outra forma, ou fazer a chamada ssh de todo), cite o documento aqui. Você faz isso usando <<'EOF' .

No entanto, isso também significa que a função getqueue precisa ser definida no ambiente do script remoto. Você precisa incluir essa função no documento here ou selecionar os bits necessários.

Como a função é basicamente apenas

curl urlcall | jq -r '.queueName'

você poderia fazer

ssh -T -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "$HOME_DIR/<pemfile>" "$username@$IP" <<'REMOTE_SCRIPT'
queue=$(curl urlcall | jq -r '.queueName')
printf 'The queue name is "%s"\n' "$queue"
REMOTE_SCRIPT

Se algumas expansões precisarem estar acontecendo localmente e outras remotamente, então não cite o documento here, mas escape do $ que deve ser expandido remotamente. Por exemplo,

ssh user@server <<SCRIPT
remote_var=\$( something )

printf 'remote_var = "%s", local_var = "%s"\n' "\$remote_var" "$local_var"
SCRIPT

No exemplo acima, remote_var está sendo definido remotamente. Não podemos atribuir um valor a local_var no documento here (e esperar poder usar $local_var com esse valor, pelas mesmas razões acima), mas a chamada printf imprimirá o valor que a variável tinha no momento em que o documento here foi expandido (logo antes da chamada para ssh ).

    
por 03.03.2018 / 09:11