# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

/etc/rc.local: Ejecutar comandos o scripts en el arranque de *nix

Si no queremos crear un script único (aunque suele ser lo recomendable) para la ejecución de un comando o un script cada vez que iniciamos un sistema tipo Unix (BSD, Gnu/Linux, etc) tenemos la posibilidad de llamarlo desde el fichero /etc/rc.local

Cualquier comando que coloquemos o script al que llamemos en dicho fichero será ejecutado al final del arranque, es decir, cuando todos los scripts que tenemos en el runlevel correspondiente hayan sido ejecutados.

Por defecto el fichero únicamente muestra el siguiente comentario:

# cat /etc/rc.local 

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

A partir de aquí simplemente habría que añadir los comandos que quisieramos ejecutar, es básicamente un script en bash:

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

# Ejemplo de creación de fichero en el arranque
touch ~/test.txt
# Asignamos permisos a un fichero
chmod 0644 ~/test.txt
# Ejecutamos un script
/bin/sh ~/test.sh

Cómo vaciar ficheros en Linux

Existen varias formas de vaciar el contenido de ficheros en sistemas Unix desde la línea de comandos, algunas de ellas son las siguientes:

# echo "" > fichero
# > fichero
# :> fichero
# cat /dev/null > fichero
# true > fichero

Cómo buscar y reemplazar en vi ó vim

Sé de alguien que siempre olvida como buscar y reemplazar una cadena de texto en todo un fichero con vi o vim ;) así que lo mejor será dejar este truco plasmado en una entrada.

Si queremos reemplazar una cadena de texto o palabra en todo un fichero de texto, lo abrimos con vim:

$ vim fichero

Una vez dentro, presionamos ESC para entrar en modo de ejecución de comandos, la sintaxis para reemplazar una cadena de texto en todo el fichero sería:

:g/texto_a_sustituir/s//texto_nuevo/g

Y presionamos ENTER, automáticamente todo lo que sea “texto_a_sustituir” será modificado por “texto_nuevo“.

Todo el mundo me dice que esta es una forma complicada de hacerlo, yo es la que aprendí en su día y siempre me acuerdo de ella, otra forma más sencilla es:

:%s/texto_a_sustituir/texto_nuevo/g

Me consta que hay muchas más formas de hacerlo, cada cual que encuentre la que más cómoda le parezca.

Ah, para buscar simplemente en vim, tenéis que presionar ESC para acceder a modo comando, posteriormente “/” (shift +7), escribir la cadena a buscar y presionar ENTER. Para moveros a lo largo del fichero por los resultados, presionad la tecla “n”.

Dedicado al SysAdmin de Tu Receta ;)

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.