Escrevendo script que efetua login e logoff do servidor ssh

1

Por causa dessa explicação, machine é meu laptop, e eu o uso para conectar-me a um servidor remoto - ao qual vou me referir como server_name .

O procedimento pode ser descrito da seguinte forma:

  1. Eu conecto ao servidor nome_do_servidor com ssh da máquina
  2. Eu insiro a senha para server_name
  3. Eu compilo algo em server_name
  4. Eu saio de server_name (usando exit )
  5. Eu, então, reinicializo server_name da máquina
  6. Eu ping nome_do_servidor e, em seguida, aguardo até obter uma resposta dele (a saída de ping é mostrada no console)
  7. Eu ssh em nome_do_servidor novamente
  8. eu corro algumas verificações
  9. Finalmente, eu exit to server_name para voltar a máquina

Para realizar a receita acima, eu manualmente executo os seguintes comandos a partir de machine :

<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 sobre o acima estão em ordem:
- my_reboot_script é apenas um programa que me permite reinicializar server_name do comportamento do meu próprio lugar.
- Depois de reinicializar a frio nome_do_servidor , preciso esperar que ele volte, para que eu possa reconectar a ele usando ssh . Para fazer isso, eu uso ping ; é meramente usado como uma indicação para quando server_name está pronto para aceitar conexões novamente; Somente quando vejo a saída ping finalmente aparecer no console, eu a interrompo com Ctrl + C e, em seguida, eu ssh em server_name .

Fazer o acima manualmente é tedioso e consome tempo. Então, quero automatizar o processo acima, mas há três dificuldades:

  1. Quando conectado a nome_do_servidor , a emissão do comando exit do shell normalmente faz o logout e me retorna a máquina . No entanto, a emissão de exit a partir de um arquivo .sh do script terminará o script ...
  2. Como posso automatizar a senha para a fase server_name ? Eu não quero digitar manualmente a senha, mas sim deixar o script fazer isso; em outras palavras - eu quero de alguma forma codificar a senha no script para não me incomodar com isso.
  3. A fase "aguardando o servidor-para-estar-pronto-para-ssh-conexões": Como posso automatizar isso? Significado, em vez de apenas ping ing até obter uma resposta e, em seguida, interromper com Ctrl + C, eu quero o script para ping , reconhecer que existe uma resposta de server_name , em seguida, conectar-se com %código%. Embora usar ssh possa não ser uma boa ideia aqui, pois a resposta a ping não garante que nome_do_servidor esteja pronto para ouvir ping conexões (da minha experiência com o processo acima , leva mais alguns segundos a partir do momento em que a primeira resposta ao ssh é obtida). Portanto, uma abordagem melhor pode ser que o script continue tentando ping em um loop até que ele conceda acesso (algum tipo de mecanismo de espera ocupado, ou até mesmo um loop que durma e acorde a cada poucos segundos para tentar se conectar ).
por so.very.tired 30.10.2015 / 18:12

1 resposta

3

Se você puder obter os dados da chave pública da sua máquina para os arquivos .ssh/authorized_key do servidor, poderá executar a compilação com uma única invocação de ssh por servidor, sem nunca digitar 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 de shell SERVER a cada vez. Se você não se importar em inserir sua senha para cada invocação de ssh , nem precisa dos dados da chave pública nos servidores.

    
por 30.10.2015 / 18:36