Fazer um loop por meio de vários servidores que não possuem chaves requer um loop por meio de um arquivo com suas senhas em texto sem formatação ou uma criptografia simples. Eu recomendaria altamente contra fazer isso pessoalmente, especialmente se estiver em um ambiente de produção.
Aviso - não recomendo isso
Uma solução rápida e suja pode ser feita com sshpass
e um arquivo de texto contendo os nomes de host do servidor, com suas senhas:
serverList.txt:
server1 password1
server2 password2
realmente exemplo de script inseguro:
for host in $(awk '{print $1}' serverList.txt); do
password=$(grep -w "$host" serverList.txt | awk '{print $2}')
sshpass -p "$password" ssh $host < ./script.sh
done
Isso é o que eu recomendo:
Se isso é algo que você precisa fazer regularmente, recomendo pesquisar em dsh
(shell distribuído).
Instalação
Instalá-lo no Debian / Ubuntu é fácil:
sudo apt-get install dsh
para distribuições baseadas em RHEL, você terá que compilar libdshconfig
primeiro, depois dsh
:
# libdshconfig
wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.10.cvs.1.tar.gz
tar xfz libdshconfig*.tar.gz
cd libdshconfig-*
./configure ; make
make install
# dsh
wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.22.0.tar.gz
tar xfz dsh-0.22.0.tar.gz
cd dsh-*
./configure ; make
make install
Configuração
A configuração para dsh
usará por padrão rsh
como protocolo de login. Provavelmente, você desejará alterar isso para ssh
, pois rsh
não está criptografado.
se instalado via apt
, o arquivo de configuração será /etc/dsh/dsh.conf
- se você teve que compilá-lo para distribuições baseadas em RHEL, então o arquivo de configuração será /usr/local/etc/dsh.conf
atualize isto:
remoteshell =rsh
para isso:
remoteshell =ssh
Depois de fazer isso, você precisará de uma lista de máquinas nas quais deseja executar as coisas. Para o debian, este arquivo será /etc/dsh/machines.list
, para o RHEL será /usr/local/etc/dsh/machines.list
O formato da lista pode ser hostname, IP ou FQDNs separados por uma nova linha. Por exemplo, isso seria um arquivo machines.list
válido, desde que todos os nomes de host ou FQDNs sejam resolvidos:
10.20.30.40
10.20.30.31
server1.stackexchange.com
server2
root@myOtherServer
Exemplos
Neste ponto, agora você pode executar comandos sequencialmente ou em paralelo em vários hosts em machines.list
Sequencialmente, apenas com a saída de retorno:
dsh -a <command>
$ dsh -a echo hello
hello
hello
imprima cada nome de host como um prefixo para sua saída correspondente:
dsh -a -M <command>
$ dsh -a -M echo hello
root@server1: hello
root@server2: hello
faça o mesmo, mas em vez de sequencialmente, execute o comando ao mesmo tempo:
dsh -aMc <command>
use apenas hosts selecionados:
dsh -Mc -m <host1> -m <host2> <command>
Advertências
Portanto, o problema com isso em seu cenário é que você exigiria a configuração de chaves ssh (a menos que você esteja feliz em digitar a senha para cada host), e você também precisaria do script em cada um dos hosts.
Eu pessoalmente diria que essa seria a melhor e mais segura maneira de executá-la, dependendo do tamanho do script, já que você não precisa passar o script pelo ssh para cada host, todos eles podem executar o script script localmente.