Como fazer login em vários servidores em um loop

1

Eu tenho um script chamado script.sh. Eu quero executá-lo em várias máquinas como host1, host2 etc. Como fazer o loop de cada servidor, passando nome de usuário e senha?

    
por Prasanth Kumar Reddy 19.09.2018 / 08:49

3 respostas

2

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:

Exemplo de

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.

    
por 19.09.2018 / 11:38
1

Se você deseja executar o script em várias máquinas, será melhor usar parallel , uma ferramenta para fazer exatamente o que deseja.

Veja um tutorial aqui e aqui .

    
por 19.09.2018 / 10:41
0

Use ssh é realmente simples e a maioria dos sysadmin sempre o usa. Vamos supor que neste exemplo há 3 hosts remotos e 1 host ativo. O ativo é chamado host1 e os outros são host2 , host3 e host4 . E o nome de usuário é o mesmo em todos os hosts que são user1 .

Gere o par de chaves ssh (basta pressionar enter até voltar ao shell):

user1@host1$ ssh-keygen -t rsa

Implante a chave pública em host2 , host3 e host4 :

user1@host1$ for i in {2..4}; do ssh-copy-id user1@host$i;done
user1@host2 password:
user1@host3 password:
user1@host4 password:

Passe o script em host1 :

user1@host1$ for i in {2..4}; do scp script.sh user1@host$i:/home/user1 ;done

Execute o script em host1 :

user1@host1$ for i in {2..4}; do ssh user1@host$i 'sh script.sh'; done
    
por 19.09.2018 / 13:30