Escribir un script que inicie y cierre sesión en el servidor ssh

Escribir un script que inicie y cierre sesión en el servidor ssh

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:

  1. me conecto al servidornombre del servidorcon sshdemáquina
  2. Luego inserto la contraseña paranombre del servidor
  3. Compilo algo sobrenombre del servidor
  4. salgo denombre del servidor(usando exit)
  5. luego reinicionombre del servidordemáquina
  6. Iping nombre del servidory luego espero hasta recibir una respuesta ( pingel resultado de 'se muestra en la consola)
  7. yo sshennombre del servidorde nuevo
  8. hago algunos controles
  9. Finalmente, yo exitanombre 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_scriptes 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 pingsalida finalmente aparece en la consola, la interrumpo con Ctrl+C, y luego sshentronombre del servidor.

Hacer lo anterior manualmente es tedioso y requiere mucho tiempo. Entonces quiero automatizar el proceso anterior, pero hay tres dificultades:

  1. Mientras está conectado anombre del servidor, emitir el exitcomando desde el shell me cierra la sesión y me devuelve amáquina. Sin embargo, la emisión exitdesde dentro de un .sharchivo de secuencia de comandos finalizará la secuencia de comandos...
  2. ¿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.
  3. 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 pinghacer ing hasta obtener una respuesta y luego interrumpir con Ctrl+C, quiero que el script pingreconozca que hay una respuesta denombre del servidor, luego conéctese con ssh. Aunque usar pingpodría no ser una buena idea aquí, ya que responder a pingno garantiza quenombre del servidorestá listo para escuchar sshconexiones (según mi experiencia con el proceso anterior, tarda unos segundos más desde el momento en que pingse obtiene la primera respuesta). Por lo tanto, un mejor enfoque podría ser que el script siga intentando hacerlo sshen 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_keyarchivos del servidor, puede ejecutar la compilación con una única sshinvocació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 SERVERcada vez. Si no le importa ingresar su contraseña para cada sshinvocación, ni siquiera necesita los datos de la clave pública en los servidores.

información relacionada