===== SSH: Ejecutar múltiples comandos en el host destino desde Bash ===== Método simple usando subshells y el concepto de "here-document" para ejecutar múltiples comandos (incluso con bucles y condiciones) en SSH y evitar los típicos problemas con "pseudo-tty allocation". Pseudo-terminal will not be allocated because stdin is not a terminal. Heredoc (conjunción apocópica de Here-document o Documento-aquí en español) es una forma de representar cadenas en los lenguajes de programación o shells de algún Sistema Operativo basado en Unix. Los lenguajes de programación que más se valen de este son PHP y Ruby. La diferencia entre Heredoc y otras formas más tradicionales de mandar cadenas de caracteres a la salida estándar es que con heredoc se pueden transmitir grandes cadenas de texto con poco esfuerzo; mientras que con instrucciones simples como printf() de C y echo() de PHP hay que mandar el texto línea por línea (con un formato a veces complejo en C), incluyendo comillas, especificaciones, punto y coma, el nombre de la instrucción y a veces especificaciones, por cada línea o fragmento de ella que se desee publicar, heredoc nos da la oportunidad de mostrar extensiones mayúsculas de párrafos con una sola instrucción o un solo procedimiento. El texto (generalmente párrafos) creados con instrucciones heredoc incluyen y respetan la indentación, los espacios y caracteres de nueva línea del texto y otros atributos difíciles de incluir con texto simple, como las comillas dobles. Generalmente la sintaxis para programar una salida con heredoc es usando alguna instrucción seguida de <<, después un identificador para el texto, siguiendo con una línea nueva y el texto mismo y, finalmente, el cierre de la instrucción. **Sintaxis para lanzar varios comandos con SSH**. ssh [OPCIONES] USUARIO@DOMINIO "$( cat <<'EOT' XXXXXXXXX XXXXXXXXX XXXXXXXXX EOT )" **Ejemplo 1** (Todo en una linea). ssh root@www.dominio.com "$( cat <<'EOT' for q in maildrop corrupt incoming active deferred hold; do count=$(find /var/spool/postfix/$q ! -type d -print | wc -l); echo -n "$q:$count "; done; echo size:`postqueue -p | tail -n1 | awk '{print $2}'` EOT )" **Ejemplo 2** (Lo mismo que el "ejemplo1" anterior pero usando múltiples). ssh root@www.dominio.com "$( cat <<'EOT' for q in maildrop corrupt incoming active deferred hold do count=$(find /var/spool/postfix/$q ! -type d -print | wc -l) echo -n "$q:$count " done echo size:`postqueue -p | tail -n1 | awk '{print $2}'` EOT )" NOTA: El código del ejemplo muestra los valores de las distintas colas de postfix + el tamaño global de los correos encolados. maildrop:10 corrupt:2 incoming:1 active:0 deferred:18 hold:1 size:968 ==== Cómo guardar y mostrar la salida de un comando en variables (Bash) ==== # Dos maneras simples de guardar la salida de un comando en una variable. VARIABLE=`ls -lt /tmp/` VARIABLE=$(ls -lt /root/) # Dos maneras simples de mostrar el contenido de una variable que contiene la salida de un comando. # Si no se usan comillas, no se interpretarán los saltos de linea y se mostrará toda en una misma linea. echo "$variable" echo $variable