1. La lista de
correos electrónicos de interesados en recibir un boletín
mensual de novedades se encuentra en un archivo de este formato:
#
LISTA ENVIO BOLETIN ELECTRONICO
# nombre
alumno:dirección e-mail:situación
Julio
Pérez:jperez@adinet.com.uy:enlista
Mariela
Lombardo::notiene
Adán
Paz:apaz@netgate.com.uy:noenvio
Gabriel
Giménez:ggime@multi.com.uy:enlista
Las categorías
son: enlista (desea recibir el boletín), noenvio
(no desea recibir el boletín), notiene (no tiene
correo electrónico). Escribir un script que muestre cantidad y
porcentaje de cada categoría. ¿Qué modificación
habría que hacer al script si no se conocen a priori los
nombres de las categorías? (15 puntos).
#!/bin/bash
# prob1: calcula cantidad y porcentaje en lista de envío.
#
echo
echo LISTA DE
ENVIO: cantidad y porcentaje por categorías
echo
"Categoría Cantidad %"
# calcula el total por número
de líneas
TOTAL=`cat listaenvio | grep -v "#"
| wc -l`
# inicializa lista de categorías
CATEGORIAS="enlista noenvio notiene"
# calcula y presenta porcentajes
for CAT in $CATEGORIAS
do
echo -n "$CAT "
CANT=`cat
listaenvio | grep -v "#" | grep $CAT | wc -l`
echo -n "$CANT "
echo `expr $CANT \* 100 / $TOTAL`\%
done
###
# modificación: si no se conocen a priori los nombres
de las categorías:
# CATEGORIAS=`cat listaenvio |
grep -v "#" | cut -d ":" -f3 | sort | uniq`
###
2. Los intentos
fallidos de login se registran con líneas del tipo
Set
5 6:29:57 liebre login[486]: invalid password for `UNKNOWN' on
`ttyp2' from `tero'
Oct
11 16:33:48 liebre login[492]: invalid password for `victor' on
`ttyp2' from `liebre'
Dec
15 19:49:01 liebre login[492]: invalid password for `cristina' on
`ttyp2' from `nutria'
en el archivo auth.log en el
directorio /var/log. Cuando este archivo se hace muy grande, se
aplica una rotación de archivos que genera auth.log.0,
authlog.1.gz, auth.log.2.gz, ..., auth.log.9.gz. Los archivos
terminados en .gz están comprimidos, pero pueden visualizarse
con zcat, comando análogo a cat.
Construir un script que
examine todos los archivos auth.log* y emita un listado de nombres de
login fallidos (mensaje "invalid password") y su cantidad,
en un listado del tipo
9
UNKNOWN
3 cristina
6 root
3 victor
(15 puntos).
#!/bin/bash
# prob2:
cuenta intentos de login fallidos.
#
zcat
/var/log/auth.log.?.gz | \
cat
/var/log/auth.log /var/log/auth.log.0 - | \
grep
"invalid password" | tr -s " " | cut -d " "
-f9 | \
sort | uniq -c | tr -d \`\'
3. Escribir un
script de arranque tango para un sofware llamado tango que
funciona en base a un demonio tangod. El script deberá
aceptar los parámetros siguientes y realizar las acciones
indicadas:
start - arrancar el demonio tangod
stop - detener el demonio tangod, con
señal 15
restart - detener y volver a
arrancar tangod
reload - releer la
configuración enviando una señal 1 al proceso tangod.
Sugerencia. El comando ps ax muestra el PID de
los procesos en sus primeros 6 caracteres, con relleno de blancos
sobre la izquierda. (20 puntos).
Nota para prueba en máquina. El proceso tangod puede simularse con el siguiente script:
#!/bin/bash
# tangod:
emulación de demonio para tango
#
arrancarlo en background
echo tangod: corriendo...
trap "echo recibida señal 1" 1
trap
"echo recibida señal 15,terminando ; exit" 15
while true
do
sleep 6
done
###
#!/bin/bash
# tango:
script de arranque para tango.
#
# sleep 3
da tiempo a mensajes del script emulador.
PID=`ps ax | grep tangod | grep -v grep | cut -c1-6 | tr -d " "`
case "$1" in
start)
/tmp/tangod &
sleep 3
;;
stop)
kill -15 $PID
sleep 3
;;
restart)
./tango stop
sleep 3
./tango
start
sleep 3
;;
reload)
kill -1 $PID
sleep 3
;;
*)
echo "uso de tango: tango { start | stop | restart | reload }"
;;
esac