Добрый день.
Запилил скриптик для запуска команды на нескольких серверах. Всё это давно реализовано и есть куча готовых инструментов, но у меня ситуация была обусловлена тем, что у клиента стоят аиксы и доступ по ssh имеется только к одному, через который можно подключаться к другим. Есть dsh, но чтобы он работал нормально, нужно сидеть и копировать ssh ключи на сервера, а делать это у клиента не хочется, да и время займёт. Да, конечно, иметь одинаковые пароли на серверах не очень хорошо, но ситуации бывают разные, к примеру, использование скрипта непривилегированным пользователем для мониторинга состояния и т.п. Для работы скрипта понадобится установить программу expect, благо в репозиториях она лежит, а на аиксах предустановлена.
Скрипт состоит из 3 файлов:
- cycle - запускает цикл и запрашивает некоторые данные: имя пользователя, пароль, команда и файл со списком ip-адресов
- script - собственно «бэкэнд», куда передаются данные и выполняется команда.
- ip_addr - название файла со списком айпи адресов
Оставил возможность вручную указывать файл с ip адресами, чтобы можно было создать несколько файлов с разными адресами (для разных учётных данных, разных организаций и т.п.).
Содержимое скриптов:
- cycle:
#!/bin/bash IFS=$'\n' # make newlines the only separator (to use command with spaces) read -p "$(echo -e 'Username: ')" username read -sp "$(echo -e 'Password: ')" password read -p "$(echo -e '\nCommand: ')" command read -p "$(echo -e 'IP address list: ')" ip_addr while read ip; do expect -f script $username $password $command $ip done < ip_addr
- script:
#!/usr/bin/expect set timeout -1 set username [lindex $argv 0] set password [lindex $argv 1] set command [lindex $argv 2] set ip [lindex $argv 3] spawn ssh -oStrictHostKeyChecking=no $username@$ip $command expect { "assword:" { send "$password\r"; } } eof $spawn_id
Записал видео, чтобы было представление, как это всё работает. В видео указан два раза локалхост для примера.
P.S. Протестировал я значит скрипт на аиксах и нифига! На линуксах работает, а на аиксах пришлось подправлять. Интересно. Вот рабочий конфиг для аиксов:
- cycle:
#!/usr/bin/bash IFS=$'\n' # make newlines the only separator (to use command with spaces) read -p "$(echo -e 'Username: ')" username read -sp "$(echo -e 'Password: ')" password read -p "$(echo -e '\nCommand: ')" command read -p "$(echo -e 'IP address list: ')" ip_addr for ip in $(cat < $ip_addr) ; do expect -f script $username $password $command $ip; done
- script:
#!/usr/bin/expect -f set timeout -1 set username [lindex $argv 0] set password [lindex $argv 1] set command [lindex $argv 2] set ip [lindex $argv 3] spawn ssh -oStrictHostKeyChecking=no $username@$ip $command expect "password:" send "$password\r" interact