5. Propuesta de ejercicios

A continuación se le propone la creación de una serie de scripts. Para ello, será necesario tanto usar los conocimientos expuestos en este documento, como otros relativos a la administración de Linux:

  1. Los ficheros /etc/profile (leído en el arranque del sistema y común para todos los usuarios), ~/.bashrc, ~/.bash_profile (leídos al abrir una sesión con el usuario correspondiente, no es necesario que existan ambos), usados para cargar las variables de entorno, son en realidad shell-scripts. Analice el contenido de dichos scripts y modifíquelos convenientemente para definir los alias:

    • alias red='ifconfig -a': para todos los usuarios del sistema.

    • alias casa='echo $PWD': sólo para el usuario normal.

    • alias sockets='netstat -l': sólo para el usuario root.

    Repita lo anterior pero utilizando funciones en vez de alias.

  2. Cree los siguientes scripts:

  • variables.sh: debe inicializar las variables CONFIG='-a', ARP='-n' y ROUTE.

  • funciones.sh: debe definir las funciones arranque_red() (encargada de activar la tarjeta de red), parada_red() (encargada de desactivar la tarjeta de red) y estado_red() (encargada de ejecutar los comandos ifconfig, arp y route aplicándoles los parámetros pasados a la función en los argumentos 1, 2 y 3, respectivamente).

  • script1.sh: debe importar las variables y funciones definidas por los dos scripts anteriores. Mostrará al usuario un menú en el que le pregunte si desea arrancar la red (invocando la función arranque_red()), pararla (función parada_red()) o mostrar su estado (función estado_red()). Debe comprobar si alguna de las variables CONFIG, ARP y ROUTE es nula y, en caso de serlo, permitirle al usuario escribir interactivamente (mediante read) los parámetros con los que invocar el comando correspondiente.

  1. script_copy.sh: script que copie un fichero regular en otro, ambos pasados como argumentos. Si no se le pasan los argumentos, lo comprobará, y solicitará al usuario que los introduzca interactivamente.

  2. script_print.sh: script que imprima en pantalla el contenido de un fichero de datos, o el contenido de todos los ficheros de un directorio, según se le pase como argumento un fichero regular o un directorio.

  3. script_borrar.sh: script que borre con confirmación todos los ficheros pasados como argumentos.

  4. script_sesiones.sh: script al que, pasándole el login de un usuario, devuelva cuántas sesiones tiene abiertas en el sistema.

  5. script_mostrar.sh: script que para cada argumento que reciba (puede recibir una lista de argumentos) realice una de las siguientes operaciones:

    • Si es un directorio, ha de listar los ficheros que contiene.

    • Si es un fichero regular, tiene que imprimir su contenido por pantalla.

    • En otro caso, debe indicar que no es ni un fichero regular ni un directorio (por ejemplo, un fichero de bloques o de caracteres del directorio /dev).

  6. script_ejecucion.sh: script que asigne el permiso de ejecución a los ficheros regulares o directorios pasados como argumento (puede admitir una lista de ficheros).

  7. script_doble.sh: script que pida un número por teclado y calcule su doble. Comprobará que el número introducido es válido y, antes de terminar, preguntará si deseamos calcular otro doble, en cuyo caso no terminará.

  8. script_tipos.sh: script que devuelva el número de ficheros de cada tipo (ficheros regulares o directorios) que hay en un determinado directorio, así como sus nombres. Tendrá un único argumento (opcional) que será el directorio a explorar. Si se omite dicho argumento, se asumirá el directorio actual. Devolverá 0 (éxito) si se ha invocado de forma correcta o 1 (error) en caso contrario.

  9. script_user.sh: script que reciba como argumento el identificador de un usuario e imprima por pantalla la siguiente información: identificador, nombre completo del usuario, directorio home, shell que utiliza, número de sesiones actualmente abiertas y procesos pertenecientes a dicho usuario. El script debe permitir las siguientes opciones:

    • -p: sólo muestra la información de los procesos.

    • -u: muestra toda la información excepto la referente a los procesos.

    • --help: muestra información de ayuda (uso del script).

    El script debe comprobar si los argumentos pasados son correctos, así como la existencia del usuario indicado. Como código de error podrá devolver 0 (éxito), 1 (sintaxis de invocación errónea), 2 (usuario no existe).

  10. script_menu.sh: script que ofrezca al usuario un menú (con una opción para salir) desde el que el usuario pueda seleccionar cual de los scripts anteriores (apartados «b» a «k») quiere utilizar.

  11. script_puerto.sh: script que reciba como argumento un número de puerto TCP (PUERTO) y comprobará si el valor es un número entero positivo en el rango [1, 1023], de modo que:

    • Si es así: el script analizará si los puertos TCP PUERTO y PUERTO+1 del equipo local se encuentran a la escucha. Tras ello, imprimirá un mensaje indicando el estado obtenido. Para ello, puede analizar la salida del comando netstat.

    • En otro caso: imprimirá por pantalla un mensaje indicando que el valor indicado no es un puerto de sistema.

  12. script_arp.sh: script que reciba como argumento un número entero, guardándolo en la variable POS_ARP. El script comprobará si el valor de la variable POS_ARP es un número entero positivo, de modo que:

    • Si es así: el script calculará el número de entradas que actualmente tiene la caché ARP del equipo, guardándolo en la variable NENTRADAS. Si el valor de POS_ARP es mayor que NENTRADAS, imprimirá por pantalla un mensaje tal como: «Ninguna entrada en la posición POS_ARP». En caso de que POS_ARP sea menor o igual que NENTRADAS, imprimirá por pantalla un mensaje con la posición de la entrada ARP POS_ARP, seguido del contenido de dicha entrada ARP.

    • En otro caso: imprimirá por pantalla un mensaje indicando que el valor indicado no es un número entero: «Posición de entrada ARP no válida».

    Se solicitan dos posibles soluciones:

    • script_arp1.sh: usando read y estructuras de control.

    • script_arp2.sh: analizando la salida del comando arp mediante comandos de análisis de texto.

  13. script_param.sh: Considere que en el shell actual se dispone de la variable:

    VAR="nombre=v1&edad=v2&tlf=v3"
    

    Escriba un shell-script que analice el valor de dicha variable y para cada uno de los parámetros extraiga su valor y lo imprima por pantalla. Por ejemplo, que la salida sea:

    Cadena: nombre=v1&edad=v2&tlf=v3
    nombre: v1, edad: v2, tlf: v3.
    

    Se solicitan dos posibles soluciones:

    • script_param1.sh: usando la variable de entorno IFS.

    • script_param2.sh: sin usar IFS.