===== 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