You are on page 1of 51

Operación del sistema operativo GNU/Linux – Guía de laboratorios

Índice de contenido
Introducción al sistema operativo LINUX...............................................................................3
Introducción al sistema operativo LINUX...............................................................................4
Conceptos básicos.................................................................................................................4
Organización del árbol de archivos........................................................................................5
Introducción a la línea de comandos......................................................................................5
Manipulación de archivos........................................................................................................7
Navegando el árbol de directorios..........................................................................................8
Listar el contenido de directorios............................................................................................9
Comodines de la línea de comandos.....................................................................................9
Comprobando espacio disponible........................................................................................11
Manipulación de archivos y directorios................................................................................12
Permisos de acceso a archivos y directorios.......................................................................15
El sistema de archivos...........................................................................................................18
Sistema de archivos.............................................................................................................19
Enlaces duros.......................................................................................................................19
Enlaces simbólicos...............................................................................................................20
Búsqueda de archivos..........................................................................................................22
Copias de seguridad.............................................................................................................23
Redirecciones y tuberías.......................................................................................................25
Redireccionando la entrada, salida y error estándar...........................................................26
Filtros y procesamiento de cadenas.....................................................................................27
Filtros y procesamiento de cadenas.....................................................................................28
El editor de flujo sed.............................................................................................................31
Procesando texto con awk...................................................................................................32
Scripts del shell.......................................................................................................................34
Scripts del shell.....................................................................................................................35
Impresión y comunicación.....................................................................................................44
Impresión..............................................................................................................................45
Comunicación.......................................................................................................................45
Control de procesos y herramientas del sistema...............................................................47
Control de procesos..............................................................................................................48
Herramientas del sistema.....................................................................................................50
1
Introducción al sistema operativo LINUX
Introducción al sistema operativo LINUX

Introducción al sistema operativo LINUX


Este laboratorio lo ayudará a afianzar sus conocimientos básicos sobre LINUX.

Conceptos básicos
1. ¿Qué se entiende por “free software”?.

El término en inglés “free software” o software libre se refiere a libertad, no precio.


Software libre se refiere a la libertad que tienen los usuarios de ejecutar, copiar,
distribuir, estudiar, cambiar y modificar el software. Por lo tanto, la posibilidad de
tener acceso al código fuente es una condición necesaria para el software libre.
Para que las libertades sean reales, deben ser irrevocables. “Software libre” no
significa “no comercial”.

2. ¿Cual sería la diferencia entre LINUX y el sistema operativo GNU/Linux?

Linux es el núcleo, el programa del sistema que asigna los recursos de la máquina
a los otros programas que se ejecuten. El núcleo es una parte esencial de todo
sistema operativo, pero inútil por sí sólo; sólo puede funcionar en el contexto de un
sistema operativo completo. La mayoría de las distribuciones de sistemas
operativos que utilizan Linux como núcleo son básicamente versiones modificadas
del sistema operativo GNU. GNU comenzó a desarrollar en 1984, años antes de
que Linus Torvalds escribiera su núcleo. Linux no es un paquete GNU; esto es, no
fue desarrollado bajo el auspicio del Proyecto, ni contribuido al Proyecto GNU de
forma específica. Por tanto, el sistema operativo debería ser conocido como
GNU/Linux.

3. ¿Qué es GNU? ¿Que es GPL?

El Proyecto GNU fue iniciado en 1984 con el propósito de desarrollar un sistema


operativo compatible con Unix que fuera software libre: el sistema GNU (GNU es
un acrónimo recursivo para “GNU No es Unix“). La GPL (General Public
License/Licencia Pública General) de GNU es un conjunto específico de términos
de distribución para proteger con copyleft a un programa. Copyleft es la regla que
implica que cuando se distribuya el programa, no se pueden agregar restricciones
para denegar a otras personas las libertades centrales. Esta regla no entra en
conflicto con las libertades centrales, sino que más bien las protege.

4. En LINUX cada usuario pertenece a un grupo. ¿Para que son utilizados los grupos
de usuarios? ¿Que es el UID y GID?

Cada usuario debe tener un nombre de inicio de sesión o “login” para ingresar al
sistema y pertenece a uno o más grupos. Los grupos permiten organizar usuarios
de funciones o características similares de tal modo que puedan definirse
permisos de acceso sobre los archivos y directorios en base a los grupos. Esto

Ing. Ivan Ferreira 4


Introducción al sistema operativo LINUX

permite que la administración de la seguridad y configuración restricciones del


sistema sea mas sencilla. Por ejemplo, si definimos que todos los miembros del
grupo “admin” tienen permiso de escritura sobre un archivo, en caso de que un
nuevo usuario sea dado de alta en el departamento de administración, para que
este pueda escribir en el archivo solamente debe pertenecer al grupo “admin”, y no
es necesario modificar los permisos sobre el archivo en sí.

Cada usuario y grupo tiene un identificador numérico que es utilizado por el


sistema para diferenciar a los usuarios, conocidos como UID y GID. El sistema no
reconoce diferencia entre los usuarios según el nombre del usuario, por lo tanto, si
dos usuarios con nombres distintos tienen el mismo ID, el sistema Linux no podrá
diferenciar quién es quién.

Organización del árbol de archivos


1. Explique la función de cada uno de los directorios que se encuentran en la raíz del
sistema operativo Linux. Cuál es la norma utilizada para definir la jerarquía del
árbol?

Refiérase a la sección “Organización del árbol de archivos” del manual “Operación


del sistema operativo Linux”

Introducción a la línea de comandos


1. Visualice la pagina del manual de cal, en base a la sintaxis indicada en la pagina
del manual, ¿cual seria la forma correcta de visualizar el calendario del mes de
diciembre del año actual?. ¿Es correcto el comando?:
$ cal 12

De no ser correcto, ¿por que no lo es?

De acuerdo con la página “man cal”, la sintaxis del comando es:

cal [[month] year]

Lo cual indica que si especificamos un número, este será considerado como el


año, especificando dos números, indicaríamos tanto el mes como el año. Por tanto
el comando cal 12 sería incorrecto para visualizar el calendario de diciembre del
año actual, debe especificarse también el año.

2. Utilice el comando date para mostrar la fecha en el siguiente formato:

● Día-Mes-Año

● Año-Mes-Día

5 Red Hat Certified Engineer


Introducción al sistema operativo LINUX

● "La fecha de hoy es: DD-MMM-AA"

● "Hoy es el DIA de NOMBRE_MES de AÑO_4_DIGITOS"


$ date +"%d-%m-%Y"
$ date +"%y-%m-%d"
$ date +"La fecha de hoy es %d-%m-%y"
$ date +"Hoy es el %d de %B de %Y"

3. Si usted ha dejado por descuido su sesión abierta, y otro usuario toma el control de
su terminal e intenta cambiar la contraseña, ¿podrá realizarlo?

Las probabilidades son bajas ya que para realizarlo debería conocer su contraseña
actual, puesto que al ejecutar el comando “passwd”, se solicitará la contraseña
actual para definir una nueva.

Ing. Ivan Ferreira 6


2
Manipulación de archivos
Manipulación de archivos

Navegando el árbol de directorios


1. Identifique en qué directorio se ubica por defecto al iniciar sesión. ¿Como es
llamado este directorio?

Al iniciar sesión por defecto se ubicará en un directorio por debajo del /home cuyo
nombre es igual al nombre de usuario utilizado. Es conocido como directorio
HOME.

2. Explique el concepto de rutas absolutas y rutas relativas

Una ruta absoluta indica el camino a seguir para ubicar un archivo a partir de la raiz
del sistema de archivos, ejemplo:
/boot/grub/grub.conf

La ruta relativa indica el camino que debe ser seguido para ubicar un archivo a
partir de la ubicación actual, utilizando “.” y “..” para indicar el directorio actual o
superior respectivamente, por ejemplo, suponiendo que se encuentra en su
directorio HOME, para localizar el mismo archivo anterior:
../../boot/grub/grub.conf

Para hacer referencia a un archivo en el directorio actual usando la ruta relativa:


./backup.sh

3. Considere la siguiente estructura de directorios:


/
|-- home
| |-- jose
| | `-- doc
| | |-- archivo1.txt
| | `-- archivo2.txt
| `-- luis
| `-- doc
| |-- archivo3.txt
| `-- archivo4.txt
|-- tmp
`-- usr
`-- share
`-- doc

Suponiendo que su directorio actual es jose, que comando debe utilizar para
cambiarse al directorio tmp usando la ruta absoluta?
$ cd /tmp

Ing. Ivan Ferreira 8


Manipulación de archivos

4. Que comando debería utilizar para retornar inmediatamente a su directorio HOME?


$ cd

5. Suponiendo que su directorio actual es /home/luis/doc, que comando debería


utilizar para acceder al archivo archivo1.txt usando la ruta relativa?
../../jose/doc/archivo1.txt

6. Suponiendo que su directorio actual es /tmp, que comando debería utilizar para
acceder al directorio /usr/share/doc utilizando la ruta relativa?
$ cd ../usr/share/doc

7. Que comando puede utilizar para retornar al directorio tmp?


$ cd -

Listar el contenido de directorios


1. Sin moverse de su directorio HOME, liste el contenido del directorio /boot en
formato largo.
$ ls -la /boot

2. Sin moverse de su directorio HOME, liste el contenido del directorio /etc/rc.d/init.d


ordenado por tamaño.
$ ls -laS /etc/rc.d/init.d

3. Sin moverse de su directorio HOME, liste el contenido del directorio /boot ordenado
por fecha de modificación del archivo.
$ ls -lat /boot

4. Sin moverse de su directorio HOME, liste el contenido del directorio /var/log


mostrando el tamaño de los archivos en formato humanamente leíble.
$ ls -lah /var/log

5. ¿Cuál es la diferencia entre el resultado de los comandos ls -la /boot y ls -lad


/boot?

La opción -d implica que se mostraran los atributos del directorio /boot y no de su


contenido.

Comodines de la línea de comandos


1. Sin moverse de su directorio personal, utilice el comando ls -lad para listar

9 Red Hat Certified Engineer


Manipulación de archivos

todos los archivos del directorio /etc cuyo nombre comienzan con “h” y terminan
con “s”.
$ ls -lad /etc/h*s

2. Sin moverse de su directorio personal, utilice el comando ls -lad para listar


todos los archivos del directorio /etc cuyo nombre comienzan con “h” y tienen
exactamente 5 caracteres.
$ ls -lad /etc/h????

3. Sin moverse de su directorio personal, utilice el comando ls -lad para listar


todos los archivos del directorio /etc cuyo nombre comienzan con “p” o con “s” y
tienen exactamente 6 caracteres.
$ ls -lad /etc/[ps]?????

4. Sin moverse de su directorio personal, utilice el comando ls -lad para listar


todos los archivos del directorio /etc cuyo nombre contiene “pp” en cualquier
parte del nombre.
$ ls -lad /etc/*pp*

5. Sin moverse de su directorio personal, utilice el comando ls -lad para listar


todos los archivos del directorio /etc cuyo nombre contiene un numero del 1 al 6
en cualquier parte del nombre.
$ ls -lad /etc/*[1-6]*

6. Sin moverse de su directorio personal, utilice el comando ls -lad para listar


todos los archivos del directorio /etc cuyos nombres no comiencen con una vocal.
$ ls -lad /etc/[!aeiouAEIOU]*

7. Sin moverse de su directorio personal, utilice el comando ls -lad para listar


todos los archivos del directorio /etc cuyos nombres no comiencen con una vocal
y terminen en vocal.
$ ls -lad /etc/[!aeiouAEIOU]*[aeiouAEIOU]

8. Explique cuál sería el resultado del siguiente comando:


$ ls -la /usr/{bin,sbin}/??

El comando listaría todos los archivos cuyo nombre tiene exactamente dos
caracteres y se encuentran en el directorio /usr/bin o /usr/sbin.

Ing. Ivan Ferreira 10


Manipulación de archivos

Comprobando espacio disponible


1. Verifique si /home es un sistema de archivos independiente de la raíz con el
comando df.

Si /home fuese un sistema de archivos independiente de la raíz, tendría su propio


punto de montaje en el resultado de la salida del comando df, por ejemplo:
$ df /home
S.ficheros Bloques de 1024 Usado Dispon Ocupado Montado en
/dev/mapper/homevg-homelv 15460896 11428648 4032248 74% /home

De lo contrario se vería de la siguiente forma:


$ df -P /
S.ficheros Bloques de 1024 Usado Dispon Ocupado Montado en
/dev/mapper/rootvg-rootlv 6063688 3912400 1843272 68% /

Indicando que /home es simplemente un directorio más en la raíz del sistema de


archivos.

2. Verifique cuanto espacio disponible existe en el sistema de archivos que contiene


el directorio /tmp
$ df /tmp
S.ficheros Bloques de 1024 Usado Dispon Ocupado Montado en
/dev/mapper/rootvg-rootlv 6063688 3912400 1843272 68% /

Existen 1843272 KB disponibles, lo que seria equivalente a 1.8 GB.

3. Compruebe cuanto espacio utiliza en disco el directorio /usr/bin con el comando


du, utilice el comando bc para calcular el porcentaje de espacio utilizado por ese
directorio con respecto al total de espacio del sistema de archivos que lo contiene.

Obtenemos la cantidad de espacio utilizado por el directorio /usr/bin


$ du -sk /usr/bin
139660 /usr/bin

Obtenemos el espacio total del sistema de archivos que contiene a /usr/bin


$ df -k /usr/bin
S.ficheros Bloques de 1024 Usado Dispon Ocupado Montado en
/dev/mapper/rootvg-rootlv 6063688 3912400 1843272 68% /

Calculamos el porcentaje de uso:


$ bc -ql
139660/6063688*100

11 Red Hat Certified Engineer


Manipulación de archivos

2.30321876719250726600

El porcentaje que ocupa el directorio /usr/bin con respecto al espacio total del
sistema de archivos que lo contiene, es 2.3%.

4. Compruebe cuanto espacio utiliza en disco su directorio HOME con el comando


du, utilice el comando bc para calcular el porcentaje de espacio utilizado por ese
directorio con respecto al total de espacio del sistema de archivos que lo contiene.

Primero, nos ubicamos en el directorio HOME con el comando “cd” y obtenemos el


espacio utilizado por el mismo utilizando el “.” para indicar el directorio actual.
$ cd
$ du -sk .
30740 .

Luego determinamos el espacio de total del sistema de archivos que contiene


nuestro directorio HOME.
$ df -k .
S.ficheros Bloques de 1024 Usado Dispon Ocupado Montado en
/dev/mapper/homevg-homelv 15460896 11428648 4032248 74% /home

Calculamos el porcentaje de uso.


$ bc -ql
30740/15460896*100
.19882418198790031300

Para este caso, este directorio HOME ocupa apenas 0.19 % del total del sistema
de archivos.

5. Identifique con du el directorio que ocupa mas espacio en /usr/share/doc.


$ du -sk /usr/share/doc/*

Manipulación de archivos y directorios


1. Sin moverse de su directorio personal, cree la siguiente estructura de directorios en
el

Ing. Ivan Ferreira 12


Manipulación de archivos

.
|-- docs
| |-- informes
| `-- planillas
| |-- enero
| |-- febrero
| `-- marzo
`-- reportes
|-- culminados
`-- en_proceso

Opción 1, paso a paso:


$ mkdir docs
$ mkdir docs/informes
$ mkdir docs/planillas
$ mkdir docs/planillas/enero
$ mkdir docs/planillas/febrero
$ mkdir docs/planillas/marzo
$ mkdir reportes
$ mkdir reportes/culminados
$ mkdir reportes/en_proceso

Opción 2, usando la opción -p para minimizar la cantidad de comandos


$ mkdir -p docs/informes
$ mkdir -p docs/planillas/enero
$ mkdir -p docs/planillas/febrero
$ mkdir -p docs/planillas/marzo
$ mkdir -p reportes/culminados
$ mkdir -p reportes/en_proceso

2. Sin moverse de su directorio personal, cree el archivo ene01.txt dentro del


directorio enero con el comando touch
$ touch docs/planillas/enero/ene01.txt

3. Sin moverse de su directorio personal, cree el archivo feb01.txt dentro del


directorio febrero con el comando touch
$ touch docs/planillas/febrero/feb01.txt

4. Sin moverse de su directorio personal, elimine el directorio en_proceso con el


comando rmdir
$ rmdir reportes/en_proceso

5. Sin moverse de su directorio personal, elimine el directorio reportes con el

13 Red Hat Certified Engineer


Manipulación de archivos

comando rmdir. ¿Se ejecuto correctamente el comando? ¿Cual fue el error


reportado? A que se debe esto?
$ rmdir reportes/
rmdir: reportes: El directorio no esta vacio

Con el comando rmdir, no es posible borrar directorios que no se encuentran


vacíos.

6. Sin moverse de su directorio personal, elimine el directorio reportes usando el


comando rm
$ rm -fr reportes

7. Sin moverse de su directorio personal, cree en el directorio /tmp el directorio


llamado abso, utilizando la ruta absoluta
$ mkdir /tmp/abso

8. Sin moverse de su directorio personal, cree en el directorio /tmp el directorio


llamado rela, utilizando la ruta relativa
$ mkdir ../../tmp/rela

9. Cree un directorio llamado temporal en su directorio home


$ mkdir temporal

10. Copie todos los archivos del directorio /etc que comienzan con p al directorio
temporal
$ cp /etc/p* temporal

11. Cambie el nombre del directorio temporal a temp


$ mv temporal temp

12. Elimine el directorio temp


$ rm -fr temp

13. Cual es la diferencia entre los comandos cat, more y less?

El comando cat no permite visualizar el archivo pagina por pagina o linea por
linea, more y less si lo permiten, less ademas permite utilizar las flechas de
dirección para visualizar el documento y resalta las coincidencias de una
búsqueda, sin embargo, se debe tener en cuenta que el comando less no existe
en todos los sistemas operativos Unix.

14. Como puede hacer para buscar una cadena de texto dentro al visualizar un archivo

Ing. Ivan Ferreira 14


Manipulación de archivos

con more y less?

Presionando la tecla “/” (barra) e ingresando el texto a buscar.

Permisos de acceso a archivos y directorios


1. Cree la siguiente estructura de directorios con los permisos indicados:
.
|-- [drwxrwxr-x] docs
| `-- [drwxr-x---] planillas
| |-- [drwxrwxr-x] enero
| |-- [drwxrwxr-x] febrero
| `-- [drwxrwxr-x] marzo
`-- [drwx------] reportes
|-- [drwx------] culminados
`-- [drwx------] en_proceso

$ mkdir docs
$ chmod 775 docs
$ mkdir docs/planillas
$ chmod 755 docs/planillas
$ mkdir docs/planillas/enero
$ mkdir docs/planillas/febrero
$ mkdir docs/planillas/marzo
$ chmod 775 docs/planillas/*
$ mkdir reportes
$ chmod 700 reportes
$ mkdir reportes/culminados
$ mkdir reportes/en_proceso
$ chmod 700 reportes/*

2. ¿Que permisos debería tener un archivo para permitir que el propietario pueda leer
y escribir en el, el grupo leer y los otros ningún permiso? ¿Con qué comando
puede establecer esos permisos?

Los permisos deberían ser 640. Ejecute chmod 640 <archivo>

3. Que permisos debería tener un archivo para permitir al propietario leer, escribir y
ejecutar un archivo, al grupo y los otros solamente ejecutar? ¿Con qué comando
puede establecer esos permisos?

Los permisos deberían ser 711. Ejecute chmod 711 <archivo>

4. Cual debería ser el valor del umask para que los directorios se creen con los
siguientes permisos rwxrwxr-x?

15 Red Hat Certified Engineer


Manipulación de archivos

El umask debería ser 002

5. Cual debería ser el valor del umask para que los directorios se creen con los
siguientes permisos rwxr-xr-x?

El umask debería ser 022

6. Cual debería ser el valor del umask para que los directorios se creen con los
siguientes permisos rwxr-x---?

El umask debería ser 027

7. Cual debería ser el valor del umask para que los directorios se creen con los
siguientes permisos rwx------?

El umask debería ser 077

8. Cual deberia ser el valor del umask para que los archivos se creen con los
siguientes permisos rw-rw-r--?

El umask debería ser 002

9. Cual debería ser el valor del umask para que los archivos se creen con los
siguientes permisos rw-r--r--?

El umask deberia ser 022

10. Cual debería ser el valor del umask para que los archivos se creen con los
siguientes permisos rw-------?

El umask debería ser 077

11. Describa la función de los permisos SUID, SGID y Sticky con un ejemplo de cada
uno.

SUID sobre un archivo ejecutable permite que el programa se ejecute bajo los
privilegios del usuario propietario. Por ejemplo, es posible crear un programa
llamado startdb cuyo propietario sea el usuario oracle y el bit SUID activo, es
decir, permisos 4755, cualquier usuario que ejecute el programa, lo ejecutara como
si fuese el usuario oracle.

El permiso SGID sobre un directorio permite que los archivos que se crean dentro,
hereden el grupo propietario del directorio, en lugar de ser creados bajo el grupo
primario del usuario creador. Esto permite a miembros del mismo grupo modificar
archivos creados por otros usuarios del mismo grupo.

Ejemplo, si el directorio /contab pertenece a root del grupo contab, y los permisos
son 775:

Ing. Ivan Ferreira 16


Manipulación de archivos

● Si juan del grupo juan, crea un archivo llamado con1.txt, el archivo se


creara con propietario juan, grupo propietario juan y permisos 664. Esto no
permitiría a otros miembros del grupo editar el archivo.

Sin embargo, si el directorio /contab pertenece a root del grupo contab, y los
permisos son 2775, es decir SGID activo:

● Si juan del grupo juan, crea un archivo llamado con1.txt, el archivo se


creara con propietario juan, grupo propietario contab y permisos 664. Esto si
permitiría a otros miembros del grupo editar el archivo.

El permiso Sticky debe ser activado en directorios que permiten la escritura a


todos. Este permiso indica que un archivo puede ser borrado únicamente por el
usuario root o el propietario del archivo. Ejemplo, el directorio /tmp tiene el
permiso sticky activo, de lo contrario, cualquier usuario podría borrar archivos que
no le pertenecen, ya que el permiso de escritura sobre el directorio para todos lo
permite.

12. Que permisos deben ser establecidos a directorios que permiten la escritura a
todos?

Principalmente debería establecerse el permiso Sticky con el comando chmod


1777 <directorio>.

17 Red Hat Certified Engineer


3
El sistema de archivos
El sistema de archivos

Sistema de archivos
1. Explique con sus propias palabras el concepto de sistema de archivos.

Refiérase a http://es.wikipedia.org/wiki/Sistema_de_archivos

Enlaces duros
1. Ejecute las siguientes acciones y evalúe el resultado. Anote sus observaciones.

Copie el archivo /etc/hosts a su directorio HOME.


$ cd
$ cp /etc/hosts .

2. Utilice el comando ls -lai para examinar el numero de inodo del archivo y el


contador de enlaces. Anótelos.
$ ls -lai hosts
14643 -rw-r--r-- 1 iferreira iferreira 1730 jun 12 15:48 hosts

Inodo 14643, contador de enlaces igual a 1.

3. Cree un enlace duro al archivo hosts de su home con el nombre hosts2.


$ ln hosts hosts2

4. Utilice el comando ls -lai para examinar el numero de inodo de los archivos y el


contador de enlaces. Anótelos y compárelos con la salida anterior.
$ ls -lai hosts hosts2
14643 -rw-r--r-- 2 iferreira iferreira 1730 jun 12 15:48 hosts
14643 -rw-r--r-- 2 iferreira iferreira 1730 jun 12 15:48 hosts2

El número de inodo es el mismo, indicando que ambos nombres permiten el


acceso al mismo conjunto de datos en disco. El contador de enlaces se ha
incrementado en uno.

5. Verifique el propietario, permisos y tamaños de los archivos hosts y hosts2.


Anótelos.
$ ls -lai hosts hosts2
14643 -rw-r--r-- 2 iferreira iferreira 1730 jun 12 15:48 hosts
14643 -rw-r--r-- 2 iferreira iferreira 1730 jun 12 15:48 hosts2

Son exactamente iguales los atributos ya que apuntan al mismo inodo. El contador
de enlaces se incremento en 1.

19 Red Hat Certified Engineer


El sistema de archivos

6. Cambie los permisos del archivo host2 a rw-r-----.


$ chmod 640 hosts2

7. Verifique el propietario, permisos y tamaños de los archivos de hosts y hosts2.


Anótelos y compárelos con la salida anterior.
$ ls -lai hosts hosts2
14643 -rw-r----- 2 iferreira iferreira 1730 jun 12 15:48 hosts
14643 -rw-r----- 2 iferreira iferreira 1730 jun 12 15:48 hosts2

Los permisos fueron modificados y el cambio se refleja en ambos archivos.

8. Visualice el contenido de los archivos hosts y hosts2.


$ cat hosts
$ cat hosts2

9. Elimine el archivo hosts.


$ rm hosts

10. Visualice el contenido del archivo hosts2. ¿El contenido puede ser visualizado?
¿Por que?
$ cat hosts2

Si, el contenido puede ser visualizado, ya que al eliminar el archivo hosts, solo se
ha eliminado un enlace, no el archivo en si. Es posible notar que el contador de
enlaces esta nuevamente en 1.

Enlaces simbólicos
1. Ejecute las siguientes acciones y evalúe el resultado. Anote sus observaciones.

Utilice el comando ls -lai para examinar el numero de inodo y el contador de


enlaces del archivo hosts2. Anótelos.
$ ls -lai hosts2
14643 -rw-r----- 1 iferreira iferreira 1730 jun 12 15:48 hosts2

Inodo 14643, contador de enlaces igual 1

2. Cree un enlace simbólico al archivo hosts2 con el nombre hosts.


$ ln -s hosts2 hosts

3. Utilice el comando ls -lai para examinar el numero de inodo de los archivos y el


contador de enlaces. Anótelos y compárelos con la salida anterior.

Ing. Ivan Ferreira 20


El sistema de archivos

$ ls -lai hosts hosts2


14815 lrwxrwxrwx 1 iferreira iferreira 6 jun 12 15:58 hosts -> hosts2
14643 -rw-r----- 1 iferreira iferreira 1730 jun 12 15:48 hosts2

El enlace simbólico hosts apunta al archivo hosts2, sin embargo, es un archivo


totalmente diferente como lo indica el numero de inodo.

4. Verifique el propietario, permisos y tamaños de los archivos hosts y hosts2.


Anótelos.
$ ls -lai hosts hosts2
14815 lrwxrwxrwx 1 iferreira iferreira 6 jun 12 15:58 hosts -> hosts2
14643 -rw-r----- 1 iferreira iferreira 1730 jun 12 15:48 hosts2

Los permisos y el tamaño de los archivos son diferentes.

5. Cambie los permisos del archivo host2 a rw-rw-r--.


$ chmod 664 hosts2

6. Verifique el propietario, permisos y tamaños de los archivos hosts y hosts2.


Anótelos.
$ ls -lai hosts hosts2
14815 lrwxrwxrwx 1 iferreira iferreira 6 jun 12 15:58 hosts -> hosts2
14643 -rw-rw-r-- 1 iferreira iferreira 1730 jun 12 15:48 hosts2

7. Cambie los permisos del archivo host a rw-------.


$ chmod 664 hosts2

8. Verifique el propietario, permisos y tamaños de los archivos hosts y hosts2.


Anótelos y compárelo con la salida anterior.
$ ls -lai hosts hosts2
14815 lrwxrwxrwx 1 iferreira iferreira 6 jun 12 15:58 hosts -> hosts2
14643 -rw------- 1 iferreira iferreira 1730 jun 12 15:48 hosts2

Los permisos de un enlace simbólico no pueden ser cambiados, al ejecutar el


comando chmod sobre un enlace, tiene efecto en el archivo al cual apunta.

9. Elimine el archivo hosts2


$ rm hosts2

10. Visualice el contenido del archivo hosts. ¿El contenido puede ser visualizado?
¿Por que?
$ cat hosts
cat: hosts: No existe el fichero o el directorio

21 Red Hat Certified Engineer


El sistema de archivos

El contenido no puede ser visualizado ya que el enlace apunta a un archivo no


existente.

Búsqueda de archivos
1. Realice las siguientes búsquedas.

Buscar archivos regulares del directorio /etc


$ find /etc -type f -ls

2. Buscar archivos de tipo bloque del directorio /dev


$ find /dev -type b -ls

3. Buscar archivos de tipo caracter del directorio /dev


$ find /dev -type c -ls

4. Buscar archivos de tipo socket en el directorio /tmp


$ find /tmp -type s -ls

5. Buscar directorios dentro de /etc cuyo nombre comience con "rc"


$ find /etc -type d -name "rc*" -ls

6. Buscar archivos que fueron modificados hace 30 días o mas a partir del directorio
actual.
$ find . -type f -mtime +30 -ls

7. Buscar archivos que fueron modificados hace 30 días o menos a partir del
directorio actual.
$ find . -type f -mtime -30 -ls

8. Buscar archivos cuyo nombre termine en ".log" que fueron modificados hace
30 días o mas y moverlos al directorio /tmp/backup.
$ find . -type f -name "*.log" -mtime +30 -exec mv {} /tmp/backup \;

9. Buscar archivos a partir del directorio actual cuyo nombre termine en ".log" que
fueron modificados hace 30 días o mas y comprimirlos con el comando gzip.
$ find . -type f -name "*.log" -mtime +30 -exec gzip {} \;

10. Buscar archivos cuyo tamaño sea mayor a 100 MB en el directorio /usr.
$ find /usr -type f -size +100m -ls

Ing. Ivan Ferreira 22


El sistema de archivos

11. Buscar todos los archivos dentro del directorio /etc que contengan el
texto localhost.
$ find /etc -type f -exec grep -l localhost {} \;

Copias de seguridad
1. Realice una copia de seguridad de todo el directorio docs creado en su HOME. El
nombre del archivo tar debe ser /tmp/<usuario>.tar. Utilice las variables
de entorno USER y HOME en el comando.
$ tar cvf /tmp/$USER.tar $HOME

2. Verifique la copia de seguridad creada listando el contenido de la copia de


seguridad realizada.
$ tar tvf /tmp/$USER.tar

3. Elimine el archivo ene01.txt.


$ rm docs/planillas/enero/ene01.txt

4. Restaure el archivo ene01.txt.


$ cd /
$ tar xvf /tmp/$USER.tar docs/planillas/enero/ene01.txt

5. Identifique el tamaño que ocupa todo su directorio HOME. Realice una copia de
seguridad de su directorio home con el comando tar a un archivo
dentro del directorio /tmp, verifique el tamaño del archivo tar creado y
compárelos.
$ cd
$ du -sk .
$ tar cvf /tmp/$USER.tar $HOME
$ ls -la /tmp/$USER.tar

6. Elimine el tarfile creado y ejecute nuevamente una copia de seguridad


con el comando tar comprimiendo los datos con gzip y verifique el tamaño del
archivo tar creado.
$ rm /tmp/$USER.tar
$ tar zcvf /tmp/$USER.tgz $HOME
$ ls -la /tmp/$USER.tgz

7. Elimine el archivo tar creado y ejecute nuevamente una copia de seguridad con el
comando tar comprimiendo los datos con bzip2 y verifique el tamaño del archivo
tar creado.

23 Red Hat Certified Engineer


El sistema de archivos

$ rm /tmp/$USER.tgz
$ tar jcvf /tmp/$USER.tz2 $HOME
$ ls -la /tmp/$USER.tz2

8. Suponiendo que utiliza un dispositivo de cinta, investigue la forma de hacer más de


un backup al mismo medio y la forma de restaurar un backup específico de este
medio.

El dispositivo de cinta en Linux permite el acceso a través de dos archivos


especiales:
● /dev/st0

● /dev/nst0

Al utilizar /dev/st0, una vez finalizado el backup, la cinta es rebobinada. Si se


lanzara otro backup al mismo medio, sera sobrescrito el anterior.

Al utilizar /dev/nst0, una vez finalizado el backup, la cinta NO es rebobinada. Si


se lanzara otro backup al mismo medio, sera anexado manteniendo el backup
anterior.

Para restaurar un backup especifico de un medio que contiene múltiples backups


debemos utilizar el comando mt para posicionar la cinta.

El comando:
$ mt -f /dev/nst0 rewind

Retrocede la cinta

El comando:
$ mt -f /dev/nst0 fsf 1

Avanza la cinta una copia de seguridad, permitiendo restaurar la segunda existente


en el medio, con el comando:
$ tar xpvf /dev/nst0

9. ¿Existe algún beneficio en utilizar compresión por software, por ejemplo, utilizando
las opciones -j o -z del comandor tar, cuando se realiza backup a un dispositivo de
cinta?

No, al contrario, tiene un impacto negativo debido a que la compresión de datos ya


es realizado por el dispositivo de cinta, comprimirlo por software antes de enviar al
dispositivo lo único que logra es hacer mas lento el proceso de backup y consumir
mayor cantidad de CPU durante el proceso.

Ing. Ivan Ferreira 24


4
Redirecciones y tuberías
Redirecciones y tuberías

Redireccionando la entrada, salida y error estándar


1. Realice una copia de seguridad de todo el directorio docs creado en su HOME. El
nombre del archivo tar debe ser /tmp/<usuario>.tar. Utilice las variables
USER y HOME en el comando. La salida de información direccionela a un archivo
llamado /tmp/<usuario>.log y la salida de error a un archivo
llamado /tmp/<usuario>.err.
$ tar cvf /tmp/$USER.tar $HOME/docs > /tmp/$USER.log 2> /tmp/$USER.err

2. Utilice el comando mail para enviar el contenido del archivo


/tmp/<usuario>.err a usted mismo redireccionando la entrada estándar.
$ mail -s "Errores de backup" $USER < /tmp/$USER.err

3. Busque con el comando find en el directorio /var todos los archivos que
terminen en ".log". Los mensajes de error deben ser completamente
ignorados redireccionando el error estándar a /dev/null.
$ find /var -type f -name "*.log" 2> /dev/null

4. Busque con el comando find en el directorio /var todos los archivos cuyo
propietario no sea root. Redireccione la salida estándar y el error estándar al
mismo archivo.
$ find /var -type f ! -user root -ls > find.log 2>&1

5. Identifique cuantos archivos de nombre README existen en el directorio


/usr/share/doc utilizando los comandos find y wc.
$ find /usr/share/doc -type f -name README | wc -l

6. Busque todos los archivos de tipo bloque del directorio /dev y a través de una
tubería, visualice el resultado con el comando more.
$ find /dev -type b -ls | more

7. Identifique el directorio que ocupa mas espacio en /usr/share/doc con el


comando du y ordenelo por tamaño con el comando sort, mostrando los
únicamente los 10 de mayor tamaño con el comando head.
$ du -sk /usr/share/doc/* | sort -nrb | head

Ing. Ivan Ferreira 26


5
Filtros y procesamiento de cadenas
Filtros y procesamiento de cadenas

Filtros y procesamiento de cadenas


El archivo /etc/passwd el un archivo el cual contiene la lista de usuarios del
sistema. El archivo se compone de campos separados por dos puntos ":". El orden
de los campos del archivo es el siguiente:

● Nombre de usuario o login

● Contraseña (obsoleto)

● UID

● GID

● Descripcion (opcional) - Generalmente el nombre completo de la persona.

● Directorio HOME

● Shell

Utilice el siguiente archivo passwd de ejemplo. Puede crear un archivo con este
contenido en su directorio home:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
gnarwl:x:390:390:Email autoreply agent:/var/lib/gnarwl:/bin/false
juan.perez:x:515:516::/home/juan.perez:/bin/bash
ogomez:x:516:517::/home/ogomez:/bin/bash

NOTA: Todos estos ejercicios requieren que la expresión regular inicie con ^ y
termine con $.

1. Utilizar el comando cut para obtener el nombre de todos los usuarios del sistema
listados en el archivo passwd.
$ cut -f 1 -d ":" passwd

2. Utilizar el comando cut para obtener el nombre de todos los usuarios, su UID y
GID del sistema listados en el archivo passwd.

Ing. Ivan Ferreira 28


Filtros y procesamiento de cadenas

$ cut -f 1,3,4 -d ":" passwd

3. Utilizar el comando cut para obtener el nombre de todos los usuarios, su UID y
GID del sistema listados en el archivo passwd y mostrar la salida separada por un
tabulador utilizando el comando tr.
$ cut -f 1,3,4 -d ":" passwd | tr “:” “\t”

4. Utilizar el comando egrep con expresiones regulares para obtener el nombre de


todos los usuarios del sistema listados en el archivo passwd cuyo login tenga 4
caracteres.
$ egrep "^....:x.*$" passwd

Consideramos que el primer campo es el nombre. Al inicio de la línea (^) deben


existir 4 caracteres cualquiera (.) luego encontramos el separador de campo “:”
seguido de una “x” y luego cualquier texto (.*) hasta el fin de línea ($).

5. Utilizar el comando egrep con expresiones regulares para obtener el nombre de


todos los usuarios del sistema listados en el archivo passwd cuyo login tenga 4
caracteres o menos.
$ egrep "^..?.?.?:x.*$" passwd

Consideramos que el primer campo es el nombre. Al inicio de la línea (^) debe


existir 1 caracter cualquiera (.), luego 3 caracteres cualquiera cero o una vez (.?)
luego encontramos el separador de campo “:” seguido de una “x” y luego cualquier
texto (.*) hasta el fin de línea ($).

6. Utilizar el comando egrep con expresiones regulares para obtener el nombre de


todos los usuarios del sistema listados en el archivo passwd cuyo nombre de login
comience con a,c,r,p.
$ egrep "^[acrp].*$ passwd

Consideramos que el primer campo es el nombre. Al inicio de la línea (^) debemos


encontrar los caracteres a, c, r o p ([acrp]) y luego cualquier texto (.*) hasta el fin de
línea ($).

7. Utilizar el comando egrep con expresiones regulares para obtener el nombre de


todos los usuarios del sistema listados en el archivo passwd cuyo nombre de login
comience con a,c,r,p y su shell sea bash.
$ egrep "^[acrp].*/bin/bash$ passwd

Consideramos que el primer campo es el nombre. Al inicio de la línea (^) debemos


encontrar los caracteres a, c, r o p ([acrp]) y luego cualquier texto (.*), como el
ultimo campo es el nombre del shell, debemos encontrar /bin/bash al final de

29 Red Hat Certified Engineer


Filtros y procesamiento de cadenas

línea ($).

8. Utilizar el comando egrep con expresiones regulares para obtener el nombre de


todos los usuarios del sistema listados en el archivo passwd cuyo nombre de login
comience con a,c,r,p, su shell sea bash y su directorio home se encuentre por
debajo de /home.
$ egrep "^[acrp].*x:[0-9]+:[0-9]+:.*:/home/.+:/bin/bash$ passwd

Consideramos que el primer campo es el nombre. Al inicio de la línea (^) debemos


encontrar los caracteres a, c, r o p ([acrp]) y luego cualquier texto (.*) hasta el
segundo campo que es una “x”, luego encontramos el separador de campo “:”,
luego el UID el cual es un valor numérico “([0-9])” que debe repetirse una o mas
veces (+), seguido del separador de campos “:”, seguido del GID el cual es un valor
numérico “([0-9])” que debe repetirse una o mas veces (+), seguido del separador
de campos “:”, una descripción la cual es opcional por tanto podría existir o no
cualquier texto (.*), seguido del separador de campos “:”, hasta el campo del
directorio home el cual debe comenzar con /home/ y luego cualquier carácter (.) al
menos una vez (+) para representar un directorio por debajo de /home, finalmente
el ultimo campo es el nombre del shell, por tanto debemos encontrar /bin/bash
al final de línea ($).

9. Utilizar una combinación del comando egrep con expresiones regulares y cut
para obtener el nombre de todos los usuarios del sistema listados en el archivo
passwd cuyo UID sea menor a 20.
$ egrep "^.*x:1?[0-9]:.*$" passwd | cut -f 1 -d ":"

Consideramos que el primer campo es el nombre. Al inicio de la línea (^) debemos


encontrar cualquier texto (.*) hasta el segundo campo que es una “x”, luego
encontramos el separador de campo “:”, luego el UID el cual debe contener un
número 1 cero o una vez (?), no no aparece el número 1 tenemos UID < 10, si
aparece, tenemos UID > 10, luego debe aparecer un número del 0 al 9 ([0-9]),
luego el separador de campo “:” y finalmente cualquier texto (.*) hasta el final de
línea ($).

10. Utilizar una combinación del comando egrep con expresiones regulares y cut
para obtener el nombre de todos los usuarios del sistema listados en el archivo
passwd cuyo nombre de login contenga un punto, por ejemplo juan.perez.
$ egrep "^.+\..+x:.*$" passwd | cut -f 1 -d ":"

Consideramos que el primer campo es el nombre. Al inicio de la línea (^) debemos


encontrar cualquier carácter (.) una o mas veces (+) seguido de un punto el cual se
encuentra “escapado” para eliminar su significado especial dentro de la expresión
regular (\.), seguido de cualquier carácter (.) una o mas veces (+) hasta el segundo
campo el cual es una “x”, luego el separador de campo “:” y finalmente cualquier

Ing. Ivan Ferreira 30


Filtros y procesamiento de cadenas

texto (.*) hasta el final de línea ($).

11. Utilizar una combinacion de los comandos, ls, grep y alias, para crear un alias
llamado lld, el cual listara en formato largo unicamente los directorios del
directorio actual.
$ alias lld="ls -la | grep ^d"

12. Utilizar una combinacion de los comandos, ls, grep, cut y alias, para crear un
alias llamado lsd, el cual listara en formto corto (solo el nombre) únicamente los
directorios del directorio actual.
$ alias lsd='ls -la | grep ^d | tr -s " " | cut -f 9 -d " "'

13. Utilizar una combinación de los comandos head y tail para mostrar únicamente
la quinta línea del archivo passwd
$ head -5 passwd | tail -1

14. Utilizar el comando egrep con expresiones regulares para obtener la lista de todos
los usuarios del sistema listados en el archivo passwd cuyo UID sea mayor a 500.
$ egrep "^.*x:([1-9]+[0-9]+|[5-9]+)[0-9]+[0-9]+:.*$" passwd

Esta expresión regular relativamente compleja busca números que van desde 500-
999 o 1000 hasta 9999, siendo:

● [5-9]+[0-9]+[0-9]+ La busqueda de números entre 500 y 999

● [1-9]+[0-9]+[0-9]+[0-9]+ La búsqueda de números entre 1000 y 9999

● ([1-9]+[0-9]+|[5-9]+) La búsqueda de números que sean mil y algo ([1-9]+[0-


9]+) “o” (|) quinientos y algo ([5-9]+). Se los indica entre paréntesis separado
por “pipe” para indicar uno u otro.

● ([1-9]+[0-9]+|[5-9]+)[0-9]+[0-9]+ Representaría los números que sean mil


para arriba o quinientos para arriba.

El editor de flujo sed


1. Utilizando el archivo passwd del ejemplo de los ejercicios de "Filtros y
procesamiento de cadenas", realice las siguientes tareas:

Modifique todas las líneas que contienen /bin/false como shell por
/bin/nologin.
$ sed 's/\/bin\/false/\/bin\/nologin/' passwd

31 Red Hat Certified Engineer


Filtros y procesamiento de cadenas

2. Modifique el shell de todos los usuarios cuyo nombre de login contenga un punto
por /bin/nologin.
$ sed '/^.*\..*x:.*$/ s/\/bin\/bash/\/bin\/nologin/' passwd

3. Muestre la línea 5 del archivo passwd.


$ sed -n '5 p' passwd

4. Muestre desde la línea 5 a la 10 del archivo passwd.


$ sed -n '5,10 p' passwd

5. Muestre solamente las líneas que corresponde con usuarios que no tienen como
shell /bin/nologin.
$ sed -n '/^.*nologin$/! p' passwd

Procesando texto con awk


1. Utilizando el archivo passwd del ejemplo de los ejercicios de "Filtros y
procesamiento de cadenas", realice las siguientes tareas:

Muestre el nombre de login, el UID y el GID de cada usuario.


$ awk -F ":" '{ print $1,$3,$4 }' passwd

2. Muestre el nombre de login, el UID y el GID de cada usuario, separado por un


tabulador.
$ awk -F ":" -v OFS="\t" '{ print $1,$3,$4 }' passwd

3. Muestre el nombre de login, el UID y el GID de cada usuario con el siguiente


formato:

"Nombre de usuario: <login> UID: <uid> GID: <gid>"


$ awk -F ":" '{ print "Nombre de usuario:",$1,"UID:",$3,"GID:",$4 }' passwd

4. Muestre la lista de usuarios cuyo UID es mayor a 100.


$ awk -F ":" '$3 > 100 {print $1}' passwd

5. Muestre la lista de usuarios cuyo GID es 0.


$ awk -F ":" '$4 == 0 {print $1}' passwd

6. Muestre la lista de usuarios que no tienen un shell asignado.


$ awk -F ":" '/^.*:$/ { print $1 }' passwd

Ing. Ivan Ferreira 32


Filtros y procesamiento de cadenas

7. Muestre la cantidad total de usuarios del archivo.


$ awk -F ":" 'END { print NR }' passwd

8. Muestre el nombre de login, el UID, el GID de cada usuario que tiene como shell
/sbin/nologin.
$ awk -F ":" '/^.*\/sbin\/nologin$/ { print $1,$3,$4}' passwd

9. Muestre el nombre de login, el UID, el GID de cada usuario cuyo nombre de login
contiene un punto.
$ awk -F ":" '/^.+\..+$/ { print $1 }' passwd

33 Red Hat Certified Engineer


6
Scripts del shell
Scripts del shell

Scripts del shell


Es recomendado que realice los laboratorios de esta sección utilizando como
referencia la guía LE-101 - Linux Enterprise Operacional.

En esta sección, creará un script para realizar copias de seguridad. Iniciará con un
script simple el cual irá modificando hasta obtener el resultado deseado.

Inicialmente, cree un script con el comando vi que muestre un menú al usuario


llamado script1.sh con el siguiente contenido:
#!/bin/bash

# Seccion menu principal

echo "Menu princpal"


echo "============="
echo
echo "1- Crear backup"
echo "2- Listar backup"
echo "3- Restaurar backup"
echo “0- Salir”
echo
echo -n "Seleccione una opcion: "

Guarde el archivo. Para poder ejecutar el script, debe establecer los permisos
correcto, para ello ejecute el comando:
$ chmod 755 script1.sh

Ejecute el script con el comando:


$ ./script1.sh

El menú debe ser visualizado.

Ahora, agregará al script la sección que permite al usuario seleccionar una opción
del menú, con el comando interno read. Copie el archivo script1.sh a
script2.sh
$ cp script1.sh script2.sh

Edite el archivo script2.sh como sigue:


#!/bin/bash

# Seccion menu principal

echo "Menu princpal"

35 Red Hat Certified Engineer


Scripts del shell

echo "============="
echo
echo "1- Crear backup"
echo "2- Listar backup"
echo "3- Restaurar backup"
echo “0- Salir”
echo
# El usuario ingresa una opcion
echo -n "Seleccione una opcion: "
read OPCION
# Mostramos al usuario que opcion ha seleccionado
echo "Usted selecciono la opcion $OPCION"

Guarde el archivo y ejecútelo:


$ ./script2.sh

En este punto, usted debe poder seleccionar una opción del menú y el script
mostrará la opción seleccionada.

Copie el script2.sh a script3.sh:


$ cp script2.sh script3.sh

Edite el archivo script3.sh y agregue la sección que permitirá la ejecución del


comando apropiado según la opción seleccionada por el usuario. Para verificar que
acción debe ejecutarse según la opción ingresada por el usuario, utilizará la
sentencia case:
#!/bin/bash

# Seccion menu principal

echo "Menu princpal"


echo "============="
echo
echo "1- Crear backup"
echo "2- Listar backup"
echo "3- Restaurar backup"
echo "0- Salir"
echo

# El usuario ingresa una opcion


echo -n "Seleccione una opcion: "
read OPCION

# Se comprueba que opcion ha ingresado el usuario y se ejecuta la accion


case $OPCION in
0)
echo "Programa finalizado"

Ing. Ivan Ferreira 36


Scripts del shell

exit 0
;;
1)
echo "Creando backup de $HOME para $USER"
tar cf /tmp/$USER.tar $HOME
echo "Backup Finalizado"
;;
2)
echo "Listando backup"
tar tf /tmp/$USER.tar
;;
3)
echo "Recuperando backup"
cd /tmp
tar xvf /tmp/$USER.tar
;;
*)
echo "Opcion invalida"
;;
esac

Ejecute el script con el comando:


$ ./script3.sh

En este punto, debe tener un script de backup básico funcional.

Si el usuario ingresa una opción inválida, el programa muestra el mensaje


apropiado y finaliza. Ahora modifique el script para que se muestre el menú
continuamente hasta que el usuario ingrese una opción válida. Para ello utilizará
una sentencia while.

Copie el script script3.sh a script4.sh y modifiquelo como sigue:


#!/bin/bash

# Seccion menu principal

echo "Menu princpal"


echo "============="
echo
echo "1- Crear backup"
echo "2- Listar backup"
echo "3- Restaurar backup"
echo "0- Salir"
echo

# Definimos una variable para verificar si ha ingresado

37 Red Hat Certified Engineer


Scripts del shell

# una opcion valida.

VALIDO=0

# Mientras VALIDO=0 la opcion seleccionada es invalida


# y se volvera a solicitar que ingrese la opcion
while [ $VALIDO -eq 0 ]
do
# El usuario ingresa una opcion
echo -n "Seleccione una opcion: "
read OPCION

# Se comprueba que opcion ha ingresado el usuario y se ejecuta la accion


# Si la opcion seleccionada esta entre los valores correctos, se
# establece VALIDO=1
case $OPCION in
0)
VALIDO=1
echo "Programa finalizado"
exit 0
;;
1)
VALIDO=1
echo "Creando backup de $HOME para $USER"
tar cf /tmp/$USER.tar $HOME/oper_ago
echo "Backup Finalizado"
;;
2)
VALIDO=1
echo "Listando backup"
tar tf /tmp/$USER.tar
;;
3)
VALIDO=1
echo "Recuperando backup"
cd /tmp
tar xvf /tmp/$USER.tar
;;
*)
VALIDO=0
echo "Opcion invalida"
;;
esac
done

Ejecute el script script4.sh:


$ ./script4.sh

Ing. Ivan Ferreira 38


Scripts del shell

En este punto, si ingresa una opción incorrecta, debe volver a solicitar que ingrese
una opción válida.

Hasta ahora, los scripts han sido interactivos. El problema es si de es deseado


automatizar la ejecución de un backup, el script no debe ser interactivo.

Para lograr esto, creamos scripts que utilizan parámetros posicionales. En el


siguiente script, en lugar de presentar un menú, indicaremos en el primer
argumento si se desea crear, listar o extraer un backup utilizando la variable $1.
Edite un archivo llamado script5.sh con el siguiente contenido:
#!/bin/bash

# Verificamos si el usuario ha ingresado al menos un argumento


# Si el numero de argumentos pasado ($#) es igual a cero,
# no se ha ingresado un argumento, por tanto mostramos un mensaje
# de sintaxis
if [ $# -eq 0 ]
then
echo "Uso: $0 -c|-t|-l|-x-r"
exit 1
fi

# Definimos variables para mayor conveniencia y simplicidad de los comandos


LOGFILE=/tmp/$USER.log
ERRFILE=/tmp/$USER.err
TARFILE=/tmp/$USER.tar

# Verificamos la opcion ingresada por el usuario ($1 = primer argumento)


# El argumento -c crea un backup, -t o -l listan el backup y -x o -r
# restauran el backup dentro del directorio /tmp. Cualquier otra opcion es
# invalida
case $1 in
-c)
echo "Creando backup"
tar cvf $TARFILE $HOME > $LOGFILE 2> $ERRFILE
echo "Backup finalizado"
;;
-t|-l)
echo "Listando backup"
tar tvf $TARFILE
;;
-x|-r)
echo "Recuperando backup"
cd /tmp
tar xvf $TARFILE
;;
*)

39 Red Hat Certified Engineer


Scripts del shell

echo "Opcion invalida"


;;
esac

Establezca los permisos apropiados y ejecute el script sin argumentos, luego con
las opciones -c y -l
$ chmod 755 script5.sh
$ ./script5.sh
$ ./script5.sh -c
$ ./script5.sh -l

Copie el archivo script5.sh a script6.sh. Modifique el script para identificar si


el backup fue creado correctamente. De haber existido algun error, debe enviarse
por correo a usted mismo el archivo de registro de errores:
#!/bin/bash

# Verificamos si el usuario ha ingresado al menos un argumento


# Si el numero de argumentos pasado ($#) es igual a cero,
# no se ha ingresado un argumento, por tanto mostramos un mensaje
# de sintaxis
if [ $# -eq 0 ]
then
echo "Uso: $0 -c|-t|-l|-x-r"
exit 1
fi

# Definimos variables para mayor conveniencia y simplicidad de los comandos


LOGFILE=/tmp/$USER.log
ERRFILE=/tmp/$USER.err
TARFILE=/tmp/$USER.tar

# Verificamos la opcion ingresada por el usuario ($1 = primer argumento)


# El argumento -c crea un backup, -t o -l listan el backup y -x o -r
# restauran el backup dentro del directorio /tmp. Cualquier otra opcion es
# invalida
case $1 in
-c)
echo "Creando backup"
tar cvf $TARFILE $HOME > $LOGFILE 2> $ERRFILE
# Verificamos si el valor de retorno ($?) del comando anterior (el tar)
# es diferente de 0. De ser asi, quiere decir que el comando termino con error
# y se envia un mail al usuario
if [ $? -ne 0 ]
then
echo "Errores durante el backup. Consulte el archivo $ERRFILE"
mail -s "Errores durante el backup" $USER < $ERRFILE
else

Ing. Ivan Ferreira 40


Scripts del shell

echo "Backup finalizado correctamente"


fi
;;
-t|-l)
echo "Listando backup"
tar tvf $TARFILE
;;
-x|-r)
echo "Recuperando backup"
cd /tmp
tar xvf $TARFILE
;;
*)
echo "Opcion invalida"
;;
esac

1. Cree un script para identificar el nombre del último día del mes.
#!/bin/bash

# El comando muestra el calentario con cal, filtra las lineas vacias


# con grep, muestra solo la ultima linea con tail y muestra la cantidad
# de columnas. A partir del numero de columna se puede identificar el dia
COLUMNA_ULT_DIA=`cal | grep -v "^$" | tail -1 | awk '{ print NF }'`

# El comando muestra el calentario con cal, filtra las lineas vacias


# con grep, muestra solo la ultima linea con tail y muestra el numero que
# corresponde con el ultimo dia del mes
ULT_DIA_NUMERO=`cal | grep -v "^$" | tail -1 | awk '{ print $NF }'`

# Establecemos el nombre del dia segun la columna obtenida


case $COLUMNA_ULT_DIA in
1)
DIA=Domingo
;;
2)
DIA=Lunes
;;
3)
DIA=Martes
;;
4)
DIA=Miercoles
;;
5)
DIA=Jueves
;;
6)

41 Red Hat Certified Engineer


Scripts del shell

DIA=Viernes
;;
7)
DIA=Sabado
;;
esac

echo "El ultimo dia del mes es $DIA $ULT_DIA_NUMERO"

2. Cree un script para verificar si cualquiera de los sistemas de archivos reportados


por el comando df -t ext3 supera 90% de su capacidad utilizada, de ser así, debe
enviar una alerta al administrador del equipo por medio del comando mail, con la
salida del comando df como cuerpo del mensaje.

#!/bin/bash

ARCHIVO_TEMP=/tmp/df.log

df -h -P -t ext3 > /tmp/df.log

# Con el comando cat visualizamos el resultado del comando df almacenado


# en el archivo temporal. Con el comando tr eliminamos el signo de %.
# Con el comando grep evitamos que se muestre la cabecera del comando df.
# Con el comando awk, se muestra la linea cuyo %Uso es mayor a 90
# y con el comando wc se cuenta cuantas lineas ha retornado el comando.
# El valor se almacena en la variable ALERTA

ALERTA=$(cat /tmp/df.log | tr -d "%" | grep -v Uso | awk '$5 > 90 { print $0 }' |
wc -l)

if [ $ALERTA -ne 0 ]
then
echo "ALERTA! Uno de los sistemas de archivos supera el 90% de utilizacion"
mail -s "ALERTA de espacio libre" $USER < /tmp/df.log
fi

3. Cree un script llamado backup.sh que reciba como opciones:

● -c Para crear un backup

● -l o -t Para listar un backup

● -e o -x Para extraer un backup

Cualquier otra opción o la omisión de la opción, debe indicar error de sintaxis. El


script debe recibir como segundo argumento el directorio que se desea hacer
backup, si no se especifica uno, debe hacer backup del directorio HOME. El
archivo resultante debe llamarse /tmp/<usuario>-<fecha>.tar. Siendo <usuario> el

Ing. Ivan Ferreira 42


Scripts del shell

nombre de usuario que ejecuto el script y <fecha> la fecha en formato mm-dd-


aaaa. Asegúrese de mantener un log de la ejecución del backup.

4. Tarea avanzada. Investigar sobre los comandos dd, stty y tty. Preparar un script
que pueda diferenciar si el usuario presionó ENTER o si ingreso otro caracter.

#!/bin/bash
echo -n "Introduzca un caracter: "
stty raw
TTY=$(tty)
readchar=$(dd if=${TTY} bs=1 count=1 2> /dev/null)
stty -raw
if [ $readchar = "^M" ] <--- ^M se obtiene con “ctrl+v, enter”
then
echo
echo "Usted presionó la tecla ENTER"
else
echo
echo "Usted presionó la tecla '${readchar}'"
fi
exit 0

43 Red Hat Certified Engineer


7
Impresión y comunicación
Impresión y comunicación

Impresión
1. Utilice el comando pr para formatear y mostrar las 2 primeras paginas del archivo
/etc/samba/smb.conf, enviando la salida al comando lpr, imprimiendo 2
copias.
$ pr +1:2 /etc/samba/smb.conf | lpr -# 2

2. Verifique con el comando lpq si la impresora hplj2 tiene trabajos pendientes.


$ lpq -P hpjl2

3. Busque todos los archivos regulares que no tienen un propietario y envie el


resultado a la impresora hplj3.
$ find / -nouser | lpr -P hplj3

4. Modifique su archivo .bash_profile con el editor vi, para establecer como


impresora predeterminada la impresora llamada hplj.
$ vi .bash_profile

Agregar:
export PRINTER=hplj

Grabar y salir.

5. Cancele el trabajo numero 50 de la impresora hplj.


$ lprm -P hplj 50

Comunicación
1. Envíese a usted mismo una copia del archivo /etc/hosts como cuerpo de
mensaje utilizando el comando mail, con el asunto "archivo host".
$ mail -s "archivo host" $USER < /etc/hosts

2. Una vez ingresado el comando mail, identifique las ordenes requeridas para:

● Visualizar el mensaje numero 10

● Borrar los mensajes del 1 al 20

● Borrar todos los mensajes

● Listar nuevamente los mensajes recibidos

45 Red Hat Certified Engineer


Impresión y comunicación

Deberá ejecutar:

● 10 [ENTER]

● 1-20 d [ENTER]

● * d [ENTER]

● h [ENTER]

Ing. Ivan Ferreira 46


8
Control de procesos y herramientas del sistema
Control de procesos y herramientas del sistema

Control de procesos
1. En una terminal, identifique el tty asociado.
$ tty

2. Abra una nueva terminal, identifique el tty asociado.


$ tty

3. En la primera terminal, ejecute el comando yes.


$ yes

4. En la segunda terminal, visualice la lista de procesos e identifique:

● Que porcentaje de cpu esta consumiendo el proceso "yes".

● A que hora fue lanzado el proceso.

● Desde que tty fue lanzado el proceso.

● Cual es su estado actual.


$ ps auxw | more

● Visualizar columna %CPU

● Visualizar columna START

● Visualizar columna TTY

● Visualizar columna STAT

5. En la primera terminal, detenga el proceso utilizando la combinación de teclas


CTRL+Z. Que se observa en la terminal?
[1]+ Stopped yes > /dev/null

6. En la segunda terminal, visualice la lista de procesos e identifique:

● Que porcentaje de cpu esta consumiendo el proceso "yes".

● Cual es su estado actual.


$ ps auxw | more

● Visualizar columna %CPU

● Visualizar columna STAT

Ing. Ivan Ferreira 48


Control de procesos y herramientas del sistema

7. En la primera terminal, envíe el proceso a segundo plano.


$ bg

8. En la segunda terminal, identifique el proceso y envíe con el comando kill la


señal SIGTERM.
$ ps auxw | grep yes

Identificar el PID y ejecutar:


$ kill <PID>

9. En la primera terminal, ejecute el comando yes, redireccionando la salida estándar


y el error estandar a /dev/null, y envíelo a segundo plano directamente.
$ yes > /dev/null &

10. En la segunda terminal, envíe la señal SIGKILL al proceso yes con el comando
killall.
$ killall -9 yes

11. En la primera terminal, ejecute el comando yes, redireccionando la salida estándar


y el error estándar a /dev/null, y envíelo a segundo plano directamente.
$ yes > /dev/null 2>&1 &

12. Vuelva a poner el proceso en primer plano y cancele el comando yes


$ fg

Presionar CTRL+C

13. En la primera terminal, con el comando find, busque todos los archivos de tipo
bloque en el directorio /dev, envíe el resultado al archivo /tmp/find.out, los
errores deben ser enviados a /dev/null. Envíe la búsqueda a segundo plano.
$ find /dev -type b -ls > /tmp/find.out 2> /dev/null &

14. Verifique los trabajos ejecutándose en segundo plano con el comando jobs.
$ jobs

15. Envíe la señal SIGKILL al proceso "yes" utilizando su numero de job.


$ kill %1

16. Utilice el comando time para identificar cuanto tiempo demora el comando:

49 Red Hat Certified Engineer


Control de procesos y herramientas del sistema

find /etc -name host


$ time /etc/ -name hosts

17. Utilizando el comando "w", identifique usuarios que han estado inactivos mas de
una hora.
$ w

Observar la columna IDLE.

Herramientas del sistema


1. Agende en cron una tarea que ejecute su script de backup diariamente a las 19:00
Hs.
$ crontab -e

Agregar:
0 19 * * * $HOME/backup.sh

Guardar y salir.

2. Agende en cron una tarea que se ejecute todos los domingos a las 01:00 y busque
todos los archivos que pertenecen a usted en el directorio /tmp y los borre.
$ crontab -e

Agregar:
0 1 * * 0 /bin/find /tmp -user $LOGNAME -exec rm {} \;

Guardar y salir.

3. Agende en cron una tarea que ejecute el script /usr/local/bin/reporte.sh


el 27 de cada mes.
$ crontab -e

Agregar:
1 0 27 * * /usr/local/bin/reporte.sh

Guardar y salir.

4. Agende en cron una tarea que se ejecute los lunes, miercoles y viernes, enviando
por mail un reporte de los archivos con tamaño mayor a 50 MB encontrados en el
directorio /tmp.
$ crontab -e

Ing. Ivan Ferreira 50


Control de procesos y herramientas del sistema

Agregar:
1 0 * * 1,3,5 /bin/find /tmp -size +50m -ls | /bin/mail -s "Archivos grandes"
$LOGNAME

Guardar y salir

5. ¿Con que frecuencia se ejecutaria la siguiente tarea?

*/5 * * * * /usr/local/sbin/check_database.sh

Cada cinco minutos. Esta sintaxis es especifica de Linux.

6. Salve una copia de todas las entradas en cron al archivo cron.bak


$ crontab -l > cron.bak

7. Elimine todas las entradas agendadas en cron


$ crontab -r

8. Recupere las entradas agendadas a partir del archivo cron.bak


$ crontab cron.bak

9. Cree un script dentro de su directorio ~/bin para borrar todos los archivos de
nombre *.txt mas viejos a 30 dias que se encuentran en su HOME con el
nombre dirclean.sh. Con el comando at, ejecute el script dirclean.sh, el día
domingo a las 18:00 Horas.
$ vi $HOME/bin/dirclean.sh

Agregar:
find $HOME -type f -name "*.txt" -mtime +30 -exec rm {} \;

Guardar y salir.

$ at 18:00 sunday
$HOME/bin/dirclean.sh

Presionar CTRL+D.

51 Red Hat Certified Engineer

You might also like