ssh não-interativo e scp para 100 servidores

1

Eu preciso copiar alguns dados de um cluster de máquinas muito restritas através da rede que atualmente tem problemas de DNS (portanto, algumas conexões não estão funcionando bizarramente). Descobri que a única maneira de copiar os dados de uma máquina está executando o scp dessa máquina. Por enquanto, o fluxo de trabalho é:

  1. para cada máquina em máquinas
  2. ssh machine
  3. insira a senha
  4. scp files destination:results
  5. insira a senha
  6. aguarde
  7. repita para sempre

Eu estou ficando louco por esse trabalho manual. Eu quero uma solução que me permita inserir a senha uma única vez. Eu procurei por soluções. A maioria recomenda instalar chaves SSH, mas isso requer o mesmo procedimento para distribuir as chaves. Outros mencionam o programa expect , mas eu não o tenho nesse sistema.

Como isso pode ser feito?

Atualização: A máquina principal roda o FreeBSD 9 e os 100 servidores rodam o Ubuntu 12. Eu não tenho raiz em nenhuma máquina.

    
por Ark-kun 07.04.2013 / 03:47

1 resposta

3

Eu assumirei que estes são todos os hosts Linux e que você tem acesso root a eles. Também assumirei que eles estão usando apt para o gerenciamento de pacotes, mas é fácil aplicar essa solução com yum ou pacman ou qualquer outro gerenciador de pacotes.

Tanto quanto eu sei, ssh não oferece nenhuma maneira de especificar uma senha na linha de comando, então primeiro você precisará instalar sshpass na sua máquina local:

sudo apt-get install sshpass

Isso permitirá que você passe a senha como um argumento de linha de comando:

sshpass -p '<password>' ssh user@server

Agora, crie um arquivo com todos os IPs em que você está interessado, um por linha. Você pode analisar esse arquivo para instalar sshpass em cada máquina remota. Se sua senha for foo e você estiver se conectando como root , faça

while read ip; do 
 sshpass -p 'foo' ssh root@$ip "apt-get install sshpass"; 
done < ips.txt

sshpass agora está instalado em cada servidor. Agora, passe pelos servidores novamente e copie seus arquivos. Se você estiver copiando como root e a root senha para seu destination for bar , faça o seguinte:

while read ip; do 
 sshpass -p 'foo' ssh root@$ip "sshpass -p 'bar' scp files dest:/results/"; 
done < ips.txt

Você também pode usar sshpass para copiar seus arquivos de chave e, desde que você tenha usado uma frase secreta vazia, permitir acesso sem senha para não ter esse problema da próxima vez:

while read ip; do 
   sshpass -p 'foo' ssh root@$ip \
      "sshpass -p 'bar' ssh-copy-id -i ~/.ssh/id_rsa.pub root@destination";
done < ips.txt

Uma vez feito isso, você poderá copiar os arquivos usando:

while read ip; do ssh root@$ip "scp files dest:/results/"; done < ips.txt
    
por 07.04.2013 / 04:46

Tags