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:
opciones
tipo de clave
clave codificada en base64
[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:
from: permite especificar una lista de hosts desde los que se permite o no el acceso mediante clave pública. Es una opción de seguridad, para evitar dejar el acceso libre desde cualquier host a alguien que haya robado la clave privada.
command: indica el comando que se ejecutará cuando se use esta clave, restringe una clave para realizar una operación determinada. El comando que especifique el usuario en su linea de comandos se ignorará.
La variable de entorno SSH_ORIGINAL_COMMAND contiene el comando que lanza el usuario. Esta variable se puede utilizar para extraer los argumentos de la llamada. |
no-pty: evita el uso de una tty en la ejecución del comando
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 |
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 |
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 - \ |