2017-02-03 8 views
1

Итак, у меня есть список серверов с длиной n. Мне нужно открыть соединение и отредактировать файл и закрыть его.Bash for loop для выполнения команд на удаленных серверах

Вот что я в настоящее время:

#!/bin/bash 

server_list=(a b c d) 

for i in "${server[@]}"; do ssh "${server[@]}"; cd /etc; cp file file.bak; perl -pi -i 's/find/replace/g' file; exit; done 

Единственная проблема у меня есть, что я не могу выйти из соединения SSH и перейти к следующему в массиве. Я использовал опции -n, -t и -T безрезультатно.

Спасибо.

+0

было бы возможно для вас нет резервной копии на удаленном поле, выполнить ваши глобальные замены локально просто сделать 'УПП файл«$ {сервер [@] }/etc/"' – jiveturkey

+2

Важно понять, что 'ssh '$ {server [@]}" 'является * отдельной командой * из' cd/etc', а поскольку ваш код в настоящее время написан, 'cd/etc' не будет выполняться до выхода 'ssh '$ {server [@]}" '. –

ответ

1

Ваш текущий код не отправляет команды на сеансы ssh. Используйте Heredoc передать ваши команды в ssh:

#!/bin/bash 

    server_list=(a b c d) 
    for i in "${server_list[@]}"; do 
     # 
     # As per Charles' suggestion - "bash -s" makes sure the commands 
     # would run with Bash rather than the default shell on the remote 
     # server. 
     # 
     # I have left your commands exactly as in your question. 
     # They can be written as a single command as per @chepner's recommendation 
     ssh "$i" bash -s << "EOF" 
     cd /etc 
     cp file file.bak 
     perl -pi -i 's/find/replace/g' file 
     exit 
EOF 
    done 
+1

Вы действительно имеете в виду все, кроме EOF (включая shebang), четыре пробела с поля? Я попытался отредактировать, но думаю, что у вас что-то происходит одновременно, поэтому мы закончили топать друг друга. –

+0

Да, я хотел, чтобы этот код был отступом, чтобы сделать его более читаемым. – codeforester

+0

btw, я предполагаю, что вы имеете в виду 'ssh '$ i" ', vs' ssh' $ {server [@]} "' –