# rm-rf.es

crontab: modo de uso y ejemplos

El comando crontab nos permite añadir, eliminar o modificar los cron configurados para un usuario de una máquina Unix.

El modo de uso es el siguiente: crontab -<opciones>, a continuación os muestro unos ejemplos:

Editar los cron del usuario “alex”:

crontab -e -u alex

Listar los cron del usuario “alex”:

crontab -l -u alex

Eliminar los cron del usuario alex:

crontab -r -u alex

En todos estos casos, si omitimos “-u alex” accederemos a los cron del usuario con el que estemos identificados en el sistema. Una vez dentro de la gestión de crontab (si estamos editando con -e” visualizaremos todos los cron configurados para el usuario, ejemplo:

Nota: Automáticamente accederéis a la gestión de los cron con el editor que haya configurado por defecto, si queréis modificarlo revisad esta entrada: Cambiar editor crontab por defecto)

$ crontab -e -u alex
0 * * * * /usr/sbin/ntpdate hora.oxixares.com > /dev/null
0 20 * * * echo "Me ejecuto a las ocho en punto" > /dev/null

Crontab pone a nuestra disposición 6 campos cuyo significado es el siguiente (en orden, de izquierda a derecha) :

  1. Minuto (0-59)
  2. Hora (0-23)
  3. Día del mes (1-31)
  4. Mes del año (1-12)
  5. Día de la semana (0-7, 0 y 7 es Domingo)
  6. Comando/Script/tarea a ejecutar

En los 5 primeros campos podemos usar Wildcard (*), para especificar que se ejecutará en cualquiera de las opciones de ese campo (si son horas todas las horas, si son días todos los días, etc).

En el primer ejemplo que he mostrado antes, cada hora en punto ejecutamos la sincronización horaria y mandamos la salida a /dev/null/:

0 * * * * /usr/sbin/ntpdate hora.oxixares.com > /dev/null

En el segundo ejemplo, simplemente escribimos la frase a las 20:00 todos los días:

0 20 * * * echo "Me ejecuto a las ocho en punto" > /dev/null

Al comienzo del fichero podemos especificar una dirección de correo electrónico a la cual se envíen los informes de ejecución de crontabs:

MAILTO="test@test.com"

Con estas nociones básicas ya podéis trabajar de un modo eficaz gestionando cron mediante el comando crontab.

Cómo cambiar los servidores DNS desde línea de comandos

Cualquier máquina conectada a Internet debe tener configurados unos servidores DNS que servirán para la resolución de nombres de todas aquellas aplicaciones que se conecten a Internet. Básicamente (no voy a profundizar en esto) traducirán los nombres de dominio a IPs.

Si queremos modificar los servidores DNS a utilizar en nuestra máquina (Unix, Linux), simplemente hay que listarlos dentro del fichero /etc/resolv.conf del siguiente modo:

$ vi /etc/resolv.conf
nameserver 80.58.0.33
nameserver 80.58.32.97

No es necesario reiniciar la red para que los cambios surtan efecto. Simplemente haced ping a un dominio para ver si el funcionamiento de resolución de nombres es correcto:

$ ping google.com
PING google.com (74.125.53.100) 56(84) bytes of data.
64 bytes from pw-in-f100.1e100.net (74.125.53.100): icmp_seq=1 ttl=46 time=541 ms
64 bytes from pw-in-f100.1e100.net (74.125.53.100): icmp_seq=2 ttl=46 time=263 ms

Una buena base de datos con todos los DNS disponibles de los proveedores de Internet en España es la de ADSL ayuda.

NFS: mount: wrong fs type, bad option, bad superblock on X missing codepage or helper program, or other error

En caso de encontrar el siguiente error al tratar de montar un sistema de ficheros NFS:

NFS: mount: wrong fs type, bad option, bad superblock on X missing codepage or helper program, or other error

Verificad que tenéis instalados los nfs-utils:

nfs-utils.i586 : NFS utilities and supporting clients and daemons for the kernel NFS server

Para instalarlo en sistemas RedHat, CentOS, Fedora, etc:

yum install nfs-utils.i586

Después iniciáis nfs:

/etc/init.d/nfs start

Y os aseguráis que rpc.bind está corriendo, sino al tratar de arrancar NFS recibiréis el siguiente error (por pantalla o en los logs):

Cannot register service: RPC: Timed out
: unable to register (statd, 1, udp).

Para arrancar rpcbind:

service rpcbind start

Comando tr (unix): convertir mayúsculas a minúsculas y viceversa

Un truco rápido con el comando Unix tr, vamos a convertir las letras mayúsculas a minúsculas de un fichero.

Fichero test.txt:

$ cat test.txt
minusculas
MAYUSCULAS

Convertir mayúsculas en minúsculas del fichero test.txt:

$ cat test.txt | tr [:upper:] [:lower:]
minusculas
mayusculas

Convertir minúsculas en mayúsculas del fichero test.txt:

$ cat test.txt | tr [:lower:] [:upper:]
MINUSCULAS
MAYUSCULAS

Por supuesto, el comando tr nos ofrece muchas más opciones para transformación de carácteres, os dejo la ayuda del comando, recordad que en las páginas man hay mucha más información.

$ tr --help
Modo de empleo: tr [OPCIÓN]... CONJUNTO1 [CONJUNTO2]
Traducir, comprimir, y/o borrar caracteres de la entrada estándar,
escribiendo a la  entrada estándar.

  -c, -C, --complement    primer compliment SET1
  -d, --delete            borrar caracteres en SET1, no traducir
  -s, --squeeze-repeats   reemplazar cada secuencia de entradas de un caracter repetido
                            esta es una lista de SET1 con una sóla coincidencia
                            de ese caracter
  -t, --truncate-set1     primero truncar SET1 a la longitud de SET2
      --help     muestra esta ayuda y finaliza
      --version  informa de la versión y finaliza

Los CONJUNTOs se especifican como cadenas de caracteres. La mayoría se
representan a sí mismos.
Las secuencias válidas son las siguientes:

  \NNN            carácter con valor octal NNN (de uno a tres dígitos)
  \\              barra invertida
  \a              pitido audible (BEL)
  \b              espacio hacia atrás
  \f              salto de página
  \n              salto de línea
  \r              retorno de carro
  \t              tabulación horizontal
  \v              tabulación vertical
  CAR1-CAR2       todos los caracteres comprendidos entre CAR1 y CAR2 contados
                  en orden ascendente
  [CAR*]          en CONJUNTO2, copias de CAR hasta que se alcance la longitud
                  de CONJUNTO1
  [CAR*REPITE]    copia REPITE veces CAR; REPITE es octal si comienza con 0
  [:alnum:]       todas las letras y dígitos
  [:alpha:]       todas las letras
  [:blank:]       todos los espacios en blanco horizontales
  [:cntrl:]       todos los caracteres de control
  [:digit:]       todos los dígitos
  [:graph:]       todos los caracteres imprimibles, sin incluir el espacio
  [:lower:]       todas las letras minúsculas
  [:print:]       todos los caracteres imprimibles, incluyendo el espacio
  [:punct:]       todos los caracteres de puntuación
  [:space:]       todos los espacios en blanco horizontales y verticales
  [:upper:]       todas las letras mayúsculas
  [:xdigit:]      todos los números hexadecimales
  [=CAR=]         todos los caracteres que son igual que CAR

Se produce la traducción si no se especifican CONJUNTO1 y CONJUNTO2, siempre
y cuando no aparezca la opción -d. -t se puede usar sólo al traducir.
CONJUNTO2 se expande a la longitud de CONJUNTO1, repitiendo su último
carácter tantas veces como sea necesario.  Los caracteres que sobran en
CONJUNTO2 no se tienen en cuenta. Solamente se garantiza que [:lower:]
y [:upper:] sean expandidos en orden ascendente; si se usa en
CONJUNTO2 al traducir, sólo se pueden usar en parejas, para
especificar conversión a mayúsculas.  -s usa CONJUNTO1 si no se está
traduciendo ni borrando; si no, la compresión usa CONJUNTO2 después de
la traducción o el borrado.

Cómo montar un sistema de ficheros NFS (Cliente Linux)

El Network File System (Sistema de archivos de red), o NFS, es un protocolo de nivel de aplicación, según el Modelo OSI. Es utilizado para sistemas de archivos distribuido en un entorno de red de computadoras de área local. Posibilita que distintos sistemas conectados a una misma red accedan a ficheros remotos como si se tratara de locales. Wikipedia

Vamos a suponer que tenemos montado un servidor con comparticiones NFS (otro día explicaré detalladamente como se monta un servidor NFS). En el caso de querer conectarnos a ese sistema de ficheros desde un equipo remoto (cliente), tendremos que hacerlo del siguiente modo:

mount host:/comparticion /punto/de/montaje

En el ejemplo encontramos:

  • Host: IP o FQDN del servidor que está compartiendo vía NFS
  • /compartición: Ruta que comparte el servidor NFS
  • /punto/de/montaje: Lugar en el que queremos montar la compartición NFS (Punto de montaje)

Un ejemplo real podría ser:

$ mkdir /mnt/compartido
$ mount 192.168.0.199:/home/compartido /mnt/compartido

Una vez realizado, si hacemos un df veremos que efectivamente la unidad ha sido montada satisfactoriamente, y tenemos acceso a ella a través de /mnt/compartido. Para que esto se mantenga tras el reinicio de la máquina, hemos de incluir la línea correspondiente en el fichero /etc/fstab. Por ejemplo, para el ejemplo anterior añadiríamos una línea similar a lo que sigue.

La estructura de la línea es la siguiente:

<server>:</path/of/dir> </local/mnt/point> nfs <options> 0 0

Y en nuestro ejemplo (con opcion de read-write, lectura escritura):

192.168.0.199:/home/compartido /mnt/compartido nfs rw 0 0

Recomiendo no obstante revisar la documentación de Red-Hat pues detallan de forma extensa y muy buena todas las opciones disponibles.

Próximamente montaremos un servidor NFS desde cero.

nohup: Mantiene la ejecución de un comando pese a salir de la terminal

El comando nohup permite mantener la ejecución de un comando (el cual le pasamos como un argumento) pese a salir de la terminal (logout), ya que hace que se ejecute de forma independiente a la sesión.

Básicamente, lo que hace es ignorar la señal HUP (señal que se envía a un proceso cuando la terminal que lo controla se cierra), esto implica que aunque cerremos la terminal, el proceso se siga ejecutando.

La propia ayuda disponible en la shell (y en las páginas man) nos ayudará a entender el modo de ejecución del comando:

$ nohup --help
Modo de empleo: nohup ORDEN [ARGUMENTO]...
       o bien:  nohup OPCIÓN
Ejecuta ORDEN, descartando las señales de colgar.

      --help     muestra esta ayuda y finaliza
      --version  informa de la versión y finaliza

si la entrada estándar es una terminal, redirigirla desde /dev/null.
si la salida estándar es una terminal, añadir la salida a `nohup.out` si es posible,
en caso contrario a `$HOME/nohup.out`.
si los errores van a una terminal, redirigirlos a la salida estándar.
Para guardar la salida a FILE, use `nohup COMMAND > FILE`

Un ejemplo sencillo sería la ejecución en segundo plano de un script cualquiera, gracias al comando nohup permitiremos la continuidad de la ejecución en caso de cualquier problema con la sesión, shell de ejecución, etc:

$ nohup ./miscript.sh &

Por defecto, la salida del comando, que normalmente aparecería directamente en la terminal, será procesada a un fichero llamado nohup.out que aparecerá en la ruta donde nos encontremos al ejecutar el comando.

Ejecutar comandos en equipos remotos vía SSH

Hoy vamos a ver como ejecutar a través de ssh comandos en equipos remotos. Esta práctica es de utilidad en el momento que gestionas muchos equipos y dispones de una máquina central para gestionar todos.
A partir de aquí tened en cuenta que es posible automatizar tareas en servidores remotos mediantes scripts, creación de llaves públicas ssh, etc.

El modo de ejecutar los comandos en un servidor remoto sería el siguiente:

$ ssh servidor_remoto comando

Ejemplo (ejecutamos el comando date en el servidor remoto 192.168.0.188 vía ssh a través del puerto 9999):

$ ssh root@192.168.0.188 -P9999 date
stdin: is not a tty
Sun Oct  4 20:15:14 CEST 2009

Si el comando que váis a ejecutar incorpora comillas, tendréis que entrecomillar todo el comando para evitar errores. Si el comando incluye comillas simples, entrecomilladlo con dobles, y si incluye comillas dobles, con simples:

$ ssh root@192.168.0.188 -P9999 'echo "Esto es una prueba"'
$ ssh root@192.168.0.188 -P9999 "echo 'Esto es una prueba'"

Os recomiendo revisar estos dos artículos sobre ssh, hablo sobre la securización del servicio y el acceso sin necesidad de clave:

Login SSH sin password de forma rápida y sencilla

Cómo securizar un servidor SSH

Truco GREP: Mostrar líneas anteriores/posteriores al resultado de la búsqueda

Esta es una de las muchas posibilidades que nos ofrece el comando grep, el rey de las búsquedas de strings en ficheros bajo sistemas Unix.

Concretamente hablamos de mostrar en el resultado del comando un número determinado de líneas anteriores o posteriores respecto a “target” del grep. Vamos con los ejemplos:

Grep normal, buscamos una cadena en un fichero de texto:

$ grep "EXT3-fs: mounted" /var/log/dmesg.0
[   13.274871] EXT3-fs: mounted filesystem with ordered data mode.

Ahora, buscamos la misma cadena pero queremos ver también las 3 líneas anteriores a la línea en la que se encuentra el resultado, utilizamos la opción “-B”:

$ grep -B 3 "EXT3-fs: mounted" /var/log/dmesg.0
[   13.274612] kjournald starting.  Commit interval 5 seconds
[   13.274635] EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
[   13.274864] EXT3 FS on sda5, internal journal
[   13.274871] EXT3-fs: mounted filesystem with ordered data mode.

Y para mostrar las tres líneas posteriores a la línea en la que se encuentra el resultado usamos “-A”:

$ grep -A 3 "EXT3-fs: mounted" /var/log/dmesg.0
[   13.274871] EXT3-fs: mounted filesystem with ordered data mode.
[   13.701126] type=1505 audit(1252737324.744:2): operation="profile_load" name="/usr/share/gdm/guest-session/Xsession" name2="default" pid=2105
[   13.763396] type=1505 audit(1252737324.805:3): operation="profile_load" name="/sbin/dhclient-script" name2="default" pid=2109
[   13.763557] type=1505 audit(1252737324.805:4): operation="profile_load" name="/sbin/dhclient3" name2="default" pid=2109

Por supuesto podemos combinar las dos opciones, en este caso mostramos 4 líneas anteriores y 4 posteriores:

$ grep -B 4 -A 4 "EXT3-fs: mounted" /var/log/dmesg.0
[   12.665349] input: SynPS/2 Synaptics TouchPad as /devices/platform/i8042/serio1/input/input9
[   13.274612] kjournald starting.  Commit interval 5 seconds
[   13.274635] EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
[   13.274864] EXT3 FS on sda5, internal journal
[   13.274871] EXT3-fs: mounted filesystem with ordered data mode.
[   13.701126] type=1505 audit(1252737324.744:2): operation="profile_load" name="/usr/share/gdm/guest-session/Xsession" name2="default" pid=2105
[   13.763396] type=1505 audit(1252737324.805:3): operation="profile_load" name="/sbin/dhclient-script" name2="default" pid=2109
[   13.763557] type=1505 audit(1252737324.805:4): operation="profile_load" name="/sbin/dhclient3" name2="default" pid=2109
[   13.763609] type=1505 audit(1252737324.805:5): operation="profile_load" name="/usr/lib/NetworkManager/nm-dhcp-client.action" name2="default" pid=2109