Ejercicios de shell scripting

Ejercicios de shell scripting#

Crea un script llamado disk.sh que imprima por pantalla el porcentaje que esta ocupada la partición /home. Tiene que quedar:

75% /home

Crea un script llamado mem.sh, obtiene solamente la memoria en MB ocupada y haz que se escriban en un archivo llamado free.log cada vez que se ejecute, sin borrar el anterior registro.

Crea un script llamado mac.sh que obtiene la MAC de tu tarjeta de red

Crea un script llamado listar_usuario_grupo.sh que saque por pantalla el nombre de los usuarios que hay creados en el sistema y al grupo que pertenecen, por ejemplo

alumno1 : smr1
alumno2 : smr1
alumno3 : asir1
alumno4 : asir2

Crea un script llamado lastlog_ip.sh que muestre un listado ordenado con el nº de veces que se a logueado cada ip, por ejemplo

16 10.2.104.100
11 10.2.3.100
10 139.47.103.76
9 10.2.105.100
8 2.153.195.106
8 10.2.4.100
8 10.2.105.106

Crea un script llamado lastlog.sh que muestre un listado ordenado con el nº de veces que se a logueado cada usuario y el grupo al que pertenecen, por ejemplo

44 alumno1 smr1
32 alumno2 smr1
14 alumno3 asir1
4 alumno4 asir2

Crea un script llamado tabla_multiplicar_read.sh que pide un número al usuario y muestre su tabla de multiplicar

Crea un script llamado tabla_multiplicar.sh, ahora no preguntara por el numero al usuario y haz muestre su tabla de multiplicar cuando se ejecute por ejemplo ./tabla_multiplicat.sh <N> siendo <N> un numero del 1 al 10.

  • En el caso de ejecutar ./tabla_multiplicat.sh --help mostrara un mensaje de ayuda (consejo utiliza una función)

  • En el caso de ejecutar ./tabla_multiplicar.sh X Y Z ... , es decir con más de un argumento saldrá un mensaje No se puede dar más de un argumento

  • En el caso de ejecutar ./tabla_multiplicar.sh sin argumentos se ejecutara la opción de –help

Crea una carpeta llamada imagenes, entra dentro y ejecuta los siguiente comandos:

for i in jpeg jpg png gif tiff bmp svg
do
  for((j=0;j<10;j++))
  do
    echo imag_${RANDOM}.$i > imag_${RANDOM}.$i
  done
done

Crea un script llamado imag.sh que cambie todas extensiones de todos los archivos a png conservando el nombre

Crea un script llamado temperatura.sh, que lea las temperatura del archivo temperatura.dat y saque por pantalla la temperatura media

Haz un script llamado rnd.sh que muestre 5 números aleatorios del 1 al 10 seguidos de el mismo número de As,

1 A
3 AAA
1 A
6 AAAAAA
2 AA

Haz que el reciba como argumento de entrada en numero de intentos, es decir ./rnd.sh 5

En el caso de no recibir ningún numero haz que saque 5

Crea un script llamado adivina.sh que escoja un numero aleatorio entre 1 y 20, pregunte al usuario, le diga si es más pequeño o más grande y que continué hasta que acierte.

Cuando el usuario acierte haz que muestre el número de intentos.

Crea un script en Bash llamado piedra_papel_tijera.sh que simule el juego de (Piedra, Papel o Tijera) entre dos jugadores durante un número dado de partidas.

Cada jugador debe elegir aleatoriamente entre piedra, papel o tijera. El programa deberá contar cuántas veces gana el Jugador 1, cuántas gana el Jugador 2 y cuántas veces empatan.

La salida debe ser un resumen con los porcentajes de empate, victoria del Jugador 1 y victoria del Jugador 2, con dos cifras decimales de precisión.

Una vez creado el script, muestra los resultados, como sigue:

for i in 10 50 100 1000 10000 100000;
do
  echo $i $(./piedra_papel_tijera.sh $i)
done

10 Empate = 40.00 %, Gana 1 = 40.00 %, Gana 2 = 20.00 %
50 Empate = 36.00 %, Gana 1 = 46.00 %, Gana 2 = 18.00 %
100 Empate = 31.00 %, Gana 1 = 32.00 %, Gana 2 = 37.00 %
1000 Empate = 34.30 %, Gana 1 = 34.40 %, Gana 2 = 31.30 %
10000 Empate = 33.75 %, Gana 1 = 33.01 %, Gana 2 = 33.24 %
100000 Empate = 33.30 %, Gana 1 = 33.24 %, Gana 2 = 33.44 %

Haz un script llamado notas.sh que a partir de un fichero donde se recogen las calificaciones de los alumnos en los distintos módulos denominado calificaciones.txt con el siguiente formato:

Lucía Sánchez: 10, 6, 6, 5, 8
María Vargas: 9, 7, 4, 4, 7
Lucía Pérez: 7, 5, 10, 8, 4
Miguel González: 9, 7, 10, 3, 5
Miguel López: 6, 4, 6, 10, 9
Elena García: 3, 3, 3, 10, 4
Pedro Torres: 6, 4, 10, 9, 4

Se pide:

  1. El número de alumnos matriculados.

  2. El número de alumnos que han aprobado todos los módulos.

  3. El número de alumnos que han suspendido sólo un módulo.

  4. El número de alumnos que han suspendido dos módulo.

  5. El número de alumnos que han suspendido tres módulos o más.

  6. Indicar el número de alumnos aprobados/suspensos en porcentaje.

Descarga el archivo calendario.dat, encontrara 543 citas donde el primer campo es el mes, el segundo campo es el día, el tercer campo es la hora y el cuarto la cita

Crea una script llamado analizar_cal.sh que considere las siguientes entradas:

  • Muestra un mensaje de ayuda

    ./analizar_cal.sh --help
    salida:
    Uso : analizar [OPCION]
    Options:
    - mes <mes>  muestra el número de citas que hay en un mes
    - d <día> muestra el numero de citas que hay para ese día para todos los meses
    
  • En el caso de no dar ninguna entrada tambien mostrará el mensaje de ayuda

  • Muestra el número de citas que hay por mes

    ./analizar_cal.sh -mes Julio
    39
    
  • Muestra el número de citas que hay por un determinado día para todos los meses

    ./analizar_cal.sh -d 4
    11
    
  • Muestra el número de citas que se han producido durante todo el año de forma ordenada

    ./analizar_cal.sh -resumen citas | head
    23 Reunión de trabajo.
    16 Cita con el médico.
    14 Llamada con un cliente.
    14 Entrega de proyectos.
    14 Cumpleaños de un amigo.
    14 Clase de yoga o ejercicio.
    14 Cena con amigos.
    14 Aniversario de boda.
    13 Conferencia o seminario.
    10 Visita al dentista.
    
  • Muestra el numero de citas que hay por diferentes franjas horarias

    ./analizar_cal.sh -resumen horas
    De 10:00-10:59 hay 87 citas
    De 11:00-10:59 hay 80 citas
    De 12:00-10:59 hay 99 citas
    De 13:00-10:59 hay 97 citas
    De 14:00-10:59 hay 79 citas
    De 15:00-10:59 hay 101 citas
    

Crea un script llamado rep.sh que diga el numero de veces que estan repetidos los siguientes nombres del archivo nombres.dat

Sube al curso un script llamado monedas.sh que tire tres monedas y escriba en un archivo el resultado.

Haz que lea el archivo y obtenga el porcentaje de veces que salen 3 caras.

En el caso de que no se proporcione el número de tiradas ni el archivo, tomara por defecto el archivo llamado tiradas.dat y hará 100 tiradas.

En el caso de que no encuntre el archivo cuando lo va a leer, tomara por defecto monedas.dat, si este no existe, mostrará que no existe.

$ ./monedas.sh -help
-n <tiradas> <archivo>
-read <archivo>

Crea un script en Bash llamado ips.sh que cumpla con los siguientes requisitos:

Si ejecutas el script con ./ips.sh -help, debe mostrar la siguiente ayuda:

-help                         : muestra la ayuda
-file <archivo> <número_ips>  : Crea un archivo llamado <archivo> con <número_ips>.
-find <archivo> <ip>          : Muestra cuantas veces aparece la <ip>
-read <archivo>               : Muestra de forma ordenada las IPs por número de conexiones
  • Si ejecutas el script sin argumentos ./ips.sh, también debe mostrar la ayuda.

  • Si ejecutas el ./ips.sh -file sin indicar el <número_ips> tomara por defecto 50, en el caso de no darle el <archivo> tomará por defecto ip.dat. Cada línea tendrá una IP aleatoria dentro del rango 192.168.2.0/28. La primera IP utilizable es 192.168.2.1 y la última es 192.168.2.14.

  • Si ejecutas el ./ips.sh -find lee el <archivo>, si no existe o no se le indica, mostrará por pantalla «El archivo no existe», en el caso de que no se proporcione <ip> mostrará por pantalla «Proporcionar ip»

  • Si ejecutas el ./ips.sh -read lee el <archivo>, si no existe o no se le indica, mostrará por pantalla «El archivo no existe»

Sube al curso un script llamado dados.sh que obtenga dos números aleatorios entre el 1 y el 6, obtén la suma de los dos dados, Haz que salga por pantalla el numero de tiradas y el porcentaje de veces que sale cada una.

Haz que el número de tiradas lo reciba como un argumento, el caso de que no reciba ningún argumento haz que haga 1000 tiradas

$ ./dados.sh
De 1000 tiradas : 2(1%) 3(7%) 4(10%) 5(12%) 6(14%) 7(17%) 8(14%) 9(12%) 10(10%) 11(7%) 12(1%)

Crea un script en Bash llamado adivina_cpu.sh que simule un juego automático de adivinanza en el que la CPU intenta adivinar un número secreto aleatorio, generado al inicio del programa. El número estará comprendido entre 1 y un valor máximo definido por la variable n_max_adivinar. En cada intento, la CPU elige otro número al azar dentro del rango posible, ajustando los límites mínimo y máximo según si el número es menor o mayor al número secreto.

El script debe cumplir con los siguientes requisitos:

  • No se deben repetir los números ya probados.

  • Tras cada intento, si el número elegido es menor que el número secreto, se actualiza el mínimo.

  • Si el número elegido es mayor, se actualiza el máximo.

  • El proceso se repite hasta que se adivine el número secreto.

  • Al final, se muestra el número total de intentos que necesitó la CPU para adivinar el número.

Cuando el usuario acierte haz que muestre el número de intentos.

Crea un script llamado tragaperras.sh que simule una máquina tragaperras con tres rodillos. Cada rodillo muestra un número aleatorio del 0 al 9. Las reglas del juego son las siguientes:

Cada partida cuesta 1 moneda.

  • Si aparecen dos números iguales, el jugador gana 2 monedas.

  • Si aparecen tres números iguales, el jugador gana 3 monedas.

  • Si los tres números son 7, el jugador gana 10 monedas.

El programa debe simular una cantidad significativa de partidas y calcular:

  • El número total de monedas ganadas.

  • El número total de monedas gastadas.

  • El balance final.

Y, finalmente, responder a la pregunta: ¿Es rentable esta tragaperras para el jugador?

Haz que el número de tiradas lo reciba como un argumento, el caso de que no reciba ningún argumento haz que haga 1000 tiradas

Gestión de usuarios locales#

Crea un script llamado usuarios_WSL.sh, que cumpla las siguientes condiciones:

./usuarios_WSL.sh -help
  -help               Mostrar esta ayuda.
  -crear <N>          Crear N usuarios de forma aleatoria dentro de los grupos X, Y o Z.
  -borrar             Borrar todos los usuarios creados por este script.
  -listar             Mostrar los usuarios por grupo creados por este script.

Opción -crear <N>: Creará N usuarios con nombres generados automáticamente con el siguiente formato: uX01, uY23, uZ15, etc.,

  • La letra (X, Y o Z) corresponde a un grupo al que se asignará el usuario.

  • El número es un sufijo aleatorio de dos cifras (01 a 99).

  • Si no tenemos <N> creará por defecto 10 usuarios

Crea un script llamado usuarios.sh, utiliza para ello un clon enlazado de la «MV Ubuntu Server 24.04»

./usuarios.sh -help
  usuarios.sh -addgroup <grupo>         : Crea un grupo si no existe
  usuarios.sh -delgroup <grupo>         : Elimina un grupo si existe
  usuarios.sh -adduser <usuario> [grupo]: Crea un usuario en el grupo especificado
                                        : Si el grupo no existe lo crea primero
                                        : Si no damos grupo usa por defecto el grupo usuario1
  usuarios.sh -deluser <usuario>        : Elimina un usuario si existe
  usuarios.sh -lista                    : Lista todos los grupos y sus usuarios

En el caso de ejecutar ./usuarios.sh sin argumentos obtendremos el mensaje de ayuda.

Chequea tu script con las siguientes características:

cat usuarios.sh
for g in GA GB GC GD
do
  ./usuarios.sh -addgroup $g
  for u in 01 02 03 04
    do
    usuario=usuario_${g}_${u}
    ./usuarios.sh -adduser ${usuario} ${g}
  done
done
./usuarios.sh -lista

./usuarios.sh -help
El script muestra una ayuda con las opciones que puede tiene

Genera la siguiente lista de usuarios en el archivo lista.dat

for((i=0;i<40;i++))
do
  R=$RANDOM
  echo tunombre_$R G$(($R%4))
done > lista.dat
  1. Crea un script llamado crear_usuarios_lista.sh que genere por defecto los usuarios que encuentra en el archivo lista.dat, con la contraseña cambiame, haz que si recibe el nombre de otro archivo como lista lo utilice. En el caso de que el grupo no exista haz que lo cree en el sistema

  2. Crea otro script llamado borrar_usuarios_lista.sh que borre los usuarios que aparecen en el archivo lista.dat, haz que utilice este archivo por defecto en el caso de no recibir ningun archivo.

  3. Crea otro script llamdo crear_usuarios_grupo_lista.sh que lea solo la primera columna de un archivo llamado nombre_grupo.dat, creará todos los usuarios dentro del grupo llamado nombre_grupo, en el caso de que no exista creara primero el grupo.

  4. Crea otro script llamdo borrar_usuarios_grupo_lista.sh que lea solo la primera columna de un archivo llamado nombre_grupo.dat, borrará todos los usuarios que encuentre en la lista, al final y sólo en el caso de que el grupo se haya quedado bacio se borrará tambien el grupo.

Gestión de usuarios LDAP#

Crea un script llamado usuarios_ldap.sh, utiliza para ello un clon enlazado de la “MV Ubuntu Server 24.04” con un ldap configurado aqui

Uso del script:
./usuarios_ldap.sh -addgroup <grupo>         : Crea un grupo si no existe
./usuarios_ldap.sh -delgroup <grupo>         : Elimina un grupo si existe
./usuarios_ldap.sh -lsgroup                  : Elimina un grupo si existe
./usuarios_ldap.sh -adduser <usuario> [grupo]: Crea un usuario en el grupo especificado
./usuarios_ldap.sh -deluser <usuario>        : Elimina un usuario si existe
./usuarios_ldap.sh -lista                    : Lista todos los grupos y sus usuarios
./usuarios_ldap.sh -lsuser                   : Elimina un grupo si existe

Crea un script llamado usuarios_lista_ldap.sh, haz que todos los usuarios se lean de un archivo llamado grupo.dat. Haz que todos los usuarios pertenezcan al grupo con el mismo nombre que el archivo sin la extensión .dat. En el caso de que no exista el grupo haz que se cree.

En el archivo grupo.dat, hay una lista de emails, haz que se creer el usuario correspondiente al email, es decir usuario1@gmail.com creara el usuario usuario1. En el caso de -borrar borrara todos los usuarios del archivo, finalmente si no quedan usuarios en el grupo borra el grupo

./usuarios_lista_ldap.sh -help
./usuarios_lista_ldap.sh -crear <archivo.dat>
./usuarios_lista_ldap.sh -borrar <archivo.dat>

#head -2 grupo.dat
usuario1@gmail.com
usuario2@gmail.com

#listar y borrar los usuarios de un grupo entero