Использовать кластеры:https://sourceforge.net/projects/clusterssh/
Для параллельного выполнения команд используется как
cssh user@client1 user@client2
Вы получаете окно терминала для каждого клиента и окно команд для параллельного ввода команд на любом терминале.
В каталоге ~/.clusterssh можно задать множество параметров, поэтому клиентов легко группировать по тегам.
Чтобы объединить клиентов из вашего host.txt
,файл ~/.clusterssh/tags
может выглядеть так:
root@host1 tar update
root@host2 tar update
root@host3 tar test
root@host4 update test
root@host5 update test
Таким образом вы определяете теги tar, update и test. Вы можете использовать тег tar
для запуска clusterssh на первых трех хостах, запустив cssh tar
.
Поищите в Интернете clusterssh
, и вы найдете множество полезных документов.
Большинство дистрибутивов Linux содержат clusterssh, поэтому вы можете легко установить его, например, с помощью. apt-get install clusterssh
.
Редактировать:
Вы можете добавить свою команду в clusterssh для выполнения, используя опцию -a
:
cssh tar -a "tar -cvf /tmp/TC.tar.gz /etc"
А если вы используете открытые/закрытые ключи ssh, вам не нужно постоянно вводить пароль...
Преобразуйте входной файл в сценарий оболочки, используяsed
$ sed -e "s|\([^,]*\),\(.*\)|ssh -n \"\1\" 'echo \"\2\" >/root/text.txt'|" file
ssh -n "ip_addr1" 'echo "foo:bar" >/root/text.txt'
ssh -n "ip_addr2" 'echo "foo2:bar2" >/root/text.txt'
ssh -n "user@ip_addr3" 'echo "foo3:bar3" >/root/text.txt'
или awk
,
$ awk -F ',' '{ printf("ssh -n \"%s\" '\''echo \"%s\" >/root/text.txt'\''\n", $1, $2) }' file
ssh -n "ip_addr1" 'echo "foo:bar" >/root/text.txt'
ssh -n "ip_addr2" 'echo "foo2:bar2" >/root/text.txt'
ssh -n "user@ip_addr3" 'echo "foo3:bar3" >/root/text.txt'
Затем сохраните вывод любого из них в файл, используя перенаправление, и запустите его с sh
. Таким образом, у вас дополнительно будет запись о том, какие именно команды были выполнены.
Кроме того, вы можете выполнить вывод любой команды с помощью
...either command above... | sh -s
Вы можете просмотреть строки файла с помощью команды bash read
, как это предлагается в ответах на этот вопрос .
while read -r line
do
# $line will be a variable which contains one line of the input file
done < your_file.txt
Вы можете снова использовать read
с переменной IFS
, чтобы получить содержимое каждой строки, разделенной переменной IFS
, как это предлагается в ответах на этот вопрос .
while read -r line
do
# $line will be a variable which contains one line of the input file
IFS=, read -r ip_addr data <<< "$line"
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
done < your_file.txt
Оттуда вы можете запустить любую команду с новыми переменными.
while read -r line
do
# $line will be a variable which contains one line of the input file
IFS=, read -r ip_addr data <<< "$line"
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
ssh "$ip_addr" "echo \"${data}\" > /root/text.txt"
done < your_file.txt
Если вам не нужна переменная $line
, вы можете использовать одну команду read
.
while IFS=, read -r ip_addr data
do
# now, $ip_addr stores the stuff to the left of the comma, and $data stores the stuff to the right
ssh "$ip_addr" "echo \"${data}\" > /root/text.txt"
done < your_file.txt