Tengo dos preguntas:
- Hay varias máquinas Linux remotas, y necesito escribir un script de shell que ejecutará el mismo conjunto de comandos en cada máquina. (Incluidas algunas operaciones sudo). ¿Cómo se puede hacer esto usando scripts de shell?
- Al enviar un mensaje a la máquina remota, cómo manejar cuando solicita la autenticación de huellas digitales RSA.
Las máquinas remotas son máquinas virtuales creadas sobre la marcha y solo tengo sus direcciones IP. Entonces, no puedo colocar un archivo de script de antemano en esas máquinas y ejecutarlas desde mi máquina.
expect
como `esperar" ? assword: "`Respuestas:
Puede hacer esto con ssh, por ejemplo:
Puede agregar la
StrictHostKeyChecking=no
opción a ssh:Esto desactivará 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 conocidos, agregue la opción
-o UserKnownHostsFile=/dev/null
.Tenga en cuenta que esto deshabilita ciertas comprobaciones de seguridad , por ejemplo, la protección contra un ataque de intermediario. Por lo tanto, no debe aplicarse en un entorno sensible a la seguridad.
fuente
ssh
desde cualquier script de shellHay 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. (Encuentre una manera de instalarlos en la VM, de alguna manera tiene instalado un sistema Unix completo, ¿qué son un par de archivos más?)
Con su agente ssh reenviado, ahora puede iniciar sesión en todos los sistemas sin una contraseña.
Y aún mejor, ese módulo pam se autenticará para sudo con su par de claves ssh para que pueda ejecutar con derechos de root (o de cualquier otro usuario) según sea necesario.
No necesita preocuparse por la interacción de la clave del 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 paquetes como Capistrano. Definitivamente mire alrededor de ese sitio; tiene una introducción a las secuencias de comandos remotas.
Las líneas de secuencia de comandos individuales podrían verse así:
fuente
Instale sshpass usando,
apt-get install sshpass
luego edite el script y coloque las direcciones IP, los nombres de usuario y la contraseña de sus máquinas Linux en el orden respectivo. Después de eso, ejecute ese script. Eso es ! Este script instalará VLC en todos los sistemas.fuente
Si puede escribir código Perl, debería considerar usar Net :: OpenSSH :: Parallel .
Podría describir las acciones que deben ejecutarse en cada host de manera declarativa y el módulo se encargará de todos los detalles aterradores.
sudo
También se admite la ejecución de comandos .fuente
Esto funciona para mí.
Sintaxis: ssh -i pemfile.pem nombre_usuario @ dirección_ip 'command_1; comando 2; comando 3 '
fuente
Para este tipo de tareas, utilizo repetidamente Ansible que permite duplicar coherentemente scripts bash en varios contenedores o VM. Ansible (más precisamente Red Hat ) ahora tiene una interfaz web adicional AWX que es la edición de código abierto de su Tower comercial.
Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: producto comercial, probablemente explorará primero el AWX gratuito de código abierto, en lugar del free-trail de 15 días de la torre
fuente
Hay varias formas de ejecutar los comandos o secuencias de comandos en las múltiples máquinas Linux remotas. Una forma simple y fácil es a través de pssh (programa ssh paralelo)
pssh : es un programa para ejecutar ssh en paralelo en varios hosts. Proporciona funciones como enviar entradas a todos los procesos, pasar una contraseña a ssh, guardar la salida en archivos y agotar el tiempo de espera.
Ejemplo y uso:
Conéctese a host1 y host2 e imprima "hola, mundo" de cada uno:
Ejecute comandos a través de una secuencia de comandos en varios servidores:
Utilice y ejecute un comando sin verificar ni guardar las claves de host:
Si el archivo hosts.txt tiene una gran cantidad de entradas, digamos 100, entonces la opción de paralelismo también puede establecerse en 100 para garantizar que los comandos se ejecuten simultáneamente:
Opciones :
-I: Leer entrada y enviar a cada proceso ssh.
-P: Le dice a pssh que muestre la salida a medida que llega.
-h: Lee el archivo del host.
-H: [usuario @] host [: puerto] para un solo host.
-i: muestra la salida estándar y el error estándar a medida que cada host completa
-x args: pasa argumentos de línea de comandos SSH adicionales
-o opción: puede usar para proporcionar opciones en el formato utilizado en el archivo de configuración. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p paralelismo: use el número dado como el número máximo de conexiones simultáneas
-q Modo silencioso: provoca que se supriman la mayoría de los mensajes de advertencia y diagnóstico.
-t: Hace que las conexiones se agoten después del número de segundos especificado. 0 significa que pssh no agotará el tiempo de espera de ninguna conexión
Deshabilite StrictHostKeyChecking para manejar la solicitud de autenticación RSA.
-o StrictHostKeyChecking = no
Fuente : man pssh
fuente
Esto funcionó para mí. Hice una función. Pon esto en tu script de shell:
Si tiene varias máquinas en las que desea hacer el mismo comando, repetiría esa línea con un punto y coma. Por ejemplo, si tiene dos máquinas, haría esto:
Reemplace USER con el usuario de la computadora. Reemplace HOST con el nombre de la computadora. Reemplace COMMAND con el comando que desea hacer en la computadora.
¡Espero que esto ayude!
fuente
Puede seguir este enfoque:
fuente