Удаленный цикл по SSH


12

У меня есть следующее в сценарии

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

Но это не работает. Странная вещь, я вижу $ I количество возвращаемых строк. Итак, если у меня есть десять файлов, я вижу десять пустых строк.


посмотрите также на опцию GNU Parallel --sshlogin .
Себастьян

Ответы:


19

Ваша локальная оболочка интерпретирует ${i}внутри двойные кавычки ( "), поэтому команда работает

ssh user@some.serv.er "for i in /tmp/foo* ; do echo; done"

Просто используйте одиночные кавычки ( '), и ваша проблема исчезнет:

ssh user@${server} 'for i in /tmp/foo* ; do echo $i; done'

1

Просто столкнулся с этой проблемой немного назад, и данное решение, хотя оно и работает, не слишком эффективно, если вы также извлекаете переменные из локальной оболочки, перед тем как ssh создаст массив для итерации. Немного сложнее было бы просто сначала избежать $, так что это будет

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

Который избежал бы его в локальной конструкции, а не в вызываемой оболочке ssh.


0

Я обновил ответ выше, чтобы получить порты из списка тоже.

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.