Передавать строки текстового файла командам как отдельные аргументы?

Использовать кластеры: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, вам не нужно постоянно вводить пароль...

2
18.01.2020, 05:06
2 ответа

Преобразуйте входной файл в сценарий оболочки, используя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
0
27.01.2020, 22:16

Вы можете просмотреть строки файла с помощью команды 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
1
27.01.2020, 22:16

Теги

Похожие вопросы