
Por el bien de esta explicación,máquinaes mi computadora portátil y la uso para conectarme a un servidor remoto, al que me referiré comonombre del servidor.
El procedimiento se puede describir de la siguiente manera:
- me conecto al servidornombre del servidorcon
ssh
demáquina - Luego inserto la contraseña paranombre del servidor
- Compilo algo sobrenombre del servidor
- salgo denombre del servidor(usando
exit
) - luego reinicionombre del servidordemáquina
- I
ping
nombre del servidory luego espero hasta recibir una respuesta (ping
el resultado de 'se muestra en la consola) - yo
ssh
ennombre del servidorde nuevo - hago algunos controles
- Finalmente, yo
exit
anombre del servidorpara volver amáquina
Para lograr la receta anterior, yoa manoejecute los siguientes comandos desdemá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!"
Es necesario hacer un par de notas sobre lo anterior:
- my_reboot_script
es solo un programa que me permite reiniciar en fríonombre del servidordesde la comodidad de mi propio asiento.
- Después de reiniciar en fríonombre del servidor, necesito esperar a que vuelva a funcionar para poder volver a conectarme usando ssh
. Para hacer eso, uso ping
; se utiliza simplemente como una indicación de cuándonombre del servidorestá listo para aceptar conexiones nuevamente; Sólo cuando veo que la ping
salida finalmente aparece en la consola, la interrumpo con Ctrl+C, y luego ssh
entronombre del servidor.
Hacer lo anterior manualmente es tedioso y requiere mucho tiempo. Entonces quiero automatizar el proceso anterior, pero hay tres dificultades:
- Mientras está conectado anombre del servidor, emitir el
exit
comando desde el shell me cierra la sesión y me devuelve amáquina. Sin embargo, la emisiónexit
desde dentro de un.sh
archivo de secuencia de comandos finalizará la secuencia de comandos... - ¿Cómo puedo automatizar la contraseña paranombre del servidor¿fase? No quiero escribir manualmente la contraseña, sino dejar que el script lo haga; en otras palabras, quiero codificar de alguna manera la contraseña en el script para que no me moleste.
- La fase de "esperando a que el servidor esté listo para las conexiones ssh": ¿Cómo puedo automatizar esto? Es decir, en lugar de simplemente
ping
hacer ing hasta obtener una respuesta y luego interrumpir con Ctrl+C, quiero que el scriptping
reconozca que hay una respuesta denombre del servidor, luego conéctese conssh
. Aunque usarping
podría no ser una buena idea aquí, ya que responder aping
no garantiza quenombre del servidorestá listo para escucharssh
conexiones (según mi experiencia con el proceso anterior, tarda unos segundos más desde el momento en queping
se obtiene la primera respuesta). Por lo tanto, un mejor enfoque podría ser que el script siga intentando hacerlossh
en un bucle hasta que conceda el acceso (algún tipo de mecanismo de espera ocupado, o incluso un bucle que duerme y se activa cada pocos segundos para intentar conectarse).
Respuesta1
Si puede obtener los datos de la clave pública de su máquina a los .ssh/authorized_key
archivos del servidor, puede ejecutar la compilación con una única ssh
invocación por servidor, sin tener que ingresar una contraseña:
ssh someone@$SERVER 'cd /some/path/; make clean > /dev/null; make > /dev/null;'
Podrías poner eso en un bucle en un script de shell, cambiando el valor de la variable de shell SERVER
cada vez. Si no le importa ingresar su contraseña para cada ssh
invocación, ni siquiera necesita los datos de la clave pública en los servidores.