4 may 2012

Programación de tareas con cron

cron es un demonio que nos permite programar tareas con el fin de que se realicen automáticamente.

El principal fichero de configuración de cron es /etc/crontab:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#


En él se define básicamente cuándo se ejecutarán y en qué directorio hay que colocar scripts para que se ejecuten cada hora (/etc/cron.hourly),  diariamente (/etc/cron.daily/), semanalmente (/etc/cron.weekly) o mensualmente (/etc/cron.monthly).

De este modo, si queremos que un script se ejecute cada día, lo colocaremos en el directorio /etc/cron.daily.

Si queremos recibir un e-mail cuando se produzca un error durante la ejecución de las tareas o cuando nuestro script genere cualquier salida, podemos indicar una dirección de correo en el fichero crontab:

MAILTO=usuario@gmail.com  

Para dejar de recibir emails, podemos quitar la dirección de correo en el fichero crontab:

MAILTO=""
 


Para definir una tarea en un fichero de cron, hay que indicar los siguientes campos:
  • m: minuto en el que se va a ejecutar la tarea (0-59).
  • h: hora (0-23).
  • dom: día del mes (1-31).
  • mon: número de mes (1-12).
  • dow: día de la semana (0-7) 0-> domingo, 1-> lunes ... 7->domingo.
  • user: usuario al que pertenece la tarea.
  • command: comando que vamos a ejecutar.
Un asterisco en uno de los campos representa cualquier valor. Por ejemplo, si tenemos un * en el dow significa que la tarea se ejecutará todos los días de la semana.

Cada usuario puede tener sus propias tareas.

Si un usuario quiere ver las tareas que tiene programadas, tan sólo tiene que ejecutar:

$ crontab -l

Si el usuario quisiera editar su lista de tareas, podría ejecutar:

$ crontab -e

Y si quisiera borrar su lista de tareas:

$ crontab -r

Por defecto, todos los usuarios tienen permiso para usar su propio crontab, aunque sólo root puede editar el crontab de cualquier usuario. Ejemplo:

# crontab -u pepe -e

Se puede permitir usar cron a usuarios concretos, añadiéndolos al fichero /etc/cron.allow
También se puede denegar el uso de cron a determinados usuarios, añadiéndolos al  fichero /etc/cron.deny

Cuando un usuario crea sus propias tareas programadas, éstas se almacenan en el directorio /var/spool/cron/crontabs dentro de un fichero que tiene como nombre su login.

Ejemplos de tareas:

Ejecutar el comando "comando" del usuario "usuario" cada día a las 23:00
0 23    * * *   usuario   comando

Ejecutar el comando del usuario cada 5 minutos:
*/5 *      * * *   usuario   comando

Ejecutar el comando del usuario cada 15 minutos cada domingo:
*/15 *    * * 7   usuario     comando

Ejecutar el comando del usuario los días 15, 20 y 25 de cada mes a las 12:00
0 12     15,20,25 * * usuario   comando

Ejecutar el comando del usuario los días 15,16,17,18,19 y 20 de cada mes a las 12:00
0 12     15-20 * * usuario   comando

Ejecutar el comando del usuario cada 12 horas
0 */12   * * *   usuario   comando

Ejecutar el comando del usuario el primer Sábado de cada mes:
0 0   1-7 * Sat   usuario    comando

Ejecutar el comando del usuario cada hora todos los domingos de enero
0 *   * Jan Sun   usuario   comando

ssh-keyscan: Recopilar claves públicas de equipos

Openssh (http://www.openssh.com/) es una suite de herramientas que mantienen nuestras comunicaciones seguras.

Esta suite reemplaza:
  • rlogin y telnet con un cliente ssh.
  • rcp con scp
  • ftp con sftp.
Además incluye una aplicación servidora: sshd, además de una serie de herramientas como ssh-add, ssh-agent, ssh-keysign, ssh-keyscan, ssh-keygen y sftp-server

Hoy tan sólo vamos a hablar de ssh-keyscan, una utilidad que he usado en  varias ocasiones para recopilar las claves públicas de uno o varios hosts.

Utilicé, por ejemplo, ssh-keyscan en un script que realicé para apagar los terminales de un servidor ltsp cuando el usuario apaga, reinicia el servidor o cierra sesión. Cuando realizamos una conexión ssh el sistema nos pregunta si queremos almacenar la clave pública de la máquina a la que nos queremos conectar. Si le decimos que sí, almacenará dicha clave en el fichero ~/.ssh/known_hosts y no volverá a preguntar. El problema es que necesitaba que el script se ejecutase de forma no interactiva, almacenando la clave pública sin necesidad de intervención por parte del usuario. Pude resolver el problema gracias a ssh-keyscan.

Otra ocasión en la que he usado ssh-keyscan ha sido en un script que hace copias de seguridad en una máquina remota. En este caso tenía el mismo problema: Tratar de evitar que el sistema me preguntara si quería almacenar la clave pública de la máquina remota.

Para obtener la clave pública de una máquina no tenemos más que ejecutar el comando ssh-keyscan indicando la ip o el nombre del host. Ejemplo:

# ssh-keyscan 172.19.144.16

El sistema nos devolverá en pantalla el nombre o ip de la máquina junto con su clave pública.

También podemos escanear una lista de máquinas almacenada en un fichero:

# ssh-keyscan -f  listamaquinas

Cuando el sistema nos pregunta si queremos almacenar la clave pública de una máquina a la que estamos conectando, y le respondemos que sí, guarda dicha clave pública dentro del home del usuario, en el fichero:

~/.ssh/known_hosts

 Si quisiéramos escanear la dirección de una máquina y almacenar su clave pública de forma automática, podríamos hacer lo siguiente:

# ssh-keyscan 172.19.144.16 >> ~/.ssh/known_hosts | sort -u -o ~/.ssh/known_hosts

Como podemos observar, la clave pública se almacena en el fichero known_hosts dentro del directorio .ssh del home del usuario. 

Por último, si queremos almacenar la clave pública de forma que se encuentre disponible para todos los usuarios, en lugar de guardarla en ~/.ssh/known_hosts, podemos almacenarla en el fichero /etc/ssh/ssh_known_hosts.

# ssh-keyscan 172.19.144.16 >> /etc/ssh/ssh_known_hosts | sort -u -o /etc/ssh/ssh_known_hosts