Tag Archives: shell

Capturar Señales con Trap

Cuando estamos programando algún script puede interesarnos mandar señales mientras se está ejecutando. Para lograr que el script responda a las señales de kill utilizaremos la orden trap, que tiene la siguiente sintaxis.

trap acción señales

Los parámetros son:

  • acción: Definiremos que ejecutar cuando reciba la señal.
  • señales: Es la lista de señales ante las que responderá el script.

El principal uso de esto es controlar la salida de nuestro scripts, de forma que sea un cierre controlado, sin dejar archivos abiertos o temporales sin borrar.

Un ejemplo

#!/bin/bash

trap 'echo "Señal recibida"; exit' SIGKILL

while true
do
  echo "Soy un bucle"
done

En este caso cuando ejecutamos el script, si le enviamos un SIGKILL escribirá “Señal recibida” en el terminal y terminará.

En este punto también comentar que podemos usar varias lineas de trap para actuar de distinta forma ante distintas señales.

#!/bin/bash

trap 'echo "Señal SIGUSR1"; exit' SIGUSR1
trap 'echo "Señal SIGUSR2"; exit' SIGUSR2

while true
do
  echo "Soy un bucle"
done

Responderá diferente ante las señales SIGUSR1 y SIGUSR2.

Ejecutar Comandos con un Usuario sin Shell Válida

Si tenemos en el sistema usuarios sin shell válida como por ejemplo los usuarios que acceden por FTP o que lanzan demonios y queremos ejecutar algún comando con ellos como por ejemplo actualizar su tabla de tareas de Cron, podemos hacerlo de la siguiente manera:

# su $USER -c comando -s /bin/bash

En este caso, ejecutara el comando bajo la shell bash.

Como hemos dicho, para alterar la tabla de Cron hacemos.

# su $USER -c "crontab -e" -s /bin/bash

Cerrar la Sesión de Consola por Inactividad

Al acceder por consola para administrar algún sistema, podemos cometer la imprudencia de dejar la sesión abierta. Para prevenir esto que puede desembocar en alguna infiltración porque alguien pase por ahí podemos hacer uso de la variable TMOUT.

La sintaxis es la siguiente.

TMOUT=segundos

Donde segundos son los segundos de inactividad que se esperará para cerrar la sesión.

Al incluir esta variable en el .bashrc mejorará la seguridad de nuestros sistemas, al menos en el de root.

Utilizando ficheros de configuración en los scripts de Bash

En algunas ocasiones tal vez necesites crear un script de Bash para resolver algunas tareas y que utilice un fichero de configuración. ¿Cómo lo plantearías? ¿Cómo implementarías el fichero de configuración?

Lo primero que pensé fue en utilizar el comando cut de forma que el fichero de configuración tuviera un formato de etiqueta=valor, y podría “cortar” para leer la etiqueta y el valor. Pero es mala cosa, porque por cada línea del fichero de configuración tienes que cortar y luego saber qué etiqueta es. La mejor solución, el comando source

Suponemos un fichero de configuración config.ini como este:

PATTERN="$hello*"
FILENAME=hello.txt
OUTPUT=result.txt

Y queremos que nuestro script lea estas variables y ejecute grep

#!/bin/bash
source config.ini

grep ${PATTERN} ${FILENAME} > ${OUTPUT}

El comando source importara todas las variables del fichero de configuración config.ini en nuestro script y prodremos utilizarlas para lanzar grep. También podemos sustituir el comando source por un . (un punto) así:

. config.ini

También podemos importar otros script con sentencias de control (if-else) pero hay que tener cuidado porque si el script que importamos contiene el comando exit el programa finalizará en ese punto. Por ejemplo, importamos el siguente trozo de código:

config.sh

#!/bin/bash
HELLO=world
exit

Y lo utilizamos en este:

parent.sh

#!/bin/bash
source config.sh
echo ${HELLO}

Cuando lanzamos el script ./parent.sh terminará antes de llegar a la línea de echo porque ha leído el exit

Espero que este pequeño truco os de una idea de como utilizar el comando source para importar fichero de configuración dentro de vuestros scripts

Es una traducción de este truco en linux.byexamples.com