
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:
- Eu me conecto ao servidornome do servidorcom
ssh
demáquina - Eu então insiro a senha paranome do servidor
- Eu compilo algo emnome do servidor
- eu saionome do servidor(usando
exit
) - Eu então reinicionome do servidordemáquina
- EU
ping
nome do servidore então espero até obter uma resposta (ping
a saída de é mostrada no console) - eu
ssh
gostonome do servidorde novo - Eu executo algumas verificações
- Finalmente,
exit
eunome 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 ping
saída finalmente surgindo no console, eu a interrompo com Ctrl+C e depois ssh
entronome do servidor.
Fazer tudo isso manualmente é tedioso e demorado. Quero automatizar o processo acima, mas existem três dificuldades:
- Enquanto estiver conectado anome do servidor, emitir o
exit
comando do shell me desconecta normalmente e me retorna paramáquina. No entanto, emitirexit
de dentro de um.sh
arquivo de script encerrará o script... - 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.
- A fase "esperando que o servidor esteja pronto para conexões ssh": como posso automatizar isso? Ou seja, em vez de apenas
ping
executar até obter uma resposta e interromper com Ctrl + C, quero que o scriptping
reconheça que há uma resposta denome do servidore conecte-se comssh
. Embora usarping
possa não ser uma boa ideia aqui, já que a resposta aping
não garante quenome do servidorestá pronto para ouvirssh
conexões (pela minha experiência com o processo acima, leva mais alguns segundos a partir do momento em que a primeira respostaping
é obtida). Portanto, uma abordagem melhor seria o script continuar tentando entrarssh
em 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 ssh
invocaçã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 SERVER
a cada vez. Se você não se importa em inserir sua senha para cada ssh
invocação, você nem precisa dos dados da chave pública nos servidores.