lunes, 21 de mayo de 2012

Un ejercicio de examen resuelto

En el siguiente script se ofrece la solución al siguiente enunciado de examen (Nivel: 2º de ciclo de grado medio en Sistemas Microinformáticos y Redes).

Enunciado:
Perteneces al cuerpo de Técnicos de Asistencia Tecnológica del Ministerio de Defensa, hace unas horas se ha producido un terremoto en el que se contabilizan numerosas pérdidas humanas y materiales. Junto a un hospital de campaña, se han instalado unas carpas provisionales donde un equipo de 25 técnicos informáticos van a llevar a cabo las labores de recogida de datos de los damnificados, con objeto de realizar una valoración adecuada de los daños físicos y materiales que hayan sufrido. Eres el Coordinador de operaciones tecnológicas y debes crear un servidor Linux contra el que van a trabajar los 25 técnicos a través de sus portátiles, cada uno con su cuenta de usuario Linux en él.

Apartado 2 (1p):
Realiza un script que cumpla los siguientes requisitos:
Antes de nada, el script debe crear automáticamente en el home de tu usuario un archivo de texto llamado
técnicos_preparados.txt y establecer los permisos 744 para este.
Debe mostrar por pantalla un menú con las siguientes opciones:
1) Crear grupos de técnicos
2) Crear usuarios técnicos
3) Añadir técnico a un grupo
4) Crear árbol de datos
5) Visualizar técnicos preparados
6) Realizar salvaguarda de datos
7) Salir
El menú debe estar construido y controlado con las estructuras adecuadas.

Cada una de las opciones debe llevar a cabo:

Apartado 3 (2p): Opción 1:Se solicitará al usuario que introduzca el nombre del grupo a crear. Hay que comprobar que el usuario ha introducido algo, si no indicamos error y volvemos al menú. Con el nombre del grupo, comprobamos si éste existe en el sistema, si no existe lo creamos. Si existe, lo indicamos y volvemos al menú.
Apartado 4 (2p): Opción 2:
Se solicitará al usuario que introduzca el nombre del usuario a crear. Hay que comprobar que el usuario ha introducido algo, si no indicamos error y volvemos al menú. Con el nombre del usuario, comprobamos si éste existe en el sistema, si no existe lo creamos. Si existe, lo indicamos y volvemos al menú. El nuevo usuario debe ser integrado en el grupo que se creó en la Opción 1.
Apartado 5 (3p): Opción 3:Se solicitará el nombre del usuario y el nombre del grupo en el que queremos insertar dicho usuario. Se han de comprobar ambos valores para ver si el usuario ha metido algo por teclado o no. Si el usuario y el grupo existen en el sistema, se lanzará la orden para integrar al usuario en dicho grupo. Si alguno de los dos no existe, indicaremos error y volveremos al menú.
Apartado 6 (2p): Opción 4:Se solicitará el nombre del usuario al que hay que crearle el árbol de directorios. Si existe en el sistema, crearemos en su /home las siguientes carpetas:
· Empresas_afectadas
· Familias_afectadas
· Patrimonio_afectado
· Decesos
Una vez comprobada la creación de dichas carpetas para ese usuario, se irá añadiendo al archivo de texto llamado técnicos_preparados.txt los nombres de cada uno de los usuarios a los que les estemos haciendo este tratamiento.
Apartado 7 (1p): Opción 5:Se accederá al archivo técnicos_preparados.txt y se visualizará en pantalla su contenido, de este modo podremos saber a qué usuarios se les ha creado el árbol de datos. El programa debe detenerse hasta que el usuario pulse una tecla para continuar.
Entonces, volverá al menú.
Apartado 8 (2p): Opción 6:
Para esta opción, hay que crear una carpeta dentro de la carpeta /root cuyo nombre será el mismo nombre de tu usuario y dentro de ella, otra con nombre salvaguarda_datos, en la que se volcará todo el contenido del /home de tu usuario.
Opción 7:
Salida del Script.

Una posible solución a este enunciado podría ser la siguiente:

#!/bin/bash

sudo touch /home/$USERNAME/Escritorio/tecnicos_preparados.txt
sudo chmod 744 /home/$USERNAME/Escritorio/tecnicos_preparados.txt

function Crear_grupos()
{
while [ -z $grupo ]
do
    read -p "Introduce el nombre del grupo:" grupo
done

echo "El grupo que has introducido es : " $grupo
cat /etc/group |grep -w $grupo

if [ $? -eq 0 ]
then
    echo "El grupo existe en el sistema"
else
    sudo addgroup $grupo
    if [ $? -eq 0 ]
    then
        echo "El grupo se ha creado correctamente"
            echo "Grupo: " $grupo " OK" >> home/$USERNAME/Escritorio/tecnicos_preparados.txt
    else
        echo "Error el grupo no se ha creado correctamente"
    fi
fi
}

function Crear_usuarios()
{


while [ -z $usuario ]
do
    read -p "Introduce el nombre del usuario:" usuario
done

cat /etc/passwd | grep -w $usuario

if [ $? -eq 0 ]
then
    echo "El usuario existe en el sistema"
else
    sudo adduser $usuario
    if [ $? -eq 0 ]
    then
        echo "El usuario se ha creado correctamente"
        echo "Usuario: "$usuario"...........................OK" >> home/$USERNAME/Escritorio/tecnicos_preparados.txt
    else   
        echo "Error el usuario no se ha creado correctamente"
    fi
fi
}

function nuevo_tecnico()
{

while [ -z $tecnico ]
do
    read -p "Introduce el nombre del nuevo técnico: " tecnico
done

while [ -z $grupo_tecnico ]
do
    read -p "Introduce el grupo para el nuevo ténico: " grupo_tenico
done

echo "El tecnico introducido es: " $tecnico " y el grupo: " $grupo_tecnico
echo "Intentando unir el técnico al grupo..."

#Comprobamos si el usuario y el grupo existen

cat /etc/passwd | grep -w $tecnico
if [ $? -eq 0 ]
then
    existe_tecnico=1    #esta variable valdrá 1 si el tecnico existe
else
    existe_tecnico=0   #esta variable valdrá 0 si no existe
fi

cat /etc/group | grep -w $grupo_tecnico
if [ $? -eq 0 ]
then
    existe_grupo_tecnico=1    #esta variable valdrá 1 si el grupo existe
else
    existe_grupo_tecnico=0   #esta variable valdrá 0 si no existe
fi

if [ $existe_tecnico -eq 1 ] && [ $existe_grupo_tecnico -eq 1 ]
then
    #sudo adduser $tecnico $grupo_tecnico
      sudo usermod -G $grupo_tecnico $tecnico
    if [ $? -eq 0 ]
    then
        echo "El técnico ha sido integrado en el grupo correctamente"
    else
        echo "Error al integrar técnico en grupo"
    fi
else
    echo "Error, o el técnico no existe o el grupo tampoco"
fi

}


function Crear_arbol()
{

while [ -z $usuario ]
do
    read -p "Introduce el nombre del usuario:" usuario
done

cat /etc/passwd | grep -w $usuario
if [ $? -eq 0 ]
then
    echo "Ok, el usuario sí existe en el sistema"
    if [ -d /home/$usuario ]
      then
        echo "Creando árbol de carpetas..."
            sudo mkdir /home/$usuario/Empresas_afectadas
            if [ $? -eq 0 ]
        then
             echo "Empresas_afectadas creada"
        else
            echo "Error Empresas_afectadas no creada"
        fi

        sudo mkdir /home/$usuario/Familias_afectadas

            if [ $? -eq 0 ]
        then
             echo "Familias_afectadas creada"
        else
            echo "Error Familias_afectadas no creada"
        fi

        sudo mkdir /home/$usuario/Patrimonio_afectado

            if [ $? -eq 0 ]
        then
             echo "Patrimonio_afectado creada"
        else
            echo "Error Patrimonio_afectado no creada"
        fi

        sudo mkdir /home/$usuario/Decesos   

            if [ $? -eq 0 ]
        then
             echo "Decesos creada"
        else
            echo "Error Decesos no creada"
        fi
    else
        echo "La carpeta personal no existe, no se creará el árbol"
    fi
else
    echo "Error, el usuario no existe en el sistema"
fi
}

function Visualizar_tecnicos()
{
    clear
    echo "Mostrando los técnicos creados..."
    cat /home/$USERNAME/tecnicos_preparados.txt   
    read
}

function Realizar_salvaguarda()
{
sudo mkdir /root/$USERNAME

if [ $? -eq 0 ]
then
    echo "La carpeta $USERNAME se ha creado con éxito"
    sudo mkdir /root/$USERNAME/salvaguarda_datos
      # Esta creación habría que comprobarla
      cp -r /home /root/$USERNAME/salvaguarda_datos
      if [ $? -eq 0 ]
      then
           echo "Ok, salvaguarda realizada con éxito"
            echo "Mostrando los datos recopilados..."
        ls /root/$USERNAME/salvaguarda_datos
    else
        echo "Error al realizar salvaguarda de datos"     
    fi
else
    echo "La carpeta $USERNAME no se ha creado con éxito"
fi
}

#...........................
#     PROGRAMA PRINCIAL
#..........................

while [ "$opcion1" != "7" ]
do
clear
echo "******* MENÚ ********"
echo "1) Crear grupos de técnicos"
echo "2) Crear usuarios técnicos"
echo "3) Añadir técnico a un grupo"
echo "4) Crear árbol de datos"
echo "5) Visualizar técnicos preparados"
echo "6) Realizar salvaguarda de datos"
echo "7) Salir"

read -p "Introduce una opción:" -n1 opcion1

case $opcion1 in

    1) Crear_grupos;;

    2) Crear_usuarios;;
    3) nuevo_tecnico;;
    4) Crear_arbol;;
    5) Visualizar_tecnicos;;
    6) Realizar_salvaguarda;;
    7) echo "" ;;
    *) echo "Opción no válida";;
esac
done
echo "Gracias por utilizar este software"
exit 0

viernes, 11 de mayo de 2012

Columnas utilizando la etiqueta div

En el código siguiente se expone cómo crear dos columnas de diferente anchura utilizando la etiqueta div. En la columna de la derecha se ubican 3 divs adicionales para ubicar información. En cada uno de estos div podríamos incrustar el código que deseemos, iframes o cualquier otra cosa.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <title>2 columnas con CSS</title>
  <style type="text/css">
  <!--
 
#inicio_ausencias {
  float:right;
  height:100px;
  width:60%;
  background-color:#99FF99;
}
#inicio_expulsados {
  float:right;
  height:100px; 
  width:60%;
  background-color:#99FF99;
  }

#inicio_email {
  float:right;
  height:100px; 
  width:60%;
  background-color:#99FF99;
  }
 
#profesoradoguardia {
  float:left;
  height:300px;
  width:40%;
  background-color:#99FFFF;
  }
  -->
  </style>
  </head>
<body>
  <div id="contenedor3">
     <div id="profesoradoguardia">Profesorado de guardia
     </div>
     <div id="inicio_ausencias">Profesorado ausente hoy...
     </div>
     <div id="inicio_expulsados">Alumnado y periodos de expulsión...
     </div>
     <div id="inicio_email">Buzón entrada email guardias...
  </div>
    
     
  </div>
  </body>
  </html>

lunes, 7 de mayo de 2012

Copia de seguridad muy básica (tar)

El script que se muestra a continuación utiliza la orden tar para crear una copia de seguridad muy básica de una carpeta del usuario.

#!/bin/bash

#Este script realiza una copia de seguridad de los archivos del home del usuario en una carpeta llamada backup. Se utilizará para programar posteriormente una tarea de cron que lo active cada X tiempo.


clear
echo "COPIA DE SEGURIDAD DE TUS DOCUMENTOS"
echo "************************************"
echo "Vamos a realizar una copia de seguridad de tus documentos $USERNAME"

read -p "pulsa una tecla para comenzar"

if [ -d /home/$USERNAME/backup ]
then
    echo "La carpeta de copias de seguridad existe, no se creará"
    echo "Comienza la compresión"
    cd /home/$USERNAME/backup   
    tar -czvf backup.tgz /home/$USERNAME/Documentos > /dev/null
    if [ $? -eq 0 ]
      then
        echo "Copia realizada con éxito, listando resultados"
        ls -l /home/$USERNAME/backup
        read -p "pulsa una tecla"
    else
        echo "Error al realizar la copia"
        exit 1
    fi
else
    echo "Creando carpeta de copias de seguridad..."
    mkdir /home/$USERNAME/backup
    if [ -d /home/$USERNAME/backup ]
    then
        echo "Carpeta creada con éxito"
        echo "Comienza la compresión"   
        cd /home/$USERNAME/backup
        tar -czvf backup.tgz /home/$USERNAME/Documentos  > /dev/null
        if [ $? -eq 0 ]
          then
            echo "Copia realizada con éxito, listando resultados"
            ls -l /home/$USERNAME/backup
            read -p ""
        else
            echo "Error al realizar la copia"
            exit 1
        fi
    else
        echo "Error al crear carpeta de copias"
        exit 1
    fi
fi

miércoles, 11 de abril de 2012

Un menú dentro de otro y uso de funciones

El siguiente código muestra una posible solución (parcialmente completa) a un ejercicio que integra un menú de gestión de carpetas, dentro de otro menú. Ambos, están construidos a través de la sentencia case y cada una de las operaciones del segundo menú se implementan mediante funciones.

Es un script orientativo para practicar con sentencias case, su sintaxis y particularidades relacionadas con el uso de los puntos y coma al final de cada orden, así como de funciones que simplifican en gran medida el trabajo a la hora de utilizar menús.

Nota: la creación, borrado y listado de las carpetas se ha fijado en el home del usuario que en ese momento esté conectado al sistema, por simplificar.

#!/bin/bash

function crear_carpeta()
{
    clear
    echo "CREACIÓN DE CARPETA"
    echo    
    read -p "Introduce el nombre de la carpeta a crear: " carpeta
    if [ "$carpeta"="" ]
    then
        echo "No has introducido una carpeta para crearla"
        exit 1
        # Cerramos el script indicando error(drástico)
    else
        # Ahora gestionamos la creación
        echo "El nombre introducido es: " $carpeta
        if [ -d /home/$USERNAME/$carpeta ]
        then
           echo "La carpeta indicada existe, no se creará"
        else
           mkdir /home/$USERNAME/$carpeta
           if [ $? -eq 0 ]
           then
               echo "Carpeta creada con éxito"
           else
               echo "Error al crear la carpeta"
           fi
        fi
    fi
    read -p "Pulse una tecla para continuar"
}


function borrar_carpeta()
{
    clear
    echo "BORRADO DE CARPETA"

    echo     read -p "Introduce la carpeta a borrar: " carpeta2
    if [ "$carpeta2"="" ]
    then
        echo "No has introducido una carpeta para borrarla"
        exit 1
        # Cerramos el script indicando error(drástico)
    else
        # Ahora gestionamos el borrado
        if [ -d /home/$USERNAME/$carpeta2 ]
        then
            echo "Ok, tu carpeta existe. Borrándola..."
            rm -r /home/$USERNAME/$carpeta2
            if [ $? -eq 0 ]
            then
                echo "Carpeta borrada con éxito"
            else
                echo "Error al borrar la carpeta"
            fi
        else
            echo "La carpeta introducida no existe, no se borrará nada"
        fi
    fi
    read -p "Pulse una tecla para continuar"
}

function listar_carpeta()
{
    clear
    echo "LISTADO DE CARPETA"
    echo   
    echo "Estas son las carpetas actuales en tu home: "
    ls /home/$USERNAME | more
    echo "........................................"
    read -p "Introduzca la carpeta a listar: " carpeta3
    if [ -d /home/$USERNAME/$carpeta3 ]
    then
        echo "Listando carpeta..."
        ls -l /home/$USERNAME/$carpeta3
    else
        echo "Error, la carpeta indicada no existe"
    fi
    read -p "Pulse una tecla para continuar"
}


# PROGRAMA PRINCIPAL

while [ "$opcion1" != "b" ]
do
  clear
  echo "*******MENU PRINCIPAL *********"
  echo "a) Gestionar carpetas          "
  echo "b) Salir                       "
  echo "*******************************"

  read -p "Introduzca una opción: " -n1 opcion1

  case $opcion1 in
    a) while [ "$opcion2" != "4" ]
       do
           clear;
           echo "******* MENU CARPETAS *******";
           echo "1) Crear carpeta";
           echo "2) Borrar carpeta";
           echo "3) Listar carpeta";
           echo "4) Salir";
           echo "*****************************";
           read -p "Introduce una opción: " -n1 opcion2;
      
          case $opcion2 in
             1) crear_carpeta;;
             2) borrar_carpeta;;
             3) listar_carpeta;;
             4) ;;
             *) echo "Opción no válida";;
          esac;
       done;;

    b)echo "Fin del script";;

  esac
 done

echo "Gracias por utilizar este programa"
read
exit 0

domingo, 4 de marzo de 2012

Sincronización de carpetas con rsync vía SSH


Vamos a sincronizar carpetas entre dos máquinas Linux, de manera parecida a como lo hacemos con DropBox. Pero queremos hacerlo a través de la red y utilizando el servicio SSH.

Para ello, necesitaremos tener instalado un servidor SSH en el equipo que recibirá la información (Openssh-server) . Ponemos en funcionamiento el servicio SSH y dejamos esa máquina esperando.

Nos vamos a la máquina Linux que tiene la información original, que suponemos estará en una carpeta del home u otra ubicación. Abrimos una consola de comandos y tecleamos por ejemplo:

rsync -avz /home/usuario/ akenon@192.168.1.52:/home/akenon/recipiente

Donde:
/home/usuario - es la carpeta origen, es decir, desde la que queremos sacar la información hacia la otra máquina.
akenon - es un usuario válido en la máquina destino.
@ - es el separador entre ese usuario y la IP de la máquina destino.
192.168.1.52 -  es la IP de la máquina destino (La que tiene el servicio SSH activo)
:/home/akenon/recipiente - con los dos puntos indicamos que lo que viene detrás es la ruta de la carpeta que recibirá los datos de la sincronización, en la máquina destino.

Lógicamente, esta explicación puede cambiar si las carpetas están en otras ubicaciones y si se tiene permisos sobre ellas. Vosotros mismos.

Si todo va bien, se llevará a cabo la sincronización de carpetas sin problemas.

Para complementar la información indicada anteriormente, pásate por los siguientes enlaces y aclararás más de un concepto:



Enviar emails desde consola Ubuntu (ssmtp)

Para poder enviar emails fácilmente desde consola de comandos de GNU/Linux con una cuenta de gmail, realizaremos los siguientes pasos:

1) sudo apt-get install ssmtp
2) Editamos el archivo /etc/ssmtp/ssmtp.conf y añadimos la configuración de la cuenta de correo electrónico que realizará los envios. Busca los elementos que aparecen a la izquierda del igual y, si estás utilizando una cuenta de gmail, añade a la derecha los datos que se muestran a continuación.

root=usuario@gmail.com
mailhub=smtp.gmail.com:587
rewriteDomain=
hostname=usuario de gmail sin gmail.con
AuthUser=usuario de gmail
AuthPass=tu_password
Eliminaremos también el carácter # que aparece antes de la línea que contiene FromLineOverride=YES

Nos posicionaremos al principio de este archivo de configuración y pondremos como primera línea:
UseSTARTTLS=YES


3) Editamos ahora el archivo /etc/ssmtp/revaliases y, siguiendo los ejemplos que aparecen comentados en su interior, añadiremos dos líneas iguales a las siguientes:

root:usuario@gmail.com:smtp.gmail.com:587
tu_usuario_en_Linux:usuario@gmail.com:smtp.gmail.com:587

de este modo estarás indicando a ssmtp que tanto el root, como tu usuario genérico de Linux tienen permiso para enviar correos a través de ssmtp.

4) Ok, ya tenemos configurado ssmtp. Ahora para enviar un email podemos teclear:
ssmtp dirección_destino@loquesea.com

El cursor se queda parpadeando y tendremos que indicar los elementos típicos de un mensaje de correo electrónico. Algo así:

Subject: esto es una prueba desde consola
<dejamos una línea en blanco>
Este es el cuerpo del mensaje de prueba escrito desde consola.
<Para finalizar el mensaje pulsaremos Ctrl+D y se enviará automáticamente>

5) Si quieres que el envío se realice sin interactividad, sólo tienes que preparar un archivo de texto en el que guardes en su interior (en el formato de email: From, Subject, Body,...) el contenido que desees y se lo pases al envío del mensaje. Por ejemplo, así:

ssmtp dirección_destino@loquesea.com < mensaje_correo.txt

Esto es todo, las posibilidades son innumerables cuando se trata de monitorizar servidores, supervisar copias de seguridad programadas, etc. Nuestros servidores nos avisarán de posibles incidencias  o de su actividad, descargándonos de su vigilancia contínua.





 









domingo, 11 de marzo de 2007

Bienvenidos!!

Os doy la bienvenida al Blog del Profesor Jose Luis García. En este blog iré plasmando información útil relacionada con los módulos profesionales que imparto.

Espero que os sea útil.