Saída estranha ao usar ssh dentro de um loop sobre um arquivo

2

O script é ler um arquivo que contém várias linhas, cada linha contendo uma matriz delimitada por tabulação. Eu quero executar alguns comandos remotos que levam esses elementos de matriz como argumentos, com permissão sudo. Aqui está o script de exemplo:

while IFS=$'\t' read -r -a line
do
  echo ${line[0]}
  ssh -tty -o StrictHostKeyChecking=no ${line[0]} 'sudo echo ${line[1]}; sudo echo ${line[2]}' 
done < nodes.txt

Aqui está o arquivo de entrada de exemplo:

rivervm-1       dc2     rack1
rivervm-2       dc2     rack2
rivervm-3       dc2     rack3
rivervm-4       dc2     rack4

A saída deve ser 12 variáveis, cada uma em uma nova linha. No entanto, isso é o que eu recebi:

rivervm-1
rivervm-2   dc2 rack2
rivervm-3   dc2 rack3
rivervm-4   dc2 rack4

Connection to rivervm-1 closed.

Alguma ideia?

    
por roymaztang 05.01.2017 / 20:44

2 respostas

0

Primeiramente, seu comando ssh está comendo sua entrada (vindo de nodes.txt ), anexando < /dev/null a ela. Anexar um & tem o mesmo efeito, pois colocando ssh em segundo plano, ele o separa da entrada padrão.

Em segundo lugar, como notado por Kusalananda, suas variáveis ${line[1]} e ${line[2]} não são substituídas porque elas estão entre aspas simples.

    
por 05.01.2017 / 21:14
0

Em relação ao comentário de @Kusalananda, o shell não expandirá as variáveis entre aspas simples. Isso explica porque echo inside ssh não funciona. Depois de substituir aspas simples por aspas duplas, a saída é como:

rivervm-1
rivervm-2   dc2 rack2
rivervm-3   dc2 rack3
rivervm-4   dc2 rack4
dc2
rack1
Connection to rivervm-1 closed.

Ainda assim, ele só executa os comandos no rivervm-1, mas não o resto.

Encontrei uma solução para isso: adicionar '&' ao final do comando ssh. Alguém poderia me explicar por que isso funciona? Obrigado!

    
por 05.01.2017 / 21:00