Pregunta

mi problema es el siguiente:Estoy escribiendo un guión cuya finalidad es la ejecución de un cierto scripts en diferentes servidores en paralelo.I. e., Quiero iniciar una sesión en un servidor remoto, introduzca la contraseña (esto no es negociable porque el jefe), se inicia la secuencia de comandos, cerca de la conexión, mientras que el guión aún está en ejecución, conectarse a la siguiente servidor y hacer todo el baile de nuevo.¿Cómo lo hago?

¿Fue útil?

Solución

Suponiendo que bash es el objetivo de shell en todas las máquinas remotas, que podría hacer una máquina:

ssh user@host /path/to/script '&>/dev/null' '</dev/null' '&' disown

Para varias máquinas que usted podría entonces script como este:

hosts='user1@host1 user2@host2'

for host in $hosts
do
  ssh $host /path/to/script '&>/dev/null' '</dev/null' '&' disown
done

Esto sólo tendría que escribir contraseñas.

Alternativamente, si usted puede utilizar la misma contraseña para varias máquinas, yo recomendaría buscar en ClusterSSH.Con esto usted puede iniciar sesión en varios equipos simultáneamente y tipo de comandos para ser enviado a todos ellos en una sola ventana o en forma individual en cada ventana de xterm.Esto ahorraría a escribir la misma contraseña en varias ocasiones.Una vez conectado, usted puede ejecutar el comando anterior (sin la ssh user@host parte) y la salida.

Actualización

Par de extra pensamientos aquí.La primera es que probablemente no es una gran idea para descartar la salida de secuencia de comandos completo, ya que nunca se sabe lo que pasó, si algo salió mal.Usted puede simplemente poner en un archivo para verlo más tarde mediante la sustitución de '&>/dev/null' con '&>filename'.Otro criterio sería el de la máquina remota correo electrónico (siempre que esté correctamente configurado para ello):

host=user@host
ssh $host \(/path/to/script '2>&1' \| mail -s "$host output" me@me.com\) \
  '&>/dev/null' '</dev/null' '&' disown

En segundo lugar, si el script está en el host local, puede copiarlo todo y ejecutar en un solo comando.Supone un script de shell, si no basta con sustituir sh con la correcta interpretor)

</path/to/script ssh user@host \
  cat \>script \; sh ./script '&>/dev/null' '</dev/null' '&' disown

Otros consejos

Después de iniciar sesión, puede usar la utilidad de la pantalla para iniciar una nueva sesión del terminal y luego desprenderse de él, ejemplo:

[user@local]$ ssh machine
[user@machine]$ screen -S my_session
# you are now switched to new terminal session named "my_session"
# now you can start long operation, that you want to keep in background
[user@machine]$ yes
# press "Ctrl-a d" to detach, you will go back to original session
[detached from 11271.my_session]
# now you can leave ssh (your session with "yes" running will be kept in background)
# to list existing screen sessions run:
[user@machine]$ screen -list
There is a screen on:
11271.my_session    (Detached)
1 Socket in /var/run/screen/S-user.
# to re-attach use -r
[user@machine]$ screen -r my_session
# you will be back to session with "yes" still running (press Ctrl-C to stop it)

Una vez que entenderá cómo funciona la pantalla, puede intentar scriptinglo;Así es como comienza la sesión de pantalla en estado separado en ejecución my_command:

$ screen -d -m my_command

expect puede automatizar esto bastante fácilmente:

#!/usr/bin/expect -f

set hosts {your list of hosts goes here ...}
foreach host $hosts {
    spawn ssh -t user@$host screen ./script.sh
    expect "assword:"
    send -- "secret\r"
    sleep 1
    send -- "d"
    expect eof
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top