5.11.- Script’s útiles

Evitar que usuarios sin privilegios ejecuten el script

Algunos scripts realizan tareas administrativas por lo cual podríamos querer que solo el usuario root ejecute el script. En ese caso podemos usar algo como esto:

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi

Permite la ejecución del script a un usuario específico

#!/bin/bash
AUTHORIZED_USER="nombre de usuario"
if [ $USER != $AUTHORIZED_USER ]; then
echo "Este script debe ser ejecutado por el usuario $AUTHORIZED_USER" 1>&2
exit 1
fi

Verificar que un servicio/proceso se está ejecutando

Si queremos saber si existen procesos de algún servicio o programa ejecutándose podríamos usar este script (en este caso verifica que el demonio de Apache esté corriendo):

#!/bin/sh
SERVICE='firefox'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "El servicio $SERVICE esta ejecutándose"
else
echo "Atención! El servicio $SERVICE esta detenido"
fi

Crear un archivo de bloqueo

A veces debemos asegurarnos que el script no se ejecute dos o más veces simultáneas. Para ello podemos hacer uso de los archivos de bloqueo. Esta es una versión sencilla de un script que nos permite hacer esto:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
touch $lockfile
echo "Hago muchas cosas importantes aquí"
rm $lockfile
else
echo "Ya hay otro proceso corriendo"
fi

En este caso, se verifica que el archivo loquesea.lock exista. En caso de que exista, el script NO ejecuta sus tareas. Si no existe, crea el archivo, ejecuta las tareas que deba ejecutar y lo elimina. Pero, esto no es del todo fiable. ¿Qué pasaría si mientras nuestro script se está ejecutando es cerrado abruptamente?

En ese caso el archivo de bloqueo no se borraría, y por lo tanto, no nos permitiría ejecutar el script de nuevo. Para cubrir esos casos, podríamos hacer uso del comando trap que nos permite ejecutar comandos en caso que nuestro script termine de manera inesperada. Esta es una versión más avanzada que además guarda dentro del archivo de bloqueo el PID del script que lo ejecuta:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
echo "Hago muchas cosas aquí tranquilamente"
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Ya hay otro proceso de este script ejecutándose"
echo "corriendo con el PID: $(cat $lockfile)"
fi

Entendamos el comando trap un poco mejor. La sintaxis del mismo es básicamente es esta: trap comando signal [signal …]; donde signal es la señal de terminación que quieres atrapar. Si quieres ver una lista de las señales disponibles puedes ejecutar el comando kill -l o trap -l. Para el caso anterior se usaron los signals INT (captura la terminación producida por un Ctrl+c), TERM (terminación producida por el comando kill) y EXIT (terminación normal de un script, bien sea porque ya no hay más líneas que ejecutar o porque se encuentra con el comando exit).

Menú de opciones

Para hacer un menú en donde permitimos al usuario seleccionar una serie de opciones podemos usar el siguiente script:

#!/bin/bash
clear
while :
do
echo " Escoja una opcion "
echo "1. Quien soy?"
echo "2. Espacio disponible"
echo "3. Que es esto?"
echo "4. Salir"
echo -n "Seleccione una opción [1 - 4]"
read opcion
case $opcion in
1) echo "Tu eres:";
whoami;;
2) echo "Tienes esto";
df;;
3) uname -r;;
4) echo "Adiós!";
exit 1;;
*) echo "$opc es una opcion invalida. Es tan difícil?";
echo "Presiona una tecla para continuar...";
read foo;;
esac
done

Pedir confirmación antes de ejecutar un script

A veces es útil hacer que el usuario confirme la ejecución de un lote de sentencias, es decir, el típico mensaje que pide al usuario escribir si o no. Esto lo podemos hacer así:

#!/bin/bash
while true; do
echo
read -p "Esta seguro de hacerlo?" yn
case $yn in
si ) break;;
no ) exit;;
* ) echo "Por favor responda si o no";;
esac
done
echo "Has aceptado. Adiós!"

Redimensionar imágenes

Con la proliferación de las cámaras digitales de muchos megapixels, la gente tiende a mandar fotografías en tamaño poster. Para remediar esto nada mejor que poder redimensionar todas las imágenes localizadas en un directorio especificado:

Aspectos que hay que tener en cuenta:

  • Trabaja con el SW de ImageMagick, así que deberá estar instalado
  • Solamente trabaja con imágenes jpeg
  • La ubicación de las imágenes se puede pasar como argumento de manera absoluta o relativa a partir de donde se ejecute el script
  • La resolución por defecto es 1152×864. Posiblemente en su momento tuve alguna razón para elegirla.
#!/bin/bash
echo ""
echo "** Redimensionador de fotos v0.01 **"
if [ -z "$1" ]; then
   echo "No has indicado dónde están las fotos."
   echo "Uso: $0 path [resolution]"
   echo ""
   exit
else
   TEMP=`echo "$1" | cut -b1`
   if [ "$TEMP" != "\\" ]; then
      RUTA="$PWD/$1"
   else
      RUTA=$1
   fi
fi
counter=1
resolution=1152x864
if [ -z "$2" ]; then
   echo "INFO: Se utiliza la resolución por defecto: 1152x864"
else
   resolution=$2
fi
echo "Lugar: $RUTA | Resolución: $resolution"
if [ -d "$RUTA/resize_$resolution" ]; then 
   echo "ATENCIÓN!: El directorio destino YA existe"
else
   mkdir $RUTA/resize_$resolution
fi
for i in `ls $RUTA/ | grep -i jpg`; do
   echo "Trabajando en $i - Redimensionando a $resolution"
   convirtiendo -resize $resolution $RUTA/$i "$RUTA/resize_$resolution/$i"
   counter=`expr $counter + 1`
done
exit

  • Copia pega, modifica, experimenta con estos script’s de ejemplo.

 

Anuncios