используя переменную в команде BASH? - PullRequest
2 голосов
/ 02 марта 2011

У меня 20 машин, каждая из которых выполняет процесс. Машины названы:

["machine1", "machine2", ...., "machine20"]

Чтобы проверить, как работает процесс на machine1, я выполняю следующую команду с удаленного компьютера:

ssh machine1 cat log.txt

Для machine2 я выполняю следующую команду:

ssh machine2 cat log.txt

Аналогичным образом, для machine20 я запускаю следующую команду:

ssh machine20 cat log.txt

Существует ли команда bash, которая позволит мне просматривать выходные данные со всех машин, используя одну команду ?

Ответы [ 7 ]

3 голосов
/ 02 марта 2011

Вы можете хранить все имена своих машин в массиве или текстовом файле и проходить через них.

declare -a machineList=('host1' 'host2' 'otherHost') # and more...


for machine in ${machineList[@]}
do
    ssh $machine cat log.txt
done

Я предполагаю, что ваши машины не называются буквально 'machine1', 'machine2' и т. Д.

Некоторые ссылки:

3 голосов
/ 02 марта 2011

Если машины нумеруются как в вашем примере:

for i in {1..20} ; do ssh machine$i cat log.txt; done

Если у вас есть список машин в файле, вы можете использовать:

cat machinesList.txt | xargs -i ssh {} cat log.txt
2 голосов
/ 02 марта 2011

Я бы порекомендовал использовать программу под названием Shmux . Несмотря на название, он работает очень хорошо. Я использовал его с более чем 100 машинами с хорошими результатами. Он также корректно обрабатывает сбои машины для вас, что может быть недостатком при использовании подхода bash for loop.

Я думаю, что самая крутая вещь в этой программе - это возможность создавать несколько потоков для ваших команд, что позволяет выполнять команды на всех 20 машинах параллельно.

2 голосов
/ 02 марта 2011

Поместите ваши хосты в файл и используйте цикл while, как показано ниже.Обратите внимание на использование флага -n на ssh:

while read host; do ssh -n $host cat log.txt; done < hosts-file

Также вы можете использовать PSSH :

pssh -h hosts-file -i "cat log.txt"
2 голосов
/ 02 марта 2011

Использовать петлю ?

for i in {1..20}
do
   ssh machine$i cat log.txt
done

Но учтите, что вы запускаете cat внутри сеанса удаленной оболочки, а не в текущем сеансе, так что это может работать не совсем так, как вы ожидаете. Попробуйте и посмотрите.

2 голосов
/ 02 марта 2011
for i in {1..20}
do
   ssh machine$i cat log.txt
done
1 голос
/ 02 марта 2011

Помимо предложений по использованию цикла, вы можете взглянуть на такие инструменты, как pssh или dsh , предназначенные для запуска команд на нескольких клиентах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...