Ejecución de comandos en modo no interactivo.

La autenticación mediante claves se puede utilizar para ejecutar comandos sobre equipos remotos desde el cron.

Es recomendable que este tipo de comandos se realicen desde un usuario destinado sólo a estas tareas.

Para ello utilizaremos el campo de opciones para la clave pública en el fichero $HOME/.ssh/authorized_keys2.

La clave pública tiene los siguientes campos, separados por espacios:


[usuario1@localhost usuario1]$ cat .ssh/id_dsa.pub
ssh-dss 
AAAAB3NzaC1kc3MAAACBAJRsicUj2jLS69TYC/wbzyTalmRcT3MuMmmQWq09hCupSMeNGc7FigvjLFjXD5J+9EJHJOrM6SMADQhn2humsSsoKgyvmffWDPOzjoNBEu3s5eYvcWGjgFkY6wPMG8FdIJiL3rLKgCLAFQXd+js4S1R5661dR9YgumLmLp+twlRjAAAAFQCyq4J3iqSOHIAERfSkgdLnR706LQAAAIBEwic1s8RDrvDWg9AzyWOpcNOSp65Aw3ihrmEAklX/uwXmEzfvROWauYFHgqUqlhb+rls9kTU7gMkZMbMi40hJNXt4wb+B+iUNTpOcx0PVXzMRLb+ab3g85ZrzIP9ksRzkie4t3GQGX/l+JH+qNEZdWPkJlqsKyMblPzUpWlQLOAAAAIA9OAOll7kAxWtLoIm7b2ToTzhuP2s3Pv9FQujEkWPbCh7wu+cjtKqKEVLbx27dkk6tiQbDItNuTaMEn3TCBsRhsQMJiiVjDdNjhTO/mkg18/Xb9azeYWwcUzw4O1odzZVU45Ar9AAR94td3kME6VOquefLJW1CgS4NdzXSMHyJwA== 
usuario1@localhost.localdomain
         

Las opciones irán separadas por comas, algunas de las aceptadas son:

Sugerencia

Puedes consultar el resto de las opciones en la sección AUTHORIZED_KEYS FILE FORMAT del man de sshd

Utilizaremos esta funcionalidad para acceder, por ejemplo, a logs de apache en sistemas remotos y procesarlos mediante webalizer.

Para ello creamos una entrada en $HOME/.ssh/authorized_keys2 con el siguiente formato:


from="IP_cliente.dominio.es",command="/usr/local/root/bin/cat_access_log",no-pty 
ssh-dss AAAAB3NzaC1kc3MAAACBAKh0En5pRLIzlsYdXeN2DylLPZs7Wg5oGQTsfrksIskTAVm0i2ai9CovnTIgbKOos86y9PQ+ZaVl8mY2Nwt5XHcpuN9OwcI59+uImNm+DSjhrPWh6EKiPwLr75AYLGphy/5junW5zdv0cDYUp6ooIXDinjzwlx8lJwoy0QghQ0p5AAAAFQDuDgk1Ua0xLruNWP6QYMLG2mucSQAAAIEApGZ41rpip1k1XxKUiZtWF3K5Wn6aGMAPnp/xpHgEVNI1DKtA+rriKtiWNenVpXGAubk9FQXC+6npf/JwGZMByYXrktoZHmn3lAjea1He4hDhlsZpB5rQ8RKZRX8LFi+hU3bhelLacrHMXQNZp2vlJRwx2cmMPggH9Y+GoVeo2B0AAACAPQ/XXYm3nzJGLqFR54e8uEWj2BQ1JWc7lBQDlbkjh5HPveHpMUCW4v9EomZxe6VxfhvNJgGUCs+moLr/odvzsiHS81rLq7+nyOGPf43sBS0ANtMZnAROIo6l1LZjqSi2iMIdRdAJWIMtdCFJ3HOZHbyaXQEsBCA6zJGRTOWY/Qs= 
saltador@cliente.dominio.es

    
en ella se especifica que al utilizar esta clave, asociada al usuario saltador de la máquina cliente sólo desde esta máquina, se ejecute el comando /usr/local/root/bin/cat_access_log sin reservar una tty.

El script asociado al comando ejecuta las siguientes acciones:


#!/bin/bash

if [ ! -z "${SSH_ORIGINAL_COMMAND}" ]
then
   host=$(echo ${SSH_ORIGINAL_COMMAND}|awk '{print $2}')
else
   if [ $# -lt 1 ]
   then
      echo "Usage: $(basename $0) host"
      exit 1
   else
      host=$1
   fi
fi

LOGDIR=/var/log/httpd
DATA=$(date --date="1 month ago" +%Y%m)
ACCESS=${LOGDIR}/${host}/${DATA}-access_log

if [ -f ${ACCESS} ]
then
   cat ${ACCESS}
fi
    
Este permite consultar el último access_log de nuestro servidor web, haciendo uso de la variable SSH_ORIGINAL_COMMAND que da acceso a los parámetros originales.

Ahora sólo nos queda configurar el script que se ejecutará desde el cron en la máquina cliente.


#!/bin/bash
COMMAND="/usr/local/root/bin/cat_access_log"
SERVER=virtualhost

ssh saltador@servidor.dominio.es "${COMMAND} ${SERVER}" |  \
                              webalizer -  \
   
En este script se ejecuta el comando especificado con el parámetro sobre la máquina remota. La salida del comando la recoge el programa webalizer que, en la máquina local, procesará el log del servidor web.