Одновременный запуск команд терминала на нескольких системах в одной сети
Заголовок формулирует вопрос. Мне нужно одновременно запускать команды терминала в нескольких системах. Например, мне нужно запустить
sudo apt install -y firefox
на каждом компьютере в той же сети. Скажем, у меня есть список IP-адресов всех компьютеров, и имя пользователя и пароль каждого компьютера идентичны. Все системы работают под управлением Ubuntu 20.04 LTS или 16.04 LTS . Цель этого состоит в том, чтобы сэкономить время, выполняя команды на более чем 100 компьютерах вручную.
Короче говоря, компьютер действует как администратор и запускает команды на других компьютерах.
3 ответа
Примечание. Первоначально вопрос задавался об одновременном запуске команд на нескольких машинах, поэтому моим первым решением было использование Tmux. Это, вероятно, не подходит для сотен машин одновременно.
Используйте Tmux (полностью или частично вручную) или напишите скрипт (полностью автоматически).
Рекомендуется ознакомиться с командами и ярлыками Tmux — желательно, создав собственную конфигурацию. Но вот как это сделать (вручную) с конфигурацией по умолчанию.
Начать новую сессию:
tmux new -s mysession
Разделите окно на X областей:
- Ctrl+ b, затем %(разделить по горизонтали)
- Ctrl+ b, затем "(разделить по вертикали)
Перемещайтесь по панелям с помощью Ctrl+ b, затемArrow keys
На каждой панели подключитесь по SSH к другой машине:
ssh user@host
Войдите в командный режим:
- Ctrl+ b, то :. Затем введите:
setw synchronize-panes
(теперь каждая команда отправляется на все панели)
Введите команду, которую хотите запустить:
sudo apt install -y firefox
Теперь это будет работать через SSH на каждой машине.
Вы также можете написать скрипт, который использует Tmux для подключения к вашему списку IP-адресов. И тогда вы можете запускать команды вручную в режиме синхронизации или также по сценарию.
Я бы сказал, что если у вас есть 10 машин, я бы использовал Tmux. Если у вас есть сотни машин, рассмотрите возможность полной автоматизации с помощью скрипта.
Ссылка: Шпаргалка по Tmux .
Я делаю что-то подобное, что довольно легко после настройки. Я создаю псевдонимы на главном ПК для каждого компьютера, поэтому я могу просто ввести 3 буквы для каждого из 10 компьютеров, чтобы подключиться по ssh к каждому и сделать вкладку для каждого. Также псевдонимы для обновления и обновления, и я могу сделать все 10 за несколько минут. Например, одна вкладка su1, следующая su2 и т. д., а затем на каждой вкладке введите ud для apt-get update -y, а затем, когда это будет сделано, на каждой вкладке введите копание для apt-get dist-upgrade -y. Так что я могу сделать 10 почти так же быстро, как один, быстро переключаясь на каждую вкладку терминала. Я также делаю несколько других команд таким образом.
Вот одно из возможных решений, в ссылках в конце ответа представлены темы с более подробной информацией. Вот как работает скрипт, описанный ниже.
1. Создайте исполняемый файл скрипта с именем . Поместите его в свой пользовательский
~/bin
(или же
/usr/local/bin
) будет доступен как команда оболочки.
cat ~/bin/populate-ssh-cmd
#!/bin/bash
# Get the user's input as command
[[ -z ${@} ]] && exit || CMD_EXEC="${@}"
# Get the hosts from ~/.ssh/config whose names are prefixed by `lan-`
HOSTS=$(grep -Po 'Host\s\Klan-.*' "$HOME/.ssh/config")
# Test weather the input command uses sudo
if [[ $CMD_EXEC =~ ^sudo ]]
then
# Ask for password
read -sp '[sudo] password for remote_admin: ' password; echo
# Rewrite the command
CMD_EXEC=$(sed "s/^sudo/echo '$password' | sudo -S/" <<< "$CMD_EXEC")
fi
# loop over the hosts and execute the SSH command, remove `-a` to override the logs
while IFS= read -r host
do
echo -e '\n\033[1;33m'"HOST: ${host}"'\033[0m'
ssh -n "$host" "$CMD_EXEC 2>&1" | tee -a "/tmp/$(basename "${0}").${host}.log"
done <<< "$HOSTS"
chmod +x ~/bin/populate-ssh-cmd
Примечание:
2>&1
перенаправит удаленный STDERR на STDOUT, который передается наtee
команда, которая отобразит его, а также запишет в отдельный файл журнала для каждого удаленного хоста. Чтобы перечислить тип файлов журналаls -la /tmp/populate-ssh-cmd.sh.lan-*
.Скрипт запросит у удаленного администратора
sudo
пароли только один раз, поэтому администраторы всех удаленных экземпляров должны иметь один и тот же пароль.
2. Добавьте записи для хостов локальной сети в свой файл и добавьте к их именам префикс
lan-
. Итак
~/.ssh/config
файл должен выглядеть следующим образом.
Host lan-1-some-additional-info
HostName 192.168.1.101
IdentityFile ~/.ssh/lan-hosts/id_rsa
User remoteUser
Host lan-2-some-additional-info
HostName 192.168.1.102
IdentityFile ~/.ssh/lan-hosts/id_rsa
User remoteUser
Host lan-3-some-additional-info
HostName 192.168.1.103
IdentityFile ~/.ssh/lan-hosts/id_rsa
User remoteUser
3. Используйте
populate-ssh-cmd
сценарий таким образом, как это.
populate-ssh-cmd sudo apt install -y firefox
В приведенном выше сценарии используется аутентификация на основе ключа SSH, что проще для такой реализации и намного безопаснее, чем использование пароля. Если вы хотите использовать аутентификацию на основе пароля, вы можете реализовать
sshpass -p 'footbar'
как это описано в этих ссылках: