martes, 6 de mayo de 2014

Bloque III - Configuración do sistema, kernel e dispositivos hardware

Ejercicio 1

a) Hacer una libreria estatica con makefile.Debes escribir dos funciones simples
en C que formarán parte de la libreria.
b) Modificar el archivo Makefile para compilar un objeto compartido.

Ejercicio 2

En este ejercicio queremos investigar el árbol de código fuente de Linux. Descarga la última versión
del núcleo desde kernel.org. Descomprimir el archivo del kernel en /usr/src y siga los pasos
siguientes:
1. Usar el codigo que bajaste para identificar los estructuras grandes. Confirmar el esquema de
Lec1B, pagina 8
2. Escribe un script utilizando find para encontrar el número total de archivos de tipo “.c”, “.h”
y “.S”. ¿Cuál fracción de archivos son de tipo “.S” ?
3. Escribe un script utilizando find y xargs que se imprimirá el número total de líneas de
código para toda la distribución (incluyendo o no incluyendo comentarios) utilizando
solamente. c,. h, y los archivos. S.


Otros Ejercicios

1. Comandos para encontrar hardware y drivers.
a) Para encontrar el hardware de tu sistema, investiga com funciona las siguientes
comandos: “dmesg” y “lshw”.
b) Como puedes encontrar información sobre el chipset de tu tarjeta de ethernet?
c) Puedes encontrar el modulo del kernel que controla este tarjeta?
d) El comando “lsmod” nos dar información sobre modulos instaldas. Puedes
encontrar el modulo del kernel para este tarjeta de ethernet? Donde es el modulo
del kernel?

SOLUCION


a) dmesg | grep eth0
b) find / -name ‘*.ko’    
      cd /lib/modules/
      ls
     uname -a   ||||  uname -r
     L=$(uname -r)
     cd /lib/modules/$(uname -r)
c)  dmesg | grep eth0
          lsmod  ///Encontramos r8169
          lsmod | grep 8169
          apropos hardware ///Parecido a lshw
          lshw  //Muestra todas las caracteristicas
          find ./ -name ‘*r8169*’
          lsmod
          lsmod | sed -e ‘1d’ | awk ‘{print $1}’  ///Eliminamos a primeira linea
          lsmod | awk '!/^MODULE/{print $1}'
          L=$( lsmod | awk '!/^MODULE/{print $1}')
          for i in $L; do find /lib/modules/$(uname -r) -name $i; done



2. Determinación de Devices
Cual es fichero /dev para el raton? Como puedes saber?
Intenta ver la salida del raton con el comando “cat”. Que pasa? Porque?

SOLUCION

a) psaux
b) find ./ -name '*mouse.ko' ---- ./3.8.0-29-generic/kernel/drivers/input/mouse/psmouse.ko
        find /lib/modules/$(uname -r) -name '*mouse.ko'    

 c) cat /dev/psaux
3. Crear un device (major/minor numbers)
Como en el ejemplo de clase (1B. P98), utiliza el comando “mknod” para crear tu
propio “null device”, /dev/null (pero en tu directorio home). Utiliza el fichero
“devices.txt” en la documentación del kernel (buscandolo en Internet), para saber la
correspondencia de major/minor numeros con un dispositivo de hardware particular.
4. [Using the Loopback Filesystem] En problema 2, hemos montado un sistema de
ficheros utilizando un dispositivo "loopback". Ahora vamos a crear ficheros y directorios
dentro de este dispositivo como si fuera un disco "normal".
• Primero, cambia los permisos en el dispositivo para que podemos hacer
read/write sin permisos especiales. Por ello, puedes utilizar este comando:
chown ­R administrador.administrador /media/fs
• Ahora "cd" a este punto de montaje y crear directorios y ficheros.
cd /media/fs mkdir one two three
ls ­l
• Explica que pasa.
• Ahora puedes "umount" como se fuera un partición cualquiera del sistema. La
manera de hacerlo es como siempre:
umount /media/fs • Puedes "mount" otra vez utilizando los comandos del problema anterior.
Comprueba que puedes montar el fichero otra vez y que se puede ver los
ficheros y directorios que has creado.
• Para dishabilitar completamente el dispositivo "loopback" puedes utilizar el
comando "losetup" utilizando la opción "-d", como siguiente:
losetup ­d /dev/loop0
• El sistema de ficheros de linux es completamente flexible y la abstracción de la
capa de VFS es completo. En este apartado, comprueba que puedes crear aun
otra loopback dentro del loopback de la sección anterior:
dd if=/dev/zero of=/media/fs/file2.img bs=1k count=1000
losetup /dev/loop1 /media/fs/file2.img
mke2fs ­c /dev/loop1 1000
mkdir /media/fs/media/fs2
mount ­t ext2 /dev/loop1 /media/fs/media/fs2
ls /media/fs/media/fs2
ls /media/fs
• Este demuestra un aspecto impresionante del sistema de ficheros de
Unix/Linux.
• ¿Como puedes utilizar este tecnica de loopback para crear sistemas de
ficheros completamente encriptada?
5. Comparar sistemas de ficheros: Utilice la técnica de loopback para montar un
disco como en problema 2. Seguir las siguientes pasos:
• Después de montar un dispositivo loopback como fichero, formatear el fichero
con un sistema de ficheros diferente: por ejemplo reiser, xfs y ext3
• Queremos comparar el tiempo que tarda en escribir ficheros y borrar ficheros
de cada uno de los sistemas de ficheros. Escribe un script de bash que
escribe/borra ficheros a cada sistema de fichero. Medir el tiempo utilizando la
función “time”. ¿Cual sistema de ficheros es mejor para esta operación?

6. Creando usuarios
a) Utiliza “adduser” para crear un usuario, “tux” con ID 600 y ID de grupo 550
b) Utiliza “usermod” para cambiar el directorio home de este usuario.
c) Tienes que crear este directorio primero? (Pista: leer sobre opción “-m” )
d) Que pasa con el contenido de “/etc/skel” ?
e) Utiliza “usermod” para añadir “tux” al grupo “wheel”. Que es el grupo “wheel”?
7. Modificando una cuenta
a) Cambiar la fecha de caducidad para la cuenta de “tux” usando “usermod”.
b) Bloquear la cuenta de “tux” usando herramientas o editando “/etc/shadow”
c) Evitar que el usuario puede ejecutar login, cambiando el shell por defecto a
“/bin/false”
d) Cambiar el parametro PASS_MAX_DAYS del usuario “tux” a 1 en /etc/shadow
8. Ficheros de configuración
a) Añadir un usuario al sistema manualmente modificando los ficheros “/etc/passwd”
y “/etc/group”
b) Crear un grupo denominado “share” y añadir un usuario “tux” a este grupo
modificando manualmente “/etc/group”



Otros ejercicios

1. [ Intro a IP y ifconfig ] En este ejercicio, vas a configurar una red utlizando el comando
/sbin/ifconfig  y los comandos para configurar un “default gateway”   Un ejemplo de dos
redes con tres equipos (pc0, pc1, pc2)  esta dado en el ejemplo abajo  (debes crear
redes privadas en los dos casos utilizanod redes como 10.0.0.1 y 11.0.0.1 por
ejempo).
1. Establecer los IPs para cada equipo en este red.
2. Habilitar el equipo pc1 como el “default gateway”.    Tambien configurar “ip
forwarding” en este equipo para que paquetes puede pasar entre los dos redes.
3. Hacer pruebas con un programa de monitorizacón de red explicado en clase.
Dishabilitar ping a uno de los equipos y demostrar que bloquea los paquetes
icmp.

SOLUCION


Pc
1. ifconfig eth0 10.10.0.2 netmask 255.255.0.0
    route add default gw 10.10.0.1 eth0
    ifconfig eth0 up
 3.echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all


(Getaway)
2.ifconfig eth0 10.10.0.1 netmask 255.255.0.0
   ifconfig eth0:1 10.11.0.1 netmask 255.255.0.0
   ifconfig eth0 up
   ifconfig eth0:1 up
   echo "1" > /proc/sys/net/ipv4/ip_forward

Pc
1. ifconfig eth0 10.11.0.2 netmask 255.255.0.0
    route add default gw 10.11.0.1 eth0
    ifconfig eth0 up
2.ssh admistrador@10.10.0.2

3.
 
2 [ traceroute y tcpdump ]  En este ejercicio, vamos a estudiar dos comandos potentes
relacionado con interfaces de redes:   traceroute y tcpdump.  Seguir las siguientes
pasos:
• traceroute:  es un comando para ver el encaminamiento de paquetes de un red
a otra.   Si quieres saber los tramos de un paquete, de tu máquina hasta otra
puedes ejecutar   traceroute < nombre_de_host>.   Ejecutar las siguientes
traceroute www.cesga.es
• Utilizar traceroute para empezar construir una mapa de paquetes saliendo de
tu máquina al Internet.  Comparar este comando con los resultados en la web
de http://www.yougetsignal.com/tools/visual­tracert/
• tcpdump: que analiza todo el trafico que pasa por un interfaz.   Ejecutar la

siguiente comando y explica lo que hace:
Comprobar las siguientes comandos con tcpdump:
• Imprimir todos las paquetes lleganda o salidiendo de tu equipo pc0:
tcpdump host  pc0
• Imprimir trafico entre tu equipo (pc0) y  (pc1 o pc2 ):
tcpdump host pc0and \( pc1 or pc2 \)
• imprimir todos las paquetes IP entre pc1 y cualquier host excepto pc2:
tcpdump ip host ace and not helios
• Imprimir todo el trafico entre el host local y host remoto:
tcpdump net ucb­ether
• Imprimir todo el trafico de ftp que  pasa a traves de un gateway pcgw :
tcpdump 'gateway pcgw and (port ftp or ftp­data)'
• To print all ICMP packets that are not echo  requests/replies (i.e., not ping
packets):
tcpdump 'icmp[icmptype] != icmp­echo and icmp[icmptype] != icmp­echoreply'

SOLUCION


a) sudo tcpdump host 192.168.1.152
b) sudo tcpdump host 192.168.1.152 and 192.168.1.141
c) sudo tcpdump ip host 192.168.1.152 and not 192.168.1.141
d)
e)

f) sudo tcpdump 'icmp[icmptype]!=icmp-echo and icmp[icmptype]!=icmp-echoreply'

3. [ Redes, cron y scripts ] Imagina que eres administrador/a de un dominio de Internet y 
de repente se nota una notable lentitud con la respuesta de su servidor. Conociendo 
algo de seguridad, sabes que este puede ser por culpa de muchas paquetes mal 
intencionada bombardeando su servidor web (que se llama DoS o “denial of service”). 
Quieres analizar todos los paquetes que llega a tu servidor, y en particular el servidor 
web. Vas a escribir un script que se puede ejecutar con cron periódicamente. Sigue las 
siguientes instrucciones para construir el script y configurar cron:
• Utilizando el comando “tcpdump”, escribe un comando para determinar si 
existe un ataque de DoS (denial of Service).
• Utilizar “awk” para que se clasificar los paquetes que llega de cada sitio. Con 
este información utilizar una “heurística” para fijar un criterio particular que 
corresponde a un DoS. Si un DoS existe, se debe recoger información del 
origen de los paquetes, formar un comando de “iptables” que es capaz de 
bloquear cualquier paquete de este dirección, y enviar este comando al “root” 
por “mail”.
• Configurar “cron” para que se ejecuta su script cada domingo del mes a las 
23:30 por la noche.

4. Practica con IPtables
Comprobar las siguientes comandos para listar las reglas de Iptables: 
$ sudo iptables ­n ­L                              //Filter rules, IP numbers (no DNS lookup) 
$ sudo iptables ­v ­L                               //Verbose output (with packet/byte counts) 
$ sudo iptables ­L ­­line­numbers           //Show line number in chain for each rule 
$ sudo iptables ­nvL –line­numbers    
La manera para eliminar (flush) reglas de iptables:  
$ sudo iptables ­F Flush all iptables rules 
Comprobar los siguientes ejemplos utilizando iptables command para cambiar reglas 
en el firewal actual:  
• Este ejemplo va a crear una regla para permitir solicitudes hacia dentro en el 
puerto 25  (puede ser util para la configuración de un mail server con sendmail, 
postfix, o otro servicio  SMTP ).
$ sudo iptables ­A INPUT ­p TCP   \            // Add filter input rule for TCP packets 
                         ­i eth0 \                                // on the first Ethernet interface 
­­destination­port 25 \                                   //  destined for mail service port (25) 
­j ACCEPT                                                   // to accept those packets when encountered 
• Este ejemplo crea una tabla para permitir Source Network Address Translation 
(SNAT),   permitiendo una dirección IP privada detras de un cortafuego  que 
puede comunicar con el Internet.  
$ sudo iptables ­t nat \                                     //Add nat rule  
­A POSTROUTING   \                                     //POSTROUTING chain 
­o eth1    \                                                        // for packets received on eth1 interface 
­j SNAT \                                                         // jump to network address translation 
­­to­source 11.22.33.1                                    //using outgoing address 11.22.33.1 
• Este ejemplo utiliza “port forwarding”  para pasar los solicitudes a un servicio a 
un servidor detras y a traves de un firewall: 
$ iptables ­t nat ­A PREROUTING \             // Add nat PREROUTING rule 
­p tcp ­d 11.22.33.1 \                                    //accepts tcp requests on 11.22.33.1 
­­dport 80 \                                                    //for port 80 (Web service) 
­j DNAT \                                                      // jump to the DNAT target 
­­to­destination 10.0.0.2                               // forward those packets to 10.0.0.2 










































sábado, 29 de marzo de 2014

Bloque II - Programacion con sistemas

EXPRESIONES REGULARES


1- Escribe un script que reciba como argumentos los nombres de dos directorios y  que copie todos los ficheros con extensión .txt del primer directorio al segundo.  Se   debe   comprobar   que   se   le   pasan   dos   argumentos   al   script   y   que   son  directorios que existen, antes de hacer la copia.
#!/bin/bash


if [ $# -eq 2 -a -d $1 -a -d $2 ]
then
     cp $1/*.txt $2
else
    echo No pasas dos argumentos
fi


2- . Escribe un script que, empleando un bucle for, sume los número enteros hasta  un número dado como argumento.
#!/bin/bash


i=0
suma=0
for i in `seq 0 1 $1`
do
    ((suma=suma+$i))
done
echo La suma de los $1 numeros es $suma


3- Escribe un script que tome como argumentos el nombre de un directorio y una  cadena de texto (puede contener espacios) y muestre un listado indicando, para  cada archivo por separado, el número de lineas que contienen esa cadena.
!/bin/bash


if [ $# -ne 2 ]
then
echo nª de argumentos incorrectos
elif [ -d $1 -a -n $2 ]
then
    grep -c $2 $1/*
elif [ -d $2 -a -n $1 ]
then
    grep -c $1 $2/*
else
echo los argumentos no son correctos
fi


4- Resuelve el ejercicio anterior mediante una función que tome como argumentos  el  archivo   y  la  cadena  y muestre  el  número  de  líneas  que  contienen  dicha  cadena.
#!/bin/bash


funcion4 ( )
{
if [ $# -ne 2 ]


then


echo nª de argumentos incorrectos


elif [ -d $1 -a -n $2 ]


then


   grep -c $2 $1/*


elif [ -d $2 -a -n $1 ]


then


   grep -c $1 $2/*


else


echo los argumentos no son correctos
fi
}


echo Los argumentos recibidos son: $*


funcion4 $1 $2


5- . Localiza todas las líneas que contengan palabras que comienzan por la letra a  en varios ficheros de texto.
grep -w “a*” f1 f2 f3

6- ¿Qué información te proporciona la ejecución de la siguiente orden? ps aux | grep “apache”
La salida de "ps aux" es una tabla donde cada fila es un proceso y las columnas contienen la siguiente información:
  • USER: usuario con el que se ejecuta el proceso
  • PID: ID del proceso
  • %CPU: porcentaje de tiempo que el proceso estuvo en ejecución desde que se inició
  • %MEM: porcentaje de memoria física utilizada
  • VSZ: memoria virtual del proceso medida en KiB
  • RSS: "resident set size", es la cantidad de memoria física no swappeada que la tarea a utilizado (en KiB)
  • TT: terminal que controla el proceso (tty)
  • STAT: código de estado del proceso (información detallada más adelante)
  • STARTED: fecha de inicio del proceso
  • TIME: tiempo de CPU acumulado
  • COMMAND: comando con todos sus argumentos
Busca el comando apache


7- Modifica la salida del comando  ls  para obtener una  lista con un elemento por  línea
 ls -l


8- a) Convierte   todos   los   caracteres   del   fichero  alumnos.txt    a   minúscula,  almacenando el resultado en otro fichero
b) Borra todas las vocales del fichero alumnos.txt almacenando su  resultado  en otro fichero
c) Elimina todas las líneas en blanco del fichero alumnos.txt
d) Escribe   cada   palabra   del   fichero  alumnos.txt  en   un   solo   renglón.
a) more alumnos.txt |  tr [:upper:] [:lower:] > minus.txt
b) more alumnos.txt |  tr -d [AaEeIiOoUu] > vocales.txt
c) more alumnos.txt |  tr -s “/n/n” ”/n”
d) more alumnos.txt |  tr -s “ ” ”/n”


9-
Explica que hacen las siguientes ordenes: • find.  • find ­depth ­type d ­empty • find ­depth ­type f ­empty
A) Busca archivos en un directorio
B) Busca directorios recursivamente vacios
C)Busca archivos vacios

10- Obtén sólo los directorios cuyo nombre comienza por d (mayúscula o minúscula)  del directorio /etc redireccionando la salida estándar de error al fichero errores
find /etc -type d -iname ‘d*’ 2>~/errores

11- Localiza  todos  los  ficheros  del  directorio /etc  cuya  fecha  de modificación  sea  posterior al 1/01/2012 a las 00:00h. 
touch -t 201201010000 comoquerais
find /etc -newer comoquerais

12- Busca los directorios que estén vacíos en los directorios /etc y /home 
find /etc /home -empty -type d
13- Localiza todos los ficheros .avi desde el directorio raíz cuyo tamaño sea superior  a 700 Megabytes, redireccionado los posibles errores al periférico nulo  
find / -name ‘*.avi’ -size +716800k 2>/dev/null
14- Busca todos los ficheros que comienzan por f (mayúscula o minúscula) y posean  la extensión txt (en minúscula),  que exactamente tengan permiso de lectura y  escritura para el propietario y el grupo 
find / -name ‘[Ff]*.txt’ -perm 660
15- Localiza  todos  los  ficheros  que  cuelgan  de  tu  directorio  actual  a  los  que  se  accedió hace un año exactamente.  
find  -atime 365
16- Localiza todos  los directorios que cuelgan directamente del directorio /home  o  del directorio /etc, cuyos nombres contengan una n.
find /etc /home -maxdepth 1 -name ‘*n*’ -type d
17- Añade permiso de ejecución para el propietario de todos los ficheros que cuelgan  de tu directorio actual cuyo propietario no sea el root 
find -type f !-user root | xargs chmod u+x 2>/dev/null
18- Borra todos los ficheros con extensión jpg  que cuelgan de tu directorio actual,  pidiendo confirmación del borrado
find ~ -name ‘*.jpg’ -type f -exec rm -i {} /;
19- Escribe un script que presente al usuario un menú con las siguientes opciones:
Espacio ocupado por un directorio (incluyendo subdirectorios) • Número de archivos contenidos en un directorio (incluyendo subdirectorios) • Número   de   archivos   contenidos   en   un  directorio   con   un   tamaño   inferior   a   uno  introducido por el usuario • Comprimir los archivos contenidos en un directorio cuyo tamaño sea superior a uno  introducido por el usuario. • Salir
1) echo espacio ocupado por el directorio $1
du -h $1;;
2) find $1 -type f | wc;;
3) echo introduce tamaño en bloques de 512b
read tam
echo el numero de ficheros con un tamaño menor a $tam
find $1 -type f -size -$tam | wc -l;;
4) echo introduce tamaño en bloques de 512b
read tam2
echo el numero de ficheros con un tamaño menor a $tam2
find $1 -type f -size +$tam2 |  xargs  bzip2 -vk;;




20- Borra   los   ficheros   regulares   que   empiecen   por  A  en   el   directorio   actual   y  descendientes 
find  -name 'a*' -type f | xargs rm -r
21- Localiza todos los archivos que cuelgan del directorio de inicio cuya extensión  sea  sh,  y muestra  toda  la  información  de  cada  uno  de  ellos.  Esta  línea  de  ordenes debe funcionar para cualquiera de los usuarios conectados al sistema.
find ~ -type f -name '*.sh' | xargs ls -l


EDITOR DE FLUJO SED

1. Borra las líneas en blanco de varios ficheros.
2. Explica que haría el siguiente script: original="mejor"  nueva="optimo"  for f  in  $(find .  ­type   f` ) do     sed  s/$original/$nueva/g   $f   > $f.tr     mv   $f.tr   $f  done 
3. Haciendo uso del fichero alumnos.txt descrito a continuación: Apellidos y Nombre, Grupo reducido, Convocatorias consumidas
Garcia Garcia Jose 1 primera Lopez Lopez Alba 2 primera Gonzalez Gonzalez Maria 2 primera Sanchez Perez Ana 3 segunda Martinez Martinez Carmen 2 primera Morales Morales Pedro 1 segunda Gonzalez Lopez Luis 3 primera Alvarez Alvarez Manuel 1 primera Jimenez Jimenez Luisa 2 segunda # Alumno repetidor Gomez Gomez Antonio 1 primera Sanchez Sanchez Teresa 1 segunda Vazquez Vazquez Angel 2 primera Lorenzo Gomez Isabel 3 primera
• Elimina todas las líneas de comentario (empiezan por #) • Elimina las líneas impares • Elimina todas las líneas que no comiencen por G  • Obtén desde la línea 3 hasta la línea 7 • Visualiza  sólo   las  líneas  del  fichero   que   no   comienzan  por  una   vocal  en  mayúscula. • Visualiza el contenido del fichero alumnos.txt de forma que aparezca primero  el grupo reducido al que pertenece seguido de los apellidos y nombre, y por  último la convocatoria. • Sustituye   la   palabra   primera   por   primer   desde   la   cuarta   línea   hasta   la  primera línea que sea un comentario (empieza por #) • Sustituye desde  la  línea que comienza por Lopez hasta  la quinta  línea  la  palabra primera por primer • Explica la diferencia que existe entre los dos comandos siguientes: sed  ­n ‘s/primera/una/p’   alumnos.txt     sed  ‘s/primera/una/p’   alumnos.txt    • Visualiza  el  contenido   del  fichero  alumnos.txt  usando   como  separador  de  campos el tabulador y no el espacio en blanco.
4. Haciendo uso del fichero alumnos.txt detallado en el ejercicio anterior, explica las  diferencias existentes entre las siguientes ordenes: • sed ­n '3p' alumnos.txt • sed '3p' alumnos.txt • sed '3{p;q}' alumnos.txt • sed ­n '3{p;q}' alumnos.txt
5. Dado el siguiente fichero, denominado ajos.txt, escribe un script sed que cambie  todas las apariciones de la palabra ajo por frijol. El resultado de este cambio se  plasma en el fichero ajosDefinitvo.txt .
ajos.txt El trabajo dignifica al hombre Las semillas del ajo tienen un fuerte olor a ajo Ajolote es un animal extraño
Ajo para ahuyentar al vampiro!
Obrajosa, el pueblo de Doña Perfecta
Le rebajo el kilo de ajos

ajosDefinitivo.txt
El trabajo dignifica al hombre
Las semillas del frijol tienen un fuerte olor a frijol
Ajolote es un animal extraño
Frijol para ahuyentar al vampiro!
Obrajosa, el pueblo de Doña Perfecta
Le rebajo el kilo de frijoles

6. Elimina la cabecera (primera fila de títulos) que aparece al ejecutar el comando 
ps.

7. Explica en que se diferencian las siguientes sentencias:
sed    ­n     '/root/p'   /etc/passwd
sed      '/root/p'   /etc/passwd

8. Obtén un listado largo de sólo los directorios que cuelgan del directorio /home

9. Suponiendo  que  los  datos  del  fichero  alumnos.txt  están separados  por  varios 
espacios en blanco, reemplázalos por un sólo espacio en blanco.


1) Borra las líneas en blanco de varios ficheros
sed -e ‘/^$/d’ fichero

2) Busca ficheros regulares y reemplaza la palabra mejor por optimo todas las veces que aparece del fichero en cuestion y los mete en el archivo f.tr.
Despues cambia el nombre del fichero con todos los cambios por el nombre del fichero regular

3)
a) sed -e ‘/^#/d’ fichero

b) sed -e ‘1~2 d’ fichero
   sed -n -e ‘n;p’ fichero

c) sed -e ‘/^G/d’ fichero
   sed -e ‘/^G/!d’ fichero

d) sed -ne ‘3,7p’ fichero

e)sed -ne ‘/^[AEIOU]/!p’ fichero

f) sed -e 's/\([[:alpha:]]* [[:alpha:]]* [[:alpha:]]*\) \([[:digit:]]\) /  \2 \1 /' asd.sh

g)  sed -e '4,/^#/s/primera/primer/' asd

h)  sed -e '/^Lopez/,5s/primera/primer/' asd

i) Con -n te muestra las líneas modificadas, mientras que sin el -n te muestra 2 veces las líneas modificadas (una por defecto y una por la p) y las no modificadas (por defecto).

j)sed -ne ‘s/ /\t/pg’ fichero



4)
a) Muestra línea 3.

b) Muestra todas las lineas, la linea 3 la duplica.

c)  Se muestran todas las lineas hasta la 3, esta se duplica y abandona el proceso.

d)  Muestra la línea 3 y abandona el proceso.

5-
#!/bin/bash
sed -e ‘s/ ajo/ frijoles/g’ ajos>ajosDef
sed -e ‘s/Ajo /Frijol /g’ ajosDef>ajos2
sed -e ‘s/ ajo/ frijol/g’ ajos2>ajosDef


6- ps | sed -e '1d'

7-
a)imprime el contenido del espacio de patrón, inclusive cuando se utiliza la opción
–n (modo silencioso).

b) Esta orden no borra el espacio de patrón

8- ls -l /home | sed -n ‘/^d/p‘

9- sed -e ‘s/ \+/ /g’ alumnos
   sed -er ‘s/ +/ /g’ alumnos

Ejercicio opcional dejar espacio en blanco entre caracteres: sed -e ‘s/ */ /g’ alumnos

EDITOR DE FLUJO SED AVANZADO

1. Elimina las líneas en blanco de varios ficheros, mostrando el número de línea de  aquellas que no se eliminan.
2. Haciendo uso del fichero alumnos.txt descrito en la actividad 2:
• añade la línea “NOMBRE ALUMNO” delante de cada línea que contenga el  nombre de un alumno (es decir, que no sea un comentario); • almacena   en   el   fichero  GruposAlumnos.txt  el   contenido   del   fichero  alumnos.txt pero cambiando el nombre asignado a los grupos reducidos de la  siguiente forma:  los que pertenecen al grupo reducido 1, su nuevo nombre  será SOII_1,  los que pertenecen al grupo reducido 2, su nuevo nombre de  grupo será SOII_2, y así sucesivamente. (No se puede usar el operador de  redireccionamiento de la salida); • almacena   en   el   fichero  GrupoSOII_1.txt  las   líneas   del   fichero  GruposAlumnos.txt  que  correspondan sólo  al  grupo SOII_1.  (No se puede  usar el operador de redireccionamiento de la salida); • visualiza   el   contenido   del   fichero  GrupoSOII_1.txt    teniendo   como   título  “ALUMNOS DEL GRUPO 1”; • describe que realiza la siguiente orden: sed '/^[LM]/,/^[SV]/s/primera/una/w resultado.txt' alumnos.txt.
3. Escribe un script sed que realice las siguientes operaciones sobre un fichero que  contiene un programa escrito en C:
• elimine las líneas en blanco; • elimine los comentarios de bloque (bloques de líneas que empiezan por /*  y  terminan por */);
• ponga el comentario “Begin main function” antes de la función principal.
4. Suponiendo   que   el   fichero  firma.txt   contiene   una   firma   concreta.   Añade   el  contenido de este fichero al final de todos los ficheros cuya extensión sea txt.

5. Explica la diferencia que existe entre los dos comandos siguientes: sed    ­s    '$d'     t* sed    '$d'    t* 
6. Se dispone de un fichero fechas.txt donde cada línea contiene una fecha expresada  con el siguiente formato:  mes día año (separados por un espacio en blanco) Usando el editor sed, almacena en el  fichero  spain_fechas.txt  esas fechas pero  aplicando el siguiente formato: día mes año (separados por un espacio en blanco)
Entrada:  Marzo 4 2014 Salida: 4 Marzo 2014
7. Dado el fichero profesores.txt con el siguiente contenido:
Numero: 1 Nombre: Josito Telefono: 988-567841 Numero: 2 Nombre: Juancito Telefono: 988-326574 Numero: 3 Nombre: Miguelito Telefono: 988-459678

Escribe un script sed que presente ese contenido con el siguiente formato:
1;Josito;988-567841 2;Juancito;988-326574 3;Miguelito;988-459678
8. Usando el fichero  profesores.txt descrito anteriormente, escribe un script sed que  presente el contenido de dicho fichero con el siguiente formato: 988-567841, Josito 988-326574, Juancito 988-459678, Miguelito

9. El fichero de texto caracteristicas.txt (disponible en Faitic, semana 7) contiene 88  características de textura calculadas para 1023 células. Por lo tanto,  el   fichero  se compone de 1023 líneas y cada línea tiene 88 campos numéricos. Al final de  cada línea existen dos campos que identifican la clase (sn = sin núcleo y cn = con  núcleo) y el estado de maduración (vit = vitelino, atre = atrésico, hid = hidratado  y  ac = alveolo cortical)  de   cada   célula. Escribe un script sed que realice lo  siguiente: • reemplace   el   carácter  e  usado   en   la   notación   científica   por   el   mismo  carácter pero en mayúscula; • divida   el   fichero  caracteristicas.txt  en   dos   ficheros   de   forma   que   las  características de  las células sin núcleo  (sn) se almacenen en el  fichero  sinNucleo.txt  y   las   características   de   las   células   con   núcleo   (cn)   se  almacenen en el fichero conNucleo.txt; • para aquellas células que sean sin núcleo (sn) y también alveolo cortical  (ac), escriba dicha clase (sn) con los dos caracteres en mayúscula (SN); • elimine   del   fichero  conNucleo.txt  todas   las   caracterísiticas   de   aquellas  células que sean vitelinas (vit).




1- sed -e ‘/^$/d;=’ fich1 fich2
2- a) sed -e 's/\([[:alpha:]]* [[:alpha:]]* [[:alpha:]]*\) /NOMBRE ALUMNO \1 /' asd
        sed ‘/^#/!i\Nombre Alumno’ asd
   b) sed -e 's/\([[:alpha:]]* [[:alpha:]]* [[:alpha:]]*\) \([[:digit:]]\) /   \1 \SOII_\2 / w fich' asd
        sed ‘s/[0-9]/SOII_&/;w GrupoSOII’ asd
   c)sed -n '/SOII_1/w grupoSOII_1' fich
   d) sed -e '1i\\tAlumnos Grupo 1' grupoSOII_1
   e) Modifica todas lineas posteriores a una linea que empiece por L y para cuando encuentra una línea que empiece por V, pero antes deberá encontrar una linea que empiece por S y antes una que empiece por M.
3- #!/bin/bash
 sed -e ‘/^$/d’ asd > aux
 sed -e '/^\/\*/,/\*\/$/ d' aux > aux2
 sed -e ‘/main/i\/\/#Begin test’ aux2 > asd
4- sed -s '$ r firma.txt' fich1 fich2
5- a) Con -s tratas todos los archivos que empiezan t seran tratados de forma independiente, se eliminara la ultima linea de cada una.
    b) Cogemos todos los archivos y los tratamos como si fuese un unico archivo y eliminamos la ultima linea del conjunto(ultima linea del ultimo archivo)
6- sed -e 's/\([[:alpha:]]*\)\( [[:digit:]]*\) / \2 \1 /; w esp_fecha' fecha
7- /^$/d
N
N
s/\n/i/g
s/_//g
s/[[:alpha:]]*//g/ (FALTA UNA PARTE)
8- sed -e /^Nombre/ {
     s/^Nombre://
     h
     n
     s/’Telefono://
     G
     s/\n/,/
     p
}

LENGUAJE AWK BÁSICO

1.Escribe un script que lea el fichero /etc/passwd y presente el login de los usuarios definidos en el sistema. Además, debe informar del UID y de sudirectorio de recepción. awk -F":" '{print $1, $3, $6}' /etc/passwd awk -v FS=":" '{print $1,$3,$6}' /etc/passwd script1.awk BEGIN{ FS=":"} {print $1, $3, $6} awk -f script1.awk /etc/passwd 2.Escribe un script que lea el fichero /etc/passwd y presente el nombre de los usuarios “normales” definidos en el sistema. Además, debe informar del UID y de su directorio de recepción. awk -F=":" '{if ($3>999) print $1,$3,$6}' /etc/passwd script2.awk BEGIN { FS=":"} {if ($3>999) print $1,$3,$6}

3.Cuando un usuario realiza un intento de inicio de sesión y falla al teclear la password, este evento se registra en el fichero /var/log/auth.log. Analiza la información que proporciona este fichero y muestra, siguiendo este orden, el login de aquellos usuarios que han generado este evento junto con la fecha y hora. awk '/authentication failure/ {print $NF,$1,$2,$3}' /var/log/auth.log


4- Se dispone de un fichero fechas.txt donde cada línea contiene una fecha expresada  con el siguiente formato:  mes/día/año (separados por el carácter /) Usando  awk, almacena  en  el  fichero  rango_fechas.txt  las  fechas cuyo año sea  superior a 1999. Las fechas se almacenarán con el siguiente formato: día mes año  (separados por un espacio en blanco)
awk -F "/" '{if($3>1999) print $2,$1,$3}' ~/fechas.txt > rango.txt

5- Escribe un programa awk que presente ese contenido con el siguiente formato,  utilizando como separador de campo el tabulador:
awk -v FS="\n" -v RS="" 'BEGIN {print "Nº\tNombre\tTelefono\n"}{print $1"\t"$2"\t"$3"\n" }' prueba
   
   awk.awk
   BEGIN {FS="\n";RS="";OFS=”\t”;print "Nº\tNombre\tTelefono\n"}
   {print $1,$2,$3”\n" }


awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" -v OFS="\t" 'BEGIN {print"Nº\tNombre\tTelefono"} {print $1,$2,$3}' profe


6- Escribe un programa usando awk que muestre en pantalla el número total de  bytes de todos los ficheros del directorio actual que fueron modificados por última  vez en Enero (puedes elegir otro mes) de cualquier año.
awk6.awk


BEGIN{
TOTAL=0
} {
if($6=="feb"){
TOTAL=TOTAL+$5
}
}
END{
print"El total de bytes es " TOTAL
}


if($6 ~ /-03-/)
ls -l | awk -f awk6.awk



7- El fichero de texto statistics_color.txt  (disponible en Faitic, semana 8) contiene 
las 27 características de textura calculadas para 1023 células. Por lo tanto, el fichero se compone de 1023 líneas y cada línea tiene 27 campos numéricos. Al final de cada  línea existen dos campos que  identifican  la clase (sn y cn) y el estado  de maduración  (vit,  atre,  ac). Escribe un  programa  usando  awk,  que proporcione la media aritmética para las características 1, 5, 7 y 12 de aquellas células que coincidan con los siguientes criterios: sn vit, sn ac, sn atre, cn vit, cn ac y cn atre.


#!/usr/bin/awk -f
BEGIN{ print "Estadisticas";print "\tCarac1\tcarac2\tcarac5\tcarac7\tcarac12\n";}


{
/sn vit/ { sn_vit++; sn_vit_1+=$1; sn_vit_5+=$5;sn_vit_7+=$7;sn_vit_12+=$12;}
/sn ac/ { sn_ac++; sn_ac_1+=$1; sn_ac_5+=$5;sn_ac_7+=$7;sn_ac_12+=$12;}
/sn atre/ { sn_atre++; sn_atre_1+=$1; sn_atre_5+=$5;sn_atre_7+=$7;sn_atre_12+=$12;}
/cn vit/ { cn_vit++; cn_vit_1+=$1; cn_vit_5+=$5;cn_vit_7+=$7;cn_vit_12+=$12;}
/cn ac/ { cn_vit++; cn_ac_1+=$1; cn_ac_5+=$5;cn_ac_7+=$7;cn_ac_12+=$12;}
/cn atre/ { cn_atre++; cn_atre_1+=$1; cn_atre_5+=$5;cn_atre_7+=$7;cn_atre_12+=$12;}
}
END{


print "sn vit", sn_vit_1/sn_vit, sn_vit_5/sn_vit, sn_vit_7/sn_vit, sn_vit_12/sn_vit;
ETC ETC


}

AWK AVANZADO

1- Escribe un script awk que muestre las líneas de un  fichero ordenadas de  forma  creciente.   Suponer   que   el   fichero   de   entrada   contiene   como   primer   campo   un  número entero que se va a utilizar para ordenar las líneas del fichero. Hay que tener  en cuenta que los números de cada línea no están ordenados y no son consecutivos,  puede haber saltos de líneas 

 BEGIN { min=0; max=0; }
    {
if($1 < min)
min=$1;
else if($1 > max)
max=$1;

lineas[$1]=$0;
     }

     END
     {
for(i=min;i<=max;i++)
{
if( i in lineas)
print lineas[i];
}
     }

2- BEGIN{
       RS=" "
       FS="\n"
}
{
       print $0
}
3-
BEGIN{
       FS=":"
}
{
       if($4 != "")    grupo[$1] = $4
}
END{
       FS=","
       for(i in grupo){
               $0 = grupo[i]
               numeros[i] = NF
       }
       for(i in numeros) print "Nombre grupo:", i, "Nº usuarios:" ,numeros[i]
}
4-
BEGIN{
   getline
}
{
   procesos[$2]++;
}
END{
   for( i in procesos ) print "Usuario:", i, "Nº de procesos:",pr
ocesos[i]
}

5-
BEGIN{
   getline
}
{
   procesos[$2]++;
}
END{
   FS=":"
   while ((getline < "/etc/passwd") > 0) nombres[$1] = $6
   for( i in procesos ) {
       for ( j in nombres ){
           if(j == i) nombre = nombres[i]        
       }
       print "Usuario:", i, "Nº de procesos:",procesos[i], "N
ombre completo:",nombre
   }
}
 

6- El  servicio   informático  de   una   empresa  quiere   detectar   qué   máquinas   no  autorizadas están usando sus IP.  Para resolver este problema tienen  que  conocer  que  IP   corresponde   a  cada  computador  de  la   red   de  la   empresa  utilizando  la  dirección  MAC.  Por   lo   tanto,   habrá   que   comprobar   periodicamente   los   datos  correspondientes  a   las   direcciones   IP­MAC,   para   ver   si   hay   alguna   variación.  Escribe un script awk para detectar una posible máquina no autorizada.  Notas:  • utiliza el comando arp ­n que te devuelve información sobre direcciones IP y  MAC; • guarda en un  fichero la dirección IP y MAC de   los equipos de red  de la  empresa, para que después se pueda comparar. Por ejemplo se obtendría el  siguiente fichero lista_IP_MAC.txt: 193.143.43.1 00:0E:7D:10:A0:C0 193.143.43.2 00:02:55:4A:15:D8 193.143.43.3 00:03:34:50:A3:C3 • al   día   siguiente   hay   que   volver   a mostrar  las   IP   y   sus   correspondientes  direcciones MAC. Almacena esta información en otro fichero, por ejemplo en  el fichero arp_IP_MAC.txt: 193.143.43.1 00:0E:7D:10:A0:C0 193.143.43.2 00:02:55:4A:15:D8 193.143.43.3 00:02:15:20:C3:A5 donde   se   ha   resaltado   en   negrita   la   dirección   MAC   de   la   máquina   no  autorizada; • compara   los   ficheros   anteriores  para   detectar   si   alguna   IP   está   siendo  utilizada por un intruso. Utiliza arrays asociativos  y getline.



arp -n | sed -r '1d; s/ +/ /g' > intermedio
cut -f1,3 -d" " intermedio > lista_IP_MAC.txt
script7.awk
#!/usr/bin/awk -f
{ autorizados [ $1] = $2; }
END
{
for( i in autorizados)
{
while ( ( getline var <”lista_IP_MAC.txt”) > 0)
{
split(var,compara,” “);
if((compara[1] == i) && (compara[2]!=autorizados[i]))
{
print “cabron deixa de roubar”
break;
}
}
close(“lista_IP_MAC.txt”);
}
}