Віддалений для циклу через 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 shell.


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.