Remote for-loop sobre SSH

10

Eu tenho o seguinte em um script

for server in ${servers[@]}; do
 echo ${server}
 ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done"
done

Mas isso não funciona. Coisa estranha, eu vejo $ quantidade de linhas de retorno. Então, se eu tiver dez arquivos, vejo dez linhas em branco.

    
por Eldelshell 01.09.2010 / 13:07

3 respostas

18

Seu shell local interpreta o ${i} entre aspas duplas ( " ), então o comando funciona para

ssh [email protected] "for i in /tmp/foo* ; do echo; done"

Basta usar aspas simples ( ' ) e seu problema desaparecerá:

ssh user@${server} 'for i in /tmp/foo* ; do echo $i; done'
    
por 01.09.2010 / 13:12
1

Apenas corri para este problema um pouco atrás, e a solução dada, embora funcione, não é muito eficaz se você também estiver puxando variáveis do shell local, antes do ssh você criar uma matriz para iterar. Um pouco confuso seria escapar do $ inicialmente, então seria

"for i in /tmp/foo* ; do echo \${i}; done"

Qual seria o escape dentro da construção local, não o chamado shell ssh.

    
por 19.10.2016 / 17:19
0

Eu atualizei a resposta acima para obter as portas de uma lista também.

for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
        for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
        do
                (echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
        done
done
    
por 24.08.2018 / 08:12