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