Passar matriz para conexão SSH

1

Como posso passar um array pela conexão ssh?

Eu tenho uma matriz formada assim:

declare -a target_array=(
    "item1 -p12345 -r"
    "item2 -p65677 -e"
)

Depois, preciso passá-lo para uma conexão ssh da seguinte forma:

ssh $server target_array=${target_array[@]}" "bash -s" <<TARGETSCRIPT
    echo "hello"
TARGETSCRIPT

Mas isso só me dá o erro:

bash: -p12345: command not found

Qual é a melhor maneira de fazer isso? Eu tentei com e sem {} , com e sem [@] , mas nada parece funcionar.

(n.b. que echo hello é apenas um espaço reservado para um script de 800 linhas que faz uso do target_array).

    
por IGGt 25.01.2016 / 14:46

2 respostas

0

Você não pode colocar a matriz como o primeiro argumento para ssh atrás do host. Ele será avaliado como o comando e obviamente falhará. Se você realmente precisa fazer isso, você deve adicioná-lo ao "script" assim:

ssh $server "bash -s" <<TARGETSCRIPT
    target_array=("${target_array[@]}")
    echo ${target_array[@]}
    echo "hello"
TARGETSCRIPT

Encapsular o array também é útil para garantir que o array permaneça o mesmo do outro lado.

    
por 25.01.2016 / 17:56
2
remote_code=$(cat << 'EOF'
echo Hello
for i in "${!target_array[@]}"; do
  echo "$i -> ${target_array[i]}"
done
EOF
)

ssh server bash << EOF
$(declare -p target_array)
$remote_code
EOF

O shell remoto verá no stdin algo como:

declare -a target_array='([0]="item1 -p12345 -r" [1]="item2 -p65677 -e")'
echo Hello
for i in "${!target_array[@]}"; do
  echo "$i -> ${target_array[i]}"
done

Para evitar a destruição do stdin do shell remoto, e supondo que o ssh e o sshd remoto permitam a passagem de LC_* de variáveis de ambiente, você também pode fazer:

LC_CODE="$(declare -p target_array)
$remote_code" ssh server 'bash -c '\''eval "$LC_CODE"'\'

Se você souber que o shell de login do usuário remoto é bash , basta fazer:

ssh server "$(declare -p target_array)
$remote_code"
    
por 25.01.2016 / 18:43