Одновременный запуск команд терминала на нескольких системах в одной сети

Заголовок формулирует вопрос. Мне нужно одновременно запускать команды терминала в нескольких системах. Например, мне нужно запустить 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'как это описано в этих ссылках:

Другие вопросы по тегам