Centro de Informática
Sistemas Operativos II
Examen Diciembre 1999.
Solución de scripts.
1. El comando last muestra una línea
por cada login:
victor :0
console Fri Dec 17
15:57 still logged in
reboot system boot 2.0.36
Fri Dec 17 15:57
(00:51)
victor :0
console Sat Dec
4 19:53 - 20:21 (00:27)
victor :0
console Sat Dec
4 19:31 - 19:53 (00:22)
cristina :0
console Sat Dec
4 19:17 - 19:31 (00:13)
victor :0
console Sat Dec
4 15:08 - 15:10 (00:01)
En el primer campo (columnas 1 a 9, incluyendo espacios al final)
está el nombre del usuario; en el último campo, encerrado
entre paréntesis, está el tiempo de conexión de ese
usuario (columnas 67 a 71, formato hh:mm). Crear un archivo horas.tmp
con el siguiente formato:
reboot:8:51
cristina:04:07
victor:06:00
victor:10:19
cristina:00:13
reboot:18:01
# Examen Dic. 1999
# prob1: crea archivo horas.tmp con nombres y horas de conexión
last | grep "(.*)" | cut -c1-9,67-71 | \
tr -s " " | tr " " ":" > horas.tmp
2. El archivo horas.tmp contiene información
de tiempo de login de los usuarios. Sus campos son, en este orden: nombre
de login, horas de conexión, minutos de conexión. El separador
es :. El archivo contiene registros en desorden de muchos usuarios. Escribir
un script que acumule el tiempo de conexión por usuario, y presente
una salida de la forma
Nombre: cristina - horas: 0, minutos: 22
Nombre: reboot - horas: 76, minutos: 0
Nombre: root - horas: 3, minutos: 54
Nombre: victor - horas: 53, minutos: 21
Se deberá extraer de la suma de minutos, las horas enteras, sumándolas
al conteo de horas, mostrando el resto de minutos (operador % en expr).
# Examen Dic. 1999
# prob2: suma horas de conexión a partir de horas.tmp
# extrae lista de nombres
NOMBRES=`cat horas.tmp | cut -f1 -d: | sort | uniq`
for NOM in $NOMBRES
do
THORAS=0
TMINS=0
# extrae líneas correspondientes a nombre
HRSNOM=`grep $NOM horas.tmp`
for I in $HRSNOM
do
HORA=`echo $I | cut -d: -f2`
MIN=`echo $I | cut -d: -f3`
THORAS=`expr $THORAS + $HORA`
TMINS=`expr $TMINS + $MIN`
done
# suma las horas contenidas en TMINS
THORAS=`expr $THORAS + $TMINS / 60`
# obtiene el resto de minutos
TMINS=`expr $TMINS % 60`
# presenta horas y minutos de conexión
echo Nombre: $NOM - horas: $THORAS, minutos: $TMINS
done
3. Para establecer una conexión PPP vía
modem, se dispone del comando pon uruguaynet; luego de esperar
30 segundos, la conexión estará establecida. Para cortarla,
se usa el comando poff. Inmediatamente que se establece la conexión,
se activa el agente de transporte de correo exim, para enviar
los correos en cola, un proceso que puede demorar un tiempo indeterminado.
Escribir un script que inicie la conexión, esperre que se establezca,
emita el comando fetchmail para traer los correos en el servidor
remoto, y corte la conexión luego de asegurarse que el proceso exim
haya finalizado. Si el proceso exim aún está corriendo,
se debe esperar 10 segundos, tantas veces como sea necesario.
Sugerencia: el comando ps -ax muestra los procesos corriendo.
Notar que si se usa grep, este proceso también puede estar
en la salida de ps.
# Examen Dic. 1999
# prob3: establece y corta conexión PPP, duerme mientras ejecuta
exim
pon uruguaynet
sleep 30
fetchmail
while [ "`ps ax | grep -v grep | grep exim`" ]
do
sleep 10
done
poff
4. Una empresa usa el campo de comentario de /etc/passwd
(campo 5) para guardar información de sus usuarios: nombre en la
vida real, teléfono interno en la empresa, dirección particular,
teléfono particular. Estos campos están separados por ",".
Escribir un script que pregunte al usuario un nombre de login y muestre
los datos del usuario, o un mensaje indicando que el usuario no existe.
El formato será similar a éste:
Nombre: victor
Nombre real: Víctor González-Barbone
Interno: 114
Dirección: J.Suárez 3023 bis ap. 801
Teléfono: 2096368
# Examen Dic. 1999
# prob4: interroga campo de comentario en /etc/passwd
clear
echo
echo -n "Nombre: "
read NOMLOGIN
RENGLON=`grep $NOMLOGIN /etc/passwd`
if [ ! "$RENGLON" ]
then
echo "El nombre no existe"
else
DATOS=`echo $RENGLON | cut -d: -f5`
NOMBRE=`echo $DATOS | cut -d, -f1`
INTERNO=`echo $DATOS | cut -d, -f2`
DIRECCION=`echo $DATOS | cut -d, -f3`
TELEFONO=`echo $DATOS | cut -d, -f4`
echo "Nombre Real: " $NOMBRE
echo "Interno: " $INTERNO
echo "Dirección: " $DIRECCION
echo "Teléfono: " $TELEFONO
echo
fi