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