scripts script programa paso para hacer ejemplos ejecutar desde como comando linux shell ssh

programa - script linux ejemplos



escribir un script de shell para ssh a una máquina remota y ejecutar comandos (5)

Tengo dos preguntas:

  1. Hay varias máquinas Linux remotas, y necesito escribir un script de shell que ejecutará el mismo conjunto de comandos en cada máquina. (Incluyendo algunas operaciones de sudo). ¿Cómo se puede hacer esto usando scripts de shell?
  2. Al pasar a la máquina remota, cómo manejarla cuando solicite la autenticación de huella dactilar RSA.

Las máquinas remotas son máquinas virtuales creadas en la ejecución y solo tengo sus direcciones IP. Por lo tanto, no puedo colocar un archivo de script de antemano en esas máquinas y ejecutarlas desde mi máquina.


Hay varias máquinas Linux remotas, y necesito escribir un script de shell que ejecutará el mismo conjunto de comandos en cada máquina. (Incluyendo algunas operaciones de sudo). ¿Cómo se puede hacer esto usando scripts de shell?

Puede hacer esto con ssh, por ejemplo:

#!/bin/bash USERNAME=someUser HOSTS="host1 host2 host3" SCRIPT="pwd; ls" for HOSTNAME in ${HOSTS} ; do ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}" done

Al pasar a la máquina remota, cómo manejarla cuando solicite la autenticación de huella dactilar RSA.

Puede agregar la opción StrictHostKeyChecking=no a ssh:

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

Esto deshabilitará la verificación de la clave del host y agregará automáticamente la clave del host a la lista de hosts conocidos. Si no desea que el host se agregue al archivo de hosts conocido, agregue la opción -o UserKnownHostsFile=/dev/null .

Tenga en cuenta que esto desactiva ciertas comprobaciones de seguridad , por ejemplo, la protección contra el ataque man-in-the-middle. Por lo tanto, no debe aplicarse en un entorno sensible a la seguridad.


Hay varias formas de manejar esto.

Mi forma favorita es instalar http://pamsshagentauth.sourceforge.net/ en los sistemas remotos y también su propia clave pública. (Descubre una forma de instalar estos en la máquina virtual, de alguna manera tienes instalado un sistema Unix completo, ¿qué es un par de archivos más?)

Con su agente ssh reenviado, ahora puede iniciar sesión en cada sistema sin una contraseña.

Y aún mejor, ese módulo de pam se autenticará para sudo con su par de claves ssh para que pueda ejecutarlo con los derechos de root (o de cualquier otro usuario) según sea necesario.

No necesita preocuparse por la interacción de la clave de host. Si la entrada no es una terminal, ssh limitará su capacidad para reenviar agentes y autenticarse con contraseñas.

También debería buscar en paquetes como Capistrano. Definitivamente mira alrededor de ese sitio; tiene una introducción al scripting remoto.

Las líneas de script individuales pueden verse más o menos así:

ssh remote-system-name command arguments ... # so, for exmaple, ssh target.mycorp.net sudo puppet apply


Instale sshpass usando, apt-get install sshpass luego edite el script y ponga sus máquinas linux IPs, nombres de usuario y contraseña en el orden respectivo. Después de eso, ejecuta ese script. Eso es ! Este script instalará VLC en todos los sistemas.

#!/bin/bash SCRIPT="cd Desktop; pwd; echo -e ''PASSWORD'' | sudo -S apt-get install vlc" HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123") USERNAMES=("username1" "username2" "username3") PASSWORDS=("password1" "password2" "password3") for i in ${!HOSTS[*]} ; do echo ${HOSTS[i]} SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}} sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}" done


Puedes seguir este enfoque:

  • Conéctese a la máquina remota usando Expect Script . Si su máquina no es compatible, puede descargar la misma. El script Writing Expect es muy fácil (google para obtener ayuda sobre esto)
  • Ponga toda la acción que debe realizarse en el servidor remoto en un script de shell.
  • Invoque el script de shell remoto desde el script esperado una vez que el inicio de sesión sea exitoso.

Si puede escribir código Perl, entonces debería considerar usar Net :: OpenSSH :: Parallel .

Sería capaz de describir las acciones que deben ejecutarse en cada host de manera declarativa y el módulo se encargará de todos los detalles de miedo. También se admiten ejecutar comandos a través de sudo .