Escrevendo script que faz login e logout do servidor ssh

Escrevendo script que faz login e logout do servidor ssh

Para efeitos desta explicação,máquinaé meu laptop e eu o uso para conectar-me a um servidor remoto - ao qual me referirei comonome do servidor.

O procedimento pode ser descrito da seguinte forma:

  1. Eu me conecto ao servidornome do servidorcom sshdemáquina
  2. Eu então insiro a senha paranome do servidor
  3. Eu compilo algo emnome do servidor
  4. eu saionome do servidor(usando exit)
  5. Eu então reinicionome do servidordemáquina
  6. EUping nome do servidore então espero até obter uma resposta ( pinga saída de é mostrada no console)
  7. eu sshgostonome do servidorde novo
  8. Eu executo algumas verificações
  9. Finalmente, exiteunome do servidorpara poder voltarmáquina

Para realizar a receita acima, eumanualmenteexecute os seguintes comandos demáquina:

<machine>$ ssh server_name
insert password for server_name:
<server_name>$ cd /some/path/
<server_name>$ make clean > /dev/null
<server_name>$ make > /dev/null
<server_name>$ exit
<machine>$ ./my_reboot_script server_name
<machine>$ ping server_name
PING 10.23.22.7 with 56(84) bytes of data.
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
^C
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ ./run_some_checks
<server_name>$ exit
<machine>$ echo "Done!"

Algumas notas acima estão em ordem:
- my_reboot_scripté apenas um programa que me permite reinicializar a frionome do servidordo conforto do meu próprio assento.
- Depois de reiniciar a frionome do servidor, preciso esperar que ele volte a funcionar para poder me reconectar usando ssh. Para fazer isso, eu uso ping; é apenas usado como uma indicação de quandonome do servidorestá pronto para aceitar conexões novamente; Somente quando vejo a pingsaída finalmente surgindo no console, eu a interrompo com Ctrl+C e depois sshentronome do servidor.

Fazer tudo isso manualmente é tedioso e demorado. Quero automatizar o processo acima, mas existem três dificuldades:

  1. Enquanto estiver conectado anome do servidor, emitir o exitcomando do shell me desconecta normalmente e me retorna paramáquina. No entanto, emitir exitde dentro de um .sharquivo de script encerrará o script...
  2. Como posso automatizar a senha paranome do servidorEstágio? Não quero digitar a senha manualmente, mas sim deixar o script fazer isso; em outras palavras - quero codificar de alguma forma a senha no script para que isso não me incomode.
  3. A fase "esperando que o servidor esteja pronto para conexões ssh": como posso automatizar isso? Ou seja, em vez de apenas pingexecutar até obter uma resposta e interromper com Ctrl + C, quero que o script pingreconheça que há uma resposta denome do servidore conecte-se com ssh. Embora usar pingpossa não ser uma boa ideia aqui, já que a resposta a pingnão garante quenome do servidorestá pronto para ouvir sshconexões (pela minha experiência com o processo acima, leva mais alguns segundos a partir do momento em que a primeira resposta pingé obtida). Portanto, uma abordagem melhor seria o script continuar tentando entrar sshem loop até conceder acesso (algum tipo de mecanismo de espera ocupado ou até mesmo um loop que dorme e acorda a cada poucos segundos para tentar se conectar).

Responder1

Se você conseguir obter os dados da chave pública da sua máquina para os arquivos do servidor .ssh/authorized_key, poderá executar a compilação com uma única sshinvocação por servidor, sem nunca inserir uma senha:

ssh someone@$SERVER 'cd /some/path/; make clean > /dev/null; make > /dev/null;'

Você poderia colocar isso em um loop em um script de shell, alterando o valor da variável shell SERVERa cada vez. Se você não se importa em inserir sua senha para cada sshinvocação, você nem precisa dos dados da chave pública nos servidores.

informação relacionada