Está en la página 1de 116

EX - LINUX EXPERTO EN LINUX.

MODULO 2

Módulo 2
Tema 2.1: Shells, secuencias de comandos (scripts) y gestión de datos
2.1.1. Personalizar y usar el entorno de la Shell
Una de las ventajas y un punto fuerte de los sistema Linux y Unix frente al resto de los
sistemas operativos es su poderoso línea de comandos que vimos en el anterior modulo,
comúnmente denominado Shell. Este Shell es un programa que sirve de interfaz al
usuario para que pueda dar instrucciones al kernel del sistema operativo. Durante el
recorrido de este módulo, se ha estado interactuando constantemente mediante el
interpretador de comandos ejecutando las diversas instrucciones para realizar múltiples
tareas. El conocimiento de una shell va mucho más alla de simplemente ejecutar los
programas por su nombre.
Una de las tareas esenciales de TI es automatizar los procesos. Como administradores de
servidores, la habilidad de poder automatizar las tareas del siga se traduce en tiempo
ahorrado para enfocarse donde lo necesitan. Automatizar las tareas tanto en Linux como
en unix. Va mucho más allá de simplemente ejecutar un comando en cron, es una
programación adecuada de la tarea que pueda manejar distintas situaciones sin error.
A lo que se trata de personalizar Linux permite personalizar el entorno del usuario y del
sistema en global, los archivos de configuración del entorno pueden clasificarse de la
siguiente manera:

Entonces, explicando brevemente la tabla anterior, diríamos que si queremos configurar el


diseño de un prompt que afecte a todos los usuarios del sistema, deberíamos de definir la
variable PS1 en el archivo /etc/bashrc (o /etc/bash.bashrc, dependiendo de la distribución)
que es el archivo que contiene el valor para PS1. De este modo el prompt cambiará tanto
si accedemos en un modo de ejecución de consola como si accedemos en un run level
gráfico y posteriormente abrimos una terminal, pero… ¿Por qué también si accedemos
directamente en un modo de solo consola si es /etc/profile el que se ejecuta y no
/etc/bashrc? – Porque si nos fijamos en el contenido de /etc/profile veremos que llama a
/etc/bashrc y entonces este setea el prompt para el usuario.De este modo a menos que
comentemos las líneas de /etc/profile en las que se llama a /etc/bashrc en ambos casos el
prompt cambiará y además de forma global.
Si lo que queremos es que el nuevo valor de la variable PS1 solo afecte a un
determinado usuario y además únicamente cuando abre una terminal desde el entorno de

Academy Xperts Bolivia


1
EX - LINUX EXPERTO EN LINUX. MODULO 2

escritorio, es decir el prompt no cambiaría si accedemos en un modo de ejecución de


modo consola, tendremos que definir la variable PS1 en el archivo ~/.bashrc del usuario
en cuestión y además tendremos que comentar las líneas de ~/.bash_profile (o ~/.profile
dependiendo de la distribución) en las que se llama a ~/.bashrc. De lo contrario el prompt
cambiará esta vez solo para ese usuario, pero en ambos casos, es decir, tanto si el
usuario accede directamente desde el modo consola como si lo hace desde el entorno
gráfico a través de una terminal virtual.
Nota: Dependiendo de la distribución podremos o no encontrarnos con el archivo
~/.bashrc. De todos modos podremos crearlo nosotros en /etc/skel de manera que cuando
creemos un nuevo usuario, este ya cuente con el archivo.
Al igual que las consolas poseen scripts de inicio, puede que también cuenten con scripts
de desconexión o logout. Estos scripts como suponemos, se ejecutan cuando el usuario
se desconecta. El script ejecutado normalmente es ~/.bash_logout el cual puede ejecutar
programas para limpiar los directorios temporales, eliminar claves de seguridad de la
memoria o realizar otras tareas que incluso nosotros mismos hayamos programado para
que sean ejecutadas.
Advertencia: Debemos de comprobar que es lo que realiza este script o si hemos
programado algunos comandos para que sean ejecutados al desconectar, deberemos de
tener en cuenta, que cabe la posibilidad (muy frecuentemente) que tengamos mas
terminales del mismo usuario abiertas, por lo que si cerramos una y se ejecuta el script
puede que eliminemos archivos que estamos usando en otras terminales, o simplemente
no queremos que sean eliminados hasta que la última sesión sea cerrada.
Hacer un pequeño inciso para comentar el valor de la variable PS1. La variable PS1 como
hemos mencionado, define el aspecto del prompt por ejemplo, para un prompt estándar el
aspecto sería el siguiente:
[root@localhost ~]#
Lo que indica que el usuario es root, el equipo se llama localhost, nuestro directorio de
trabajo actual es nuestro home (~) y el caracter # nos identifica como usuario root. En este
caso la variable PS1 tendría el siguiente valor:
PS1="[\u@\h:\l \W]\\$ "
Disponemos de las siguientes variables del sistema para modificar esto:
- El nombre del usuario activo: \u
- El nombre de la máquina: \h
- El directorio de trabajo: \w
- El número de histórico del comando ejecutado: \l
- Indicar $ para usuario estándar y # para root: \$
Veamos un ejemplo queremos que nuestro prompt sea de colores de un usuario de Linux
tendríamos que modificar el archivo .bashrc y colocar lo siguiente:
export PS1="\[\e[31;1m\][\u@\[\e[34;1m\]\H \W]# \[\e[0m\]"

Academy Xperts Bolivia


2
EX - LINUX EXPERTO EN LINUX. MODULO 2

y guardar luego hacer una conexión con putty al usuario y observar lo que sale.

Definir variables y alias de comandos


Los scripts de bash que acabamos de recordar y otros nuevos que hemos mencionados
sirven como hemos visto para configurar un entorno, pero para ello se necesitarán
comandos que ejecutar y construir una cierta lógica que permita al archivo realizar
determinadas acciones. A continuación vamos a ver como declarar una variable de
entorno y un alias de comando en un shell script y dejaremos para la próxima sección el
estudio de funciones y estructuras de las que nos serviremos para programar un script en
bash.
Recordemos también que las variables de entorno proporcionan los medios para pasar
datos mediante nombres a programas iniciados desde una consola. Quizás un programa
necesite conocer el nombre del ordenador, es por ello que existe una variable (y si no
existe podremos crearla y exportarla para nuestro entorno en los archivos de inicio de
consola anteriormente estudiados) llamada $HOSTNAME. Vamos a imaginar que esta
variable no existiese en nuestro entorno y un programa de terceros señala en su
documentación que el programa necesitará del valor de la variable $HOSTNAME, el cual
debe de ser el nombre del equipo que ejecuta Definir variables y alias de comandos
Los scripts de bash que acabamos de recordar y otros nuevos que hemos mencionados
sirven como hemos visto para configurar un entorno, pero para ello se necesitarán
comandos que ejecutar y construir una cierta lógica que permita al archivo realizar
determinadas acciones. A continuación vamos a ver como declarar una variable de

Academy Xperts Bolivia


3
EX - LINUX EXPERTO EN LINUX. MODULO 2

entorno y un alias de comando en un shell script y dejaremos para la próxima sección el


estudio de funciones y estructuras de las que nos serviremos para programar
un script en bash.
Recordemos también que las variables de entorno proporcionan los medios para pasar
datos mediante nombres a programas iniciados desde una consola. Quizás un programa
necesite conocer el nombre del ordenador, es por ello que existe una variable (y si no
existe podremos crearla y exportarla para nuestro entorno en los archivos de inicio de
consola anteriormente estudiados) llamada $HOSTNAME. Vamos a imaginar que esta
variable no existiese en nuestro entorno y un programa de terceros señala en su
documentación que el programa necesitará del valor de la variable $HOSTNAME, el cual
debe de ser el nombre del equipo que ejecuta el comando. Pues bien para definir esta
variable de entorno, editaríamos el archivo ~/.bash_profile (o ~/.profile) declarando la
variable de la siguiente manera:
HOSTNAME=freeser
export HOSTNAME
el comando. Pues bien para definir esta variable de entorno, editaríamos el archivo
~/.bash_profile (o ~/.profile) declarando la variable de la siguiente manera:
HOSTNAME=freeser
export HOSTNAME
Nota: Si el valor de la variable contiene espacios es obligatorio encerrarlo entre dobles
comillas.
En la primera línea declaramos la variable $HOSTNAME y en la segunda convertimos a la
variable local en variable de entorno de manera que en cuanto el script de inicio sea
ejecutado, esa variable estará disponible para cualquier programa.
Cuando exportamos una variable directamente desde la línea de comandos, el valor de
esta solo estará disponible para la terminal desde la que ha sido exportada, anulándose
su valor en cuanto cerremos la sesión o en cualquier otra terminal virtual.
Podemos hacer que una variable sea de solo lectura anteponiendo la palabra „readonly„ al
nombre de la variable, de manera que su valor no pueda ser modificado pero si
visualizado hasta que el proceso que hace uso de ella (un script, un determinado shell o
sesión…) haya finalizado, es decir, en teoría una variable que se ha modificado para solo
lectura no puede ser modificada ni eliminada hasta que el proceso que la utiliza finalice.

Cuando definamos una variable en un shell script, no será necesario exportarla, si no que
la definiremos y posteriormente el programa irá haciendo uso de ella conforme se vaya
necesitando. Una variable debe de empezar por una letra o un guión bajo „_„ pero no por
un número. A este tipo de variables simples se les conoce como escalares (scalar)
Podemos ver el valor de una variable concreta desde la línea de comandos así:

Academy Xperts Bolivia


4
EX - LINUX EXPERTO EN LINUX. MODULO 2

$ echo "$HOSTNAME"
Nota: Fijémonos en la importancia de preceder el nombre de la variable con el signo „$„,
algo que no se debe de hacer cuando se declara o define.
Si lo que queremos es ver todas las variables definidas para un entorno utilizaremos el
comando env. Este comando dispone de un par de opciones útiles pero para listar todas
las variables bastará con invocarlo sin parámetro alguno:

Podemos definir una variable para un único programa con env de la siguiente manera:

$ env DISPLAY=freeser.4sysadmins.es:0.0 nedit


Nota: En la mayoría de los casos podremos omitir el comando env
Esto provocará que el programa nedit intente iniciar usando la pantalla :0.0 en
freeser.4sysadmins.es en lugar de la pantalla local predeterminada o definida en la
variable $DISPLAY

Academy Xperts Bolivia


5
EX - LINUX EXPERTO EN LINUX. MODULO 2

Si queremos comenzar con un entorno vacío es decir, ignorando el entorno heredado,


acompañaremos a env del parámetro -i (–ignore-environment) y para anular el valor de
una variable específica usamos -u <nombre_variable> o –unset=nombre_variable.
Antes vimos como mostrar el valor de una variable mediante el comando echo. Otra forma
de hacerlo con env sería así:
$ env | grep NOMBRE_VARIABLE
Para terminar con las variables de entorno vamos a presentar una lista de las que quizás
sean las más conocidas o nos vayan a ser mas útiles:
USER o USERNAME: Nombre de usuario actual
SHELL: Contiene la ruta a la consola de comandos en uso
PWD: Esta variable la mantiene el sistema y su valor es el directorio de trabajo actual. Por
ello puede ser utilizada por programas para buscar archivos cuando no se proporciona la
ruta completa.
HOSTNAME: Como ya vimos anteriormente, esta variable contiene el nombre del equipo
de trabajo
PATH: Es una variable cuyo valor es lo suficientemente importante como para abrir una
brecha de seguridad. Su cometido es contener rutas de directorios separados por el
caracter „:„, por ejemplo PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/nebul4ck/bin, este valor
indicaría donde buscar archivos ejecutables, de manera que el usuario pueda ejecutar
aquellos programas que se encuentran bajo estas rutas (sea cual sea su directorio de
trabajo), ahorrando la necesidad de escribir ./archivo_ejecutable. Se recomienda no
añadir la ruta „.„ (directorio actual) al valor de esta variable, especialmente para el usuario
root ¿Porqué? – Un usuario malintencionado podría crear en un directorio que solemos
frecuentar un programa llamado por ejemplo „ls„ de manera que cuando root invoque a ls
en el directorio donde se encuentra el programa malicioso, este sea ejecutado en vez de
el comando ls del sistema. En el caso de que sea necesario para un usuario normal,
deberemos de colocar esta ruta al final del valor de la variable PATH
HOME: El valor de esta variable es la ruta de nuestro directorio principal, y al igual que la
variable PWD, puede ser utilizada por programas
MAIL: Su valor es la ruta del buzón de correo del usuario en cuestión, que suele ser
/var/spool/mail/nombreusuario
LANG: Utilizada para guardar el idioma actual
TZ: Indica la zona horaria que tenemos configurada o podemos emplearla precisamente
para eso, para configurar nuestra zona horaria en caso de que estemos usando un
ordenador remoto
LD_LIBRARY_PATH: Indica los directorios en los que los programas pueden encontrar
archivos de bibliotecas. Es similar a PATH pero en vez de ejecutables son librerías
PS1: También hemos visto ya la función de esta variable, la cual define el prompt del

Academy Xperts Bolivia


6
EX - LINUX EXPERTO EN LINUX. MODULO 2

sistema
TERM: Indica la terminal en uso.
DISPLAY: Otra variable ya vista, identifica la pantalla utilizada por X que suele ser :0.0.
Este valor puede ir precedido del nombre de un host remoto o cambiar a :1.0 por ejemplo
si tenemos dos sesiones de X abiertas (:0.0 para la primera sesión y :1.0 para la
segunda).
EDITOR: El editor de texto iniciado por defecto será aquel que conste en el valor de esta
variable.
Igual que definimos las variables podemos definir los alias de comandos, pero… ¿Que
son o para que sirve? – La principal ventaja de utilizar alias de comandos es la de crear
una versión acortada de un comando, para que cada vez que queramos que un comando
actúe de determinada manera no tengamos que escribirlo de forma completa. Vamos a
ver esto con un ejemplo sencillo:

Supongamos que cuando ejecutamos ls -l, el listado que nos devuelve el comando es un
listado de directorios y archivos sin color, es decir el mismo color utilizado para las letras
de la consola. Cabe la posibilidad de listar el contenido de un directorio de forma que los
archivos sean mostrado en diferentes colores, para que a simple vista reconozcamos de
que tipo de archivo se trata, por ejemplo verde para ejecutables, azul para directorios,
celeste para enlaces simbólicos, rojo con fondo negro para enlaces rotos, amarillo con
fondo negro para archivos de caracter, etc… ¿y como conseguimos esto? – Para hacer
que cada vez que ejecutemos el comando „ls‟ a secas despleguemos un listado en
formato de una sola columna (con los permisos, propietario, fecha, etc..) en color y
ordenado por fecha descendente, haremos lo siguiente:
$ alias ls='ls -lt --color'
Así de sencillo es crear un alias.
Nota: Para utilizar este alias de forma persistente podremos definirlo en alguno de los
archivos de inicio de consola. Dependiendo si queremos que sea aplicado de forma global
o local elegiremos uno u otros archivos.
Los Arrays
Un array o vector es una variable que tiene asignado un conjunto de valores a los cuales
podemos acceder mediante su número de posición, el cual nos sirve como índice de
valores. Podemos definir un array de la siguientes maneras:
Múltiples valores de forma simultánea:
$ array=(ford renault "mercedes benz" dacia vw bmw)
De uno en uno:
$ array[0]=ford

Academy Xperts Bolivia


7
EX - LINUX EXPERTO EN LINUX. MODULO 2

$ array[1]=renault
$ array[2]="mercedes benz"
...
Nota: Los indices no necesariamente tienen que ser numéricos, por ejemplo sería válido
también definir los valores del array tal que así: $ array[primero]=ford, $
array[segundo]=renault, etc…
Igualmente podemos añadir un nuevo valor al array:
$ array[6]=chevrolet
Para consultar todos o un valor específico del array:
Consultar un valor concreto:
$ echo ${array[1]}
renault
Mostrar todos los valores:
$ echo ${array[*]}
ford renault mercedes benz dacia vw bmw chevrolet
$ echo ${array[@]}
ford renault mercedes benz dacia vw bmw Chevrolet
2.1.2. Personalizar o escribir scripts simples
Cuando linus torvalds creo Linux, no tenía una interfaz para interactuar con el kernel
creado. La consola que hubiese ocupado en ese momento hubiese sido sh, también
llamado Bourne Shel para honrar a su creador Stephen Bourne. Este interpretador de
comandos es la interfaz por defecto en Unix, pero, al igual que el sistema operativo,
estaba atado a licencias propietarias, que era justamente lo que Linus Torvalds quería
prevenir.
Fue por aquella época cuando un proyecto rebelde llamado GNU nació y dio luz uno de
los primeros frutos para su proyecto de crear un sistema Unix que no fuese Unix. Este
fruto fue un interpretador de comandos que emulaba las funcionalidades del original
Bourne Shell y añadía otras capacidades más. Para distinguirse se llamó bash, cuyas
siglas en ingres representan Bourne Again Shell
Como se ha mencionado anteriormente, una Shell es la interfaz que le permite al usuario
enviar comandos al sistema operativo, y estos comandos pueden ser estructurados dentro
de un fichero en forma de script para ser ejecutados automáticamente. Tareas comunes
para automatizar de esta manera incluyen la creación de varios usuarios a la vez o
realizar copias de seguridad regularmente.

Academy Xperts Bolivia


8
EX - LINUX EXPERTO EN LINUX. MODULO 2

Como escribir un script en Bash


Lo primero es entender como se construye un script. Ya ha visto en varios casos que los
scripts de la configuración contienen comentarios anteponiendo un # para que se ignore la
línea. Hay una excepción a esta regla, y es cuando el programador incluye en la primera
línea del script el símbolo #! Seguido por un comando. La almohadilla seguida por la
exclamación al comienzo de un script se llama shebang y se utiliza para indicar que
interpretador de comandos se ocupara para el script de instrucciones. Un script escrito en
bash empezara con la línea:
#!/bin/bash
Esto asegura que, aunque el usuario inicie una sesión utilizando otro shell alternativa
como csh, los comandos escritos en el fichero script se interpretara con bash
empecemos por un ejemplo sencillo para imprimir un mensaje de consola. Creamos un
fichero nuevo llamado hola.sh y edítelo con las siguientes líneas:

La primera línea se asegurara de utilizar el interpretador del bash. La segunda línea


incluye el comando echo, que imprime el argumento dado a pantalla. Guarde los cambios
y dele permisos de ejecución a su nuevo script. Un simple chmod 755 hola.sh o chmod
a+x hola.sh y ejecutamos para ver el resultado:

Al ejecutar este primer script mediante la línea de comandos, se invoca otra instancia de
bash para ejecutar los comandos que había en este sencillo programa. En este primer
script, se alimenta a echo directamente con la cadena de caracteres. En programas
complejos, para mantener estructura y legibilidad, se utilizan variables que contienen los
valores que hay que tratar. El siguiente ejemplo muestra como se declara una variable:

Academy Xperts Bolivia


9
EX - LINUX EXPERTO EN LINUX. MODULO 2

Guarde el fichero y vuelva a ejecutarlo. Aunque se haya modificado el programa, la salida


será exactamente la misma que la primera vez. En esta ocasión, en la segunda línea de
código, se ha declarado la variable mensaje. Para hacer referencia a la variable se tiene
que anteponer al nombre de la variable el símbolo de $. Esto último se hace en la tercera
línea del guion y echo imprime el contenido de la variable en vez de la variable en sí.
Además de las variables que se puedan declarar, bash provee una serie de variables
reservadas que se podrán utilizar en el flujo interno del script. Estas variables son las
siguientes:
Variable Significado
$# Expande el número de parámetros introducidos.
$* Expande todos los parámetros introducidos.
$$ Expande el PID del proceso.
$? Expande el estado de salida del último comando introducido.
$0 Expande el nombre del script
$1-$9 Variable de posición que expande el argumento introducido
en la posición especificada.

Considere el siguiente ejemplo para comprender mejor el uso de estas variables


especiales: (crear un archivo llamado vespeciales.sh)

Lo ejecutamos y nos da el siguiente resultado:

Academy Xperts Bolivia


10
EX - LINUX EXPERTO EN LINUX. MODULO 2

Nuevamente, desde la primera línea se declara el interpretador de comandos que hay que
utilizar. En la segunda línea, se declara una variable llamada var, que será utilizada en la
cuarta línea del programa. Es en la quinta y sexta línea donde se hace referencia a las
variables especiales anteriormente demostradas. La quinta línea le informara de todos los
argumentos que le pase al script en el momento de ejecutarlo, mientras que la sexta línea
le informara del numero identificador del proceso del programa. Este es distinto al de la
línea de comandos de donde se ejecuta este script, puesto que, como se mencionó antes,
se invoca una nueva instancia de bash para ejecutar las instrucciones.
Volvamos a ejecutar pero con los parámetros uno dos tres.

Trabajar con variables result ser muy comodo una vez que haya dominado el concepto.
Una de las particularidades de las variables es que estas en realidad se expanden al valor
contenido para luego ser interpretadas por bash. De esta manera, puede contener dentro
de ellas un comando que luego pueda ejecutar.

Si guarda el código de este ultimo ejemplo en un fichero y lo ejecuta, listara todos los
ficheros de su directiorio de inicio. Esto es para demostrar que, en realidad, las variables
son reemplazados por el contenido y luego son interpretadas por bash como si fuesen
comandos. Pero, ¿de donde ha salido la variable HOME?
En todo sistema operativo, cuando inicia una sesión, existen uan serie de variables de
entorno que se asocian al usuario. La variable HOME es una de ellas y contiene el
directorio de inicio del usuario actual. Para ver todas sus variables de entorno, ejecute
env en la línea de comandos. Muchas de estas variables de entorno son simplementes
rutas a lugares predefinidos que se utilizan por programas. Por ejemplo, la instalación de

Academy Xperts Bolivia


11
EX - LINUX EXPERTO EN LINUX. MODULO 2

java le configurara la variable de entorno JAVA_HOME paraencontrar sus binarios y


librerías. Lo mismo sucede al instalar una base de datos como Oracle, que necesita
configurada la variable de entorno ORACLE_BASE y ORACLE_HOME.
Otras variables de entorno contienen otra información como opciones de configuración. Si
tiene una consola con colores, definitivamente tendrá la variable de entorno LS_COLORS
que configura los colores de ficheros para ls según sus extensiones. Otras contienen
información útil como USERNAME que contiene el nombre de ususario que esta en
sesión. Utilice estas variables para adecuar su programa al entorno del sistema operativo
siempre que le sea conveniente. El siguiente ejemplo muestra un uso en particular:

Este script saluda de una manera personalizada y sabe todo acerca del usuario que lo
ejecuta. Independientemente de quien lo ejecute, el programa se adapta usando la
información otorgada por las variables de entorno. Fijase como en la línea 5, se han
utilizado corchetes con la variable SEPARADOR. La razón es que, si se hibiese escrito
sin ellas, se hubiese interpretado de manera equivocada.
Sin corchetes queda como $HOME$SEPARADORDesktop y mientras que la intención es
concatenar en contenido de la variable SEPARADOR con la cadena de caracteres
Desktop, bash interpreta estos dos como una sola variable llamada
SEPARADORDesktop. Utilice siempre los corchetes para proteger sus variables y evitar
errores en sus programas. Problemas como estos son los que hacen perder el tiempo
buscando esa <<aguja en el pajar>>.
Otra característica interesante de las variables es poder almacenar los resultados de la
ejecución de algún otro programa. Existen dos maneras de evaluar comandos en bash,
estas son:

VARUNO=$(comando a evaluar)

VARDOS=’comando a evaluar’

El primer método es escribir el comando dentro de un par de paréntesis y


anteponiendo un signo de valor. El segundo método utiliza un par de tildes

Academy Xperts Bolivia


12
EX - LINUX EXPERTO EN LINUX. MODULO 2

inversas para encasillar el comando. Las dos expresiones son equivalentes y se


obtiene el mismo efecto. Las variables VARUNO y VARDOS contendrán el
resultado del comando evaluado. Considere el siguiente ejemplo donde se utiliza
esta práctica de diversas maneras:

Al ejecutar el script en la computadora, proveerá al usuario con información de su


sistema. La primera variable creada contiene todos los usuarios que hayan
iniciado sesión en el sistema. La expresión construida solo muestra el nombre de
usuario sin la información que lo acompaña usualmente al ejecutar w de manera
normal. Las variables de OS y CPU utilizan el método alterno con las tildes
inversas para pasar el resultado de la expresión a la variable. Para mostrar el
contenido de las variables, simplemente es necesario imprimirlo en pantalla con
el comando echo.

Condicionales en Bash

En cualquier programa, es importante estructurar el flujo de datos basándose en


condiciones de datos interpretados. Estos es normal para scripts de
administración que toman una u otra acción dependiendo del resultado de la
condición. Para hacer dichas comprobaciones, existen estrcuturas condicionales
que son comunes a varios lenguajes de programación. El mas tradicional de estos
operadores es el if, un operador que comprueba una condición. El siguiente
listado muestra la sintaxis de un bloque de código if:

Academy Xperts Bolivia


13
EX - LINUX EXPERTO EN LINUX. MODULO 2

If condición
then
comando1
comando2

else
comando3
fi

El bloque de código empieza con el operador if evaluando una condición. Si la


condición resulta verdadera, se empieza a evaluar el código dentro del bloque if.
Podría resultar que la condición es falsa, en cuyo caso no se entra a evaluar el
código perteneciente a este bloque. En este caso, se utiliza el operador else, que
especifica instrucciones alternativas al ser falsa la condición original. Habrá casos
en que el programa deberá comprobar más de una condición específica, teniendo
que encadenar varios if de la siguiente manera:

If condicion1
then
comando1
comando2
comando3
elif condicion2
then
comando1
comando2
else
then
comando1
comando2
fi

En este caso, si la primera condición resulta ser falsa, se evalua una


segunda condición mediante el operador elif. Si resulta ser verdadera, se
ejecutan las instrucciones contenidas dentro de su bloque respectivo, y si no,

Academy Xperts Bolivia


14
EX - LINUX EXPERTO EN LINUX. MODULO 2

pasa al siguiente operador else que contiene acciones por defecto.

Las condiciones deben ser valores booleanos o expresiones que se evalúen como
verdadero o falso. Puede construir estas expresiones utilizando el comando test o
escribiendo la expresión dentro de un par de corchetes ([ ]). Las expresiones
utilizaran uno o dos operandos que serán evaluados por un operador. Un ejemplo
es el siguiente:

test –f documento
[ -f documento ]

Las dos expresiones son iguales, intercambiando el uso del comando test por el
par de corchetes. Esta expresión, al ocupar el operador –f, se evalúa a TRUE si
encuentra que documento es un fichero. Otros operadores que puede utilizar se
presentan en la siguiente tabla:

Operador Explicación Numero


de
operandos
-n El tamaño del operando es distinto de 0 1
-z El tamaño del operando es igual a 0 1
-d El operando es un directorio 1
-f El operando es un fichero 1
-eq Los operandos deben ser enteros y son iguales 2
-neq Los operandos deben ser enteros y son distintos 2
= Los operandos deben ser cadenas de caracteres y son 2
iguales
!= Los operandos deben ser cadenas de caracteres y son 2
distintos
-lt El operando 1 es menor que el operando 2 y estos 2
deben ser enteros
-gt El operando 1 es mayor que el operando 2 y deben ser 2
enteros

Academy Xperts Bolivia


15
EX - LINUX EXPERTO EN LINUX. MODULO 2

-ge El operando 1 es mayor o igual al operando 2 y estos 2


deben ser enteros
-le El operando 1 es menor o igual al operando 2 y estos 2
deben ser enteros

El siguiente listado es un programa ejemplo para entender mejor como se


construyen estructuras condicionales en bash:

En la tercera línea del programa, se ocupa el operador != para comprobar que el


numero de argumentos dados es distinto de 2. Si este es el caso, se imprime en
pantalla la manera de ocupar el programa especificando que habrá que ingresar
un nombre y una edad. Esto es un comportamiento bastante común y además de
ayudar a enseñar como se ocupa el programa, se evita la ejecución del resto del
código para evitar la aparición de errores. Para detener la ejecución, en la línea 6
se ha especificado el comando exit pasándole un 1 de argumento. El comando
exit termina el proceso actual con el estado de n, donde n es el argumento dado.

Cualquier estado distinto de 0 es considerado como un estado de error. por


defecto, exit sale con estado 0, sin error.

Guarde los cambios realizados, suministre permisos de ejecución al programa y


ejecútelo para ver los resultados:

Academy Xperts Bolivia


16
EX - LINUX EXPERTO EN LINUX. MODULO 2

Al ejecutar el programa, se concatena el comando con &&. Este símbolo ejecuta


echo No hubo error si el programa miedad.sh sale con estado 0, es decir, sin
error.

La doble tubería, en cambio, ejecuta la instrucción que prosigue si no ejecuta el


comando que le antecede. Para resumir, al ejecutar el programa miedad.sh
podrá comprobar el estado de salida.

Habrá casos particulares que simplemente quiera ejecutar instrucciones para


situaciones particulares. Podría escribir una larga serie de instrucciones if, pero
existe el operador case, que resulta mucho más legible y hace justamente esto:

case $var in
opcion1)
comando1
comando2
……………
;;
opcion2)
comando1
…………
;;
*)
comando1
…………
;;
esac

Academy Xperts Bolivia


17
EX - LINUX EXPERTO EN LINUX. MODULO 2

En caso de que la variable var contenga como valor una de las opciones, se
ejecuta el código dentro de un bloque. Si ninguna opción es incluida dentro de la
variable, entonces ejecuta el código dentro del bloque de asterisco, dejando así
una acción por defecto. Considere el siguiente ejemplo para comprender mejor su
utilidad:

Bucles en Bash

El interpretador de comandos bash también provee operadores de bucles para


realizar acciones repetitivas. Estas estructuras permiten realizar acciones un
número determinado de veces ante una condición. El siguiente ejemplo muestra
la utilización del operador for, que repite la instrucción contenida en bloque para
cada argumento dado:

for var in argumento1 argumento2 argumentoN


do
comando1
comando2
…….
done

Academy Xperts Bolivia


18
EX - LINUX EXPERTO EN LINUX. MODULO 2

Este operador for es muy distinto al comúnmente utilizando en otros lenguajes


donde se ocupan contadores. En esta versión de for, el bucle guardara cada
argumento dentro de la variable var y ejecutara los comandos especificados
entre do y done. Con cada iteración ira guardando el siguiente argumento en la
variable hasta que no haya más con que trabajar. En vez de especificar
argumentos, puede utilizar el signo asterisco (*) para dar como argumento todos
los ficheros dentro del directorio actual:

Al ejecutar este ultimo ejemplo, se listan los contenidos del directorio de inicio del
usuario qie ejecuta el fichero. Se utiliza la variable de entorno HOME que existe
de manera predeterminada en la sesión del usuario. Si no tiene argumentos que
dar, utilice el bucle while, que se ocupa de la siguiente manera:

while expresión
do
comando1
comando2
…….
done

El operador while ejecutara los comandos específicos dentro del bloque mientras
la expresión se evalue como verdadera. En el momento en que se evalue como
falsa, el bucle se interrumpe y se prosigue a la siguiente instrucción. Para obtener
el efecto opuesto, ocupe until:

Academy Xperts Bolivia


19
EX - LINUX EXPERTO EN LINUX. MODULO 2

until expresión
do
comando1
comando2
……
done

El operador until hace lo contrario que while y ejecutara los comandos


especificados en el bloque hasta la expresión dad se cumpla como verdadera.
Estos tres operadores son las principales estructuras de repetición (bucle) que le
permitirán modificar una tarea en varias ocasiones en vez de copiar y pegar la
misma instrucción un millar de veces.

Funciones en Bash

Además de estructuras de control, existe la posibilidad de escribir funciones. Las


funciones serán palabras clave que ejecutaran una serie de instrucciones
predefinidas. Como en otros lenguajes, estas funciones se deben declarar al inicio
del script para poder ser utilizadas. Para declarar una función en bash, utilice la
siguiente sintaxis:

function Mifuncion()
{
Comando1
Comando2
…..
}
#utilizando la función
Mifuncion

Las instrucciones que contenga la función deben ser escritas dentro de los
corchetes. Para utilizar la función, simplemente escriba el nombre en el cuerpo de
su código y ejecutara este mismo. Las funciones tienen acceso a todas las

Academy Xperts Bolivia


20
EX - LINUX EXPERTO EN LINUX. MODULO 2

variables declaradas en el programa y lo mismo sucede a la inversa, así que


deberá tener esto en cuenta cuando declare variables dedicadas. El siguiente
ejemplo ilustra este concepto:

Al ejecutar este ultimo script, vera como MiFuncion puede acceder al contenido
de la variable var2 declarada fuera de la función. De la misma manera, la función
MiFuncion2 cambia el contenido de la variable dedicada var2. Debe estar atento
en estos casos y ser precavido al utilizar las funciones de esta manera.

Existe una excepción a la regla, y es cuando se le pasan argumentos a la función.


Se había mencionado que las variables $1 a $9 contienen los argumentos dados
al script ejecutado. Se pueden pasar argumentos a las funciones de la misma
manera, y estas variables especiales se crean nuevamente para esa función sin
afectar el contenido de las del programa en sí:

Academy Xperts Bolivia


21
EX - LINUX EXPERTO EN LINUX. MODULO 2

Este script toma un argumento y lo imprime en pantalla. Al darle un argumento a


la función, se ocupa la misma variable que contiene el argumento del script, pero
los contenidos son diferentes como puede ver cuando lo ejecuta:

Las funciones son muy útiles para contener procedimientos que se repiten dentro
del programa. Además de esto, al crear funciones que utiliza para su script,
puede reutilizar estos en otros sin tener que reescribir el código. Acostúmbrese a
crear funciones para poder hacer su código legible y ahorrarse tiempo al
desarrollar mas programas para su administración Linux.

Creando Scripts para Bash

la mejor manera de aprender es metiendo las manos en la masa. Como todo


lenguaje, hay que acostumbrarse a la sintaxis del bash y aplicarlo en situaciones
que sean de utilidad. Para entender un poco mejor todas estas estructuras y su
sintaxis, se mostraran una serie de scripts de ejemplo que le podrán ser útiles a
la hora de administrar su sistema Linux. Cada ejemplo le mostrara algunas
particularidades que le pueden resultar útiles cuando genere su propio programa
para bash.

Un script que resulta de mucha utilidad para cualquier administrador es el que


permite generar contraseñas aleatorias de un determinado tamaño. Cree un

Academy Xperts Bolivia


22
EX - LINUX EXPERTO EN LINUX. MODULO 2

archivo e introduzca el siguiente código para realizar un ejemplo:

El resultado sería el siguiente:

Otro script que le ayudara a entender el funcionamiento de los bucles y que


además le será de utilidad en su labor de administrador de sistemas podría ser
uno que realice el respaldo de un directorio. Cree un fichero e introduzca el
siguiente código:

Academy Xperts Bolivia


23
EX - LINUX EXPERTO EN LINUX. MODULO 2

Academy Xperts Bolivia


24
EX - LINUX EXPERTO EN LINUX. MODULO 2

2.1.3. Gestión de datos SQL

SQL (lenguaje de consulta estructurado) es un lenguaje que se utiliza para


obtener datos de una base de datos. En la práctica, está implementado en
diferentes productos de bases de datos. Deberíamos conocer un poco los
productos sql que hay disponibles para Linux. Instalaremos un paquete sql para
empezar a aprender sus principios y pasar seguidamente al almacenamiento y la
obtención de datos reales.

Escoger un paquete SQL

SQL es un lenguaje para acceder a la información, hay paquetes SQL específicos


que lo implementan. Esta distinción es similar a la que se hace entre un
protocolo de red y los servidores que lo implementan. En principio, podemos
utilizar cualquier paquete SQL para satisfacer las necesidades de nuestra base de
datos SQL. En la práctica, puede que determinados productos que utilicen SQL
funcionen mejor con paquetes específicos. Entre las opciones habituales en Linux
se encuentran las siguientes:

- MySQL: se ha lanzado bajo GPL. Se incluye en la mayoría de las


distribuciones que implementan MySQL en la base de datos de sus
paquetes. En una instalación completa tendremos que instalar varios
paquetes, como un cliente, un servidor y quizás herramientas de
desarrollo.
- PostgreSQL: esta implementación ha evolucionado desde el software
ingres inicial. Está disponible bajo licencia BSD y se distribuye en muchos
paquetes LInux. Es probable que tengamos que instalar un cliente, un
servidor y quizá paquetes de software adicionales, su sede es
http://www.postgresql.org.
- SQLite: es una biblioteca que implementa SQL. Como tal, no se trata de
una base de datos independientes, sino de un procedimiento para
proporcionar programas con un medio para almacenar datos utilizando una
interfaz SQL incluida en el programa. Al instalar un programa que utilice
SQLite, el gestor de paquetes debería instalar automáticamente las
bibliotecas relevantes. Si queremos escribir un programa que necesite

Academy Xperts Bolivia


25
EX - LINUX EXPERTO EN LINUX. MODULO 2

acceder a bases de datos y no queremos instalar un paquete cliente


servidor completo, SQLite es justo lo que necesitamos.

Para este curso instalaremos y administraremos el SQLite, un administrador de


base de datos liviano que no necesita un servidor de configuración y es liviano
que funciona en dispositivos móviles.

Fundamentos de las bases de datos

SQL es una herramienta para acceder a bases de datos relacionales. La siguiente


figura corresponde a una base de datos relacional. Cada fila o tupla representa un
único objeto, cada columna (también atributos o campos) representa una
característica específica. A la combinación de filas y columnas se la conoce como
tabla. Una base de datos puede tener varias tablas y SQL admite varias bases de
datos. Si queremos acceder a los datos, deberemos escoger una base de datos y
una tabla. Los datos de una tabla no están ordenados, pero podemos imponer un
orden al resultado de las consultas.

6406966 CB JUAN PEREZ 14


1234567 SC GUIDO MILIVOY 35
9876543 CB VIVIAN ORTEGA 31
9516234 TJ NOELIA OLMOS 45
7418525 CB VICTOR MENDIETA 86

Una base de datos permite recuperar datos que coincidan con un criterio
específico. Por ejemplo, podemos buscas aquellas extensiones de carnet que
terminen en CB. También podemos insertar, borrar y actualizar la información de
una tabla. Las columnas de una base de datos contienen tipos de datos
específicos, por lo que no tiene mucho sentido intercambiarlos. Las restricciones
relacionadas con lo que puede aparecer en una columna se conocen como
dominio o tipo de dato.

Academy Xperts Bolivia


26
EX - LINUX EXPERTO EN LINUX. MODULO 2

Nombre del tipo


Finalidad
de dato

INTEGER o INT Valor entero de 4 bytes

SMALLINT Valor entero de 2 bytes

DECIMAL Almacenamiento preciso de valores decimales

NUMERIC Almacenamiento preciso de valores decimales

FLOAT Número en coma flotante

DOUBLE Número en coma flotante almacenado con el doble


PRECISION de precisión que FLOAT

DATETIME Una fecha y una hora

DATE Una fecha

Una hora en formato HH:MM:SS, puede ser un momento


TIME
del día o un periodo de tiempo

CHAR Uno o mas caracteres

VARCHAR Un número variable de caracteres

ENUM Una lista enumerada, como pequeño, medio y grande

Datos que pueden coincidir con 0 o más valores, como


SET nueces, caramelo, glase o cerveza como valores para el
aderezo de un helado.

Academy Xperts Bolivia


27
EX - LINUX EXPERTO EN LINUX. MODULO 2

Existen otros tipos de datos pero esta lista solo ofrece algunos de los tipos con los
que nos encontraremos. Hay implementaciones que poseen tipos de datos
exclusivos. Cada tipo de dato posee sus propias características, por ejemplo, los
tipos de datos numéricos se pueden manipular mediante operadores
matemáticos.

Primeros pasos con SQLite

Para iniciar y entrar a SQLite digitamos primeramente lo siguiente:

Y nos tiene que aparecer el promt del manejador de BD SQLite. Para ver las
bases de datos que hay en SQLite ejecutamos el siguiente comando:

Crear base de datos y tablas

Para crear primeramente una base de datos ejecutamos los siguientes comandos:

Academy Xperts Bolivia


28
EX - LINUX EXPERTO EN LINUX. MODULO 2

Si hacemos .databases nos mostrara la base creada. Luego procedemos a crear


la tabla alumno de la siguiente manera:

Instalar SQLite

Primeramente verificamos si tenemos instalado SQLite, ejecutamos el siguiente


comando:

Si al ejecutar no encontramos tenemos que instalar por el gestor de paquetes


yum, con el siguiente comando:

Si con el gestor de paquetes no hay el paquete sqlite, se tiene que proceder a


descargar el código fuente y compilar el sqlite.

Y verificamos si la tabla ha sido creada con el comando .tables

Academy Xperts Bolivia


29
EX - LINUX EXPERTO EN LINUX. MODULO 2

Insertar filas

Para poder insertar datos en la tabla alumno de la base de datos curso_linux se


realiza con el comando INSERT INTO, a continuación mostramos un ejemplo:

Para poder actualizar datos de la tabla se utiliza el comando UPDATE, por


ejemplo si queremos cambiar la edad del alumno con el carnet 6406966 seria de
la siguiente manera:

Recuperar datos

La esencia de la base de datos es poder recuperar su información, lo que se hace


utilizando el comando SELECT, cuyo poder reside en su capacidad para aceptar
especificaciones sobre qué se debe seleccionar. Podemos utilizar varias palabras
clave para seleccionar datos que coincidan con distintos criterios. La forma global
de SELECT se puede describir de la siguiente manera.

SELECT campo(s) FROM tabla [ WHERE condiciones ] [ ORDER BY campo]

Anteriormente hemos utilizado SELECT con un asterisco ( * ) en lugar de los


campos, esto hace que el comando devuelva todas las columnas de la tabla.
También podemos especificar la columna de las tablas que queremos que se
muestre:

Academy Xperts Bolivia


30
EX - LINUX EXPERTO EN LINUX. MODULO 2

El criterio campos se incluye como una lista de columnas separadas por comas ( ,
). Las condiciones de WHERE ofrecen un modo más interesante de recuperar
datos. Podemos utilizar estas condiciones para recuperar datos específicos de
varias maneras:

- Coincidencia exacta: utilizando un nombre de columna, un signo de


igualdad ( = ) y un valor a comparar, sólo se devolverán aquellas
columnas que coincidan con el valor especificado. Por ejemplo, SELECT *
FROM alumno WHERE expedito=’cb’; devolverá los alumnos que tengan el
ci expedito en cb.

- Comprobaciones numéricas: podemos obtener los datos que coincidan con


un determinado criterio numérico. Por ejemplo, SELECT * FROM alumno
WHERE edad>=86.

- Comprobaciones alfabéticas: Los operadores mayor que ( > ) y menor que


( < ) funcionan tanto con letras como con números, lo que permite
recuperar datos en función de la primera letra de una cadena. Por ejemplo,
SELECT * FROM alumno WHERE nombre>=’v’; permite recuperar los
registros cuyo nombre comience por b o las letras siguientes del alfabeto.

Academy Xperts Bolivia


31
EX - LINUX EXPERTO EN LINUX. MODULO 2

- Varias pruebas: podemos combinar varios criterios utilizando los


operadores AND y OR. Por ejemplo, SELECT * FROM alumno WHERE
nombres>=’V’ AND edad>80;

Combinar datos de varias tablas

Una base de datos contiene varias tablas, lo que permite crear tablas para
funciones diferentes. Por ejemplo podríamos tener una base de datos con
características de materias y alumnos, las cuales ambas tablas deben tener al
menos 1 campo similar características para poder emparejar y combinar. Por
ejemplo tengamos la tabla materia donde este el carnet del estudiante y las
materias que tomo con su respectivo promedio, más o menos así:

ci Nombre_materia Promedio
6406966 LINUX 100
6406966 TELEFONIA IP 100
1234567 LINUX 50
6406966 REDES 70
1234567 CABLEADO 80
9876543 LINUX 95
9516234 CABLEADO 60
7418525 TELEFONIA IP 20
9876543 TELEFONIA IP 20
7418525 LINUX 20

Academy Xperts Bolivia


32
EX - LINUX EXPERTO EN LINUX. MODULO 2

Para realizar este punto, tenemos que crear la tabla materia de la siguiente
manera:

La cual llenaremos con los siguientes valores:

Una vez introducido realizaremos una prueba, quisiéramos saber las materias que
están tomando cada alumno seria la siguiente consulta:

Academy Xperts Bolivia


33
EX - LINUX EXPERTO EN LINUX. MODULO 2

Pero si lo ordenamos un poco la consulta y solo queremos ver el número de ci,


nombres y apellidos, nombre de las materias seria lo siguiente:

También podemos agrupar con la sentencia GROUP BY, por ejemplo quisiéramos
saber cuántas materias tomo un alumno y el promedio de sus notas de cada
materia seria así:

Borrar datos

En ocasiones necesitaremos borrar datos. La tabla anterior indica que el árbol del
patio está enfermo y, si optamos por cortarlo, tendremos que eliminarlo de la
base de datos. Para ello utilizaremos el comando DELETE que recibe la siguiente
información:

DELETE FROM tabla WHERE condiciones

Veamos si queremos borrar al alumno 9516234, seria de la siguiente forma:

Academy Xperts Bolivia


34
EX - LINUX EXPERTO EN LINUX. MODULO 2

Y para borrar toda la tabla de materia se ejecuta de la siguiente manera:

________________________________________
Tema 2.2: Tareas de administración

2.2.1. Gestionar cuentas de usuario y de grupo, y los ficheros de sistema


relacionados.

Linux es un sistema multiusuario que tiene el poder de gestionar los controles de


privacidad a un nivel granular. La capacidad de ser un sistema multiusuario
también permite que las aplicaciones y programas tengan su propio usuario
asignado en el momento de ejecutarse. Debido al gran número de usuarios que
podrían existir en cualquier momento dado, la gestión de usuario y grupos en
Linux es un conocimiento útil para toda persona entusiasta del sistema operativo.

El sistema de ficheros de linux está fuertemente atado a un modelo de seguridad


orientado a usuario y grupos. Las características de seguridad permiten una
filosofía de privilegios minimos indispensablesen el momento de trabajar tanto en
la computadora misma como en toda la red. Esta gestión de permisos para los
administradores es un conocimiento indispensable y una de las características
que más se valora en Linux.

Los usuarios en linux

Todas las cuentas de usuarios se guardan en /etc/passwd. Antiguamente, había


que modificar el fichero manualmente con un editor de texto para añadir
usuarios, pero hoy en día existen programas automatizados para realizar esta

Academy Xperts Bolivia


35
EX - LINUX EXPERTO EN LINUX. MODULO 2

tarea. Este fichero contiene toda la información necesaria para empezar una
sesión en Linux. Este fichero tiene permisos de lectura para todos. Si abre este
fichero, se puede encontrar con algo similar a lo siguiente:

Cada línea contiene una información particular perteneciente a los distintos


usuarios de la computadora. Considere el usuario root:

Academy Xperts Bolivia


36
EX - LINUX EXPERTO EN LINUX. MODULO 2

Cada campo está separado por dos puntos. La información que detallan los
campos se interpreta de la siguiente manera:

root El nombre del usuario. Esta cuenta debe ser única en la maquina
local.
x Campo de contraseña. En el pasado aquí es donde se guardaba la
contraseña cifrada, pero ahora se prefiere el uso del fichero
/etc/shadow, la x marca que existe una contraseña.
0 Campo correspondiente al identificador de usuario (o comúnmente
referido como UID de User Identification). Este identificador es único
en la computadora y se ocupa de mantener un rastro de que archivos
pertenecen en la cuenta.
0 Este valor corresponde al identificador del grupo (comúnmente
referido como GID, siglas de Group Identification). Este identificador
es único en la computadora y se ocupa de mantener un rastro de que
archivo pertenecen a ese grupo particular.
root Este campo es netamente descriptivo.
/root Contiene el directorio de inicio del usuario. Cada vez que inicie una
sesión en la computadora, comienza a trabajar dentro de este
directorio.
/bin/bash Este campo contiene la consola por defecto que ocupa el usuario para
ejecutar instrucciones en la computadora.

El fichero donde guarda las contraseñas es /etc/shadow y el siguiente listado


muestra el contenido del fichero shadow que acompaña al listado previo de
usuarios:

Academy Xperts Bolivia


37
EX - LINUX EXPERTO EN LINUX. MODULO 2

Como podrá notar, este fichero se asemeja a la estructura de /etc/passwd, pero


con algunas diferencias que se destacaran con el siguiente listado. A continuación
explicaremos cada campo de usuario root:

root El nombre de la cuenta de usuario


$6$7IV4 Contraseña cifrada. Este es el hash resultante al pasar la
RYKU$J7 contraseña por el método de encriptación de MD5.
oyrS9HFz
3/.hR2ac
70KT5J1
MFBIU
17053 Ultimo cambio de contraseña.
0 Este campo representa el mínimo número de días hasta que se
permita un cambio. El valor 0 permite modificar siempre que desee.
99999 Este valor representa un máximo valor de días para exigir un
cambio de contraseña

Academy Xperts Bolivia


38
EX - LINUX EXPERTO EN LINUX. MODULO 2

7 Este valor representa el máximo número de días hasta que se exija


el cambio. Si este número es menor que el mínimo número de días
que se permita el cambio, entonces no se puede modificar la
contraseña. Si transcurrido este tiempo no se modifica la
contraseña, entonces la cuenta de usuario se deshabilita.
- Este campo (que está en blanco) guarda el valor para el número de
días de aviso de caducidad.
- Este campo (que está en blanco) almacena el número de días que
se tiene antes de desactivar la cuenta.
- Este campo (que está en blanco) puede especificar una fecha de
caducidad, indicando para cuanto tiempo se ha creado la cuenta.

Lo primero que se puede apreciar en estos ficheros es la existencia de numerosos


usuarios. En la administración del sistema, debe de tener en mente tres tipos
principales de cuenta:

- Cuenta de usuario root. El superusuario antes mencionado.


Normalmente se y llama root, pero no tiene por qué ser así. Puede
acceder a todos los archivos y solo el root puede ejecutar ciertos
programas. Por ejemplo, solo root puede levantar servicios demonio, como
el servidor web, puesto que este debe estar la escucha en el puerto 80
(que es privilegiado). El root tiene una UID de 0. Cualquier cuenta de
usuario que posea UID 0 posee una cuenta root.
- Cuenta normal. La cuenta de usuario normal es aquella que se utiliza
para validarse en el sistema. La mayoría de los de este tipo de usuarios
usan de directorio de inicio en /home. No es necesario que se le asocie
una consola de comandos /bin/bash, puede tener asociada la consola
/bin/false.
- Cuenta de sistema. Las cuentas de sistema son usuarios virtuales,
creados para propósitos específicos del sistema operativo. Estas cuentas
no pueden validarse en el sistema de manera normal y no tienen
directorios de inicio. Un usuario común bajo esta categoría es nobody. Los
UID en estos casos son por debajo de los usuarios normales. Los rangos

Academy Xperts Bolivia


39
EX - LINUX EXPERTO EN LINUX. MODULO 2

más altos son reservados también para cuentas especiales como nobody,
que tiene un UID de 65534.

Grupos de Linux

Además de tener usuarios, Linux sabe cómo administrar grupos. Por qué las
redes informáticas están hechas para colaborar en equipo, para lograr tareas
en común, resulta bastante cómodo agrupar a varios usuarios bajo un solo
grupo para administrar mejor controles de acceso a recursos de la red de
trabajo. Los grupos de Linux son guardados en el fichero /etc/group.
Seguidamente tenemos un ejemplo resumido del archivo:

Al igual que los ficheros ocupados para los usuarios y las contraseñas, cada
línea contiene datos sobre un grupo específico. Considere la última línea de
este fichero. A continuación daremos una explicación de que significa cada
campo:

Academy Xperts Bolivia


40
EX - LINUX EXPERTO EN LINUX. MODULO 2

users El nombre del grupo


X La contraseña cifrada del grupo. Si
esta vacia, no hay contraseña; si
contiene una x, la contraseña debería
de estar en /etc/gshadow.
100 El numero identificador del grupo,
comúnmente referido como el GID
(Group Identification)
mail,postfix,opendkim Este último campo contiene una lista
separada por comas de nombres de
usuario que pertenecen al grupo
descrito.

Gestión de usuarios

Como se ha mencionado anteriormente, la generación de usuarios se puede


lograr modificando los ficheros especificados. La idea, sin embargo, es que la
administración de usuarios sea un poco más ágil y automática. Linux cuenta
con un conjunto de herramientas que automatizan esta tarea que vienen
incluidas en los que se conoce como Shadow Suite.

Añadiendo cuentas de usuarios

Para añadir usuarios al sistema se puede ocupar el comando useradd. El


comando viene con varios parámetros útiles para poder especificar las
características de cada usuario. El comando requiere de privilegios root para
su uso. Se puede utilizar bien su o sudo para lograr esto. El siguiente ejemplo
muestra la ejecución del comando con las opciones más comunes:

A continuación se muestra una pequeña explicación de cada switch y


argumento:

Academy Xperts Bolivia


41
EX - LINUX EXPERTO EN LINUX. MODULO 2

-g users Hace que el grupo principal del


usuario sea users
-G video, dialout Hace miembro al usuario de los
grupos video y dialout
-u 1004 Crea al nuevo usuario con un ID 1004
-c “Usuario Nuevo” Añade como comentario.
-s /nin/bash Asigna /bin/bash como la Shell del
usuario
-m Crea el directorio de inicio para el
usuario
Usuario Nombre de la nueva cuenta de
usuario.

Se puede comprbar el resultado verificando la cracion de la siguiente línea en


/etc/passwd:

Nótese que el grupo principal del usuario relaciona con el GID que acompaña
al nombre del grupo. Además de esto, el argumento –m crea
automáticamente el directorio personal del usuario llamado de la misma
manera que la cuenta en /home. Este directorio seria creado copiando todo el
contenido de /etc/skel, que es el directorio que por standard contiene ficheros
de configuración tanto como directorios estándar para usuarios del sistema.
También se puede verificar que se haya añadido el nuevo usuario a los grupos
especificados:

video:x:39:usuario

dialout:x:18:usuario

lo único que faltaría es generar una contraseña. La línea que acompaña al


usuario en /etc/shadow fue creada, pero, en vez de almacenar una
contraseña cifrada, contiene un signo de exclamación:

Academy Xperts Bolivia


42
EX - LINUX EXPERTO EN LINUX. MODULO 2

Si el usuario trata de validarse, el sistema no se lo permite. Para crear una


contraseña cifrada se puede ocupar el comando passwd dándole como
argumento el nombre de usuario:

Modificando cuenta de usuario

Una vez creada una cuenta, se puede modificar las características de las
cuentas de usuario simplemente modificando los ficheros mencionados
previmanete. De nuevo, esto puede llegar a ser tedioso si se decide hacerlo
con un editor de texto. Esto se puede lograr de manera automatizada
ocupando el comando usermod. Si se quiere por ejemplo bloquear una
cuenta para que no se pueda validar al sistema, se puede ejecutar de la
siguiente manera:

Si la cuenta usuario se trata de validar ahora, se encontrara constantemente


con un mensaje de error. Si se revisa el contenido del campo de la

Academy Xperts Bolivia


43
EX - LINUX EXPERTO EN LINUX. MODULO 2

contraseña, se encuentra con lo siguiente:

El comando añade al inicio de la contraseña cifrada un signo de exclamación.


Este deniega a la cuenta de usuario validarse con su contraseña. Para poder
desbloquear la cuenta, ejecute lo siguiente:

Otra modificación que es común es cambiar el nombre de la cuenta. Linux en


realidad asocia el número UID y el nombre de la cuenta, que es
perfectamente modificable. El siguiente comando cambia el nombre de la
cuenta y el comentario asociado a ella:

Como se puede ver, el nombre de la cuenta usuario ha sido cambiando al


igual que el comentario asociado y también el directorio de inicio de la cuenta.

Borrando las cuentas de usuario

Cuando se quiere borrar la cuenta de algún usuario, se puede recurrir a los


comando userdel. Esta utilidad se encargara de borrar las líneas
pertenecientes al usuario que se le dan como argumento.

Academy Xperts Bolivia


44
EX - LINUX EXPERTO EN LINUX. MODULO 2

Gestión de grupos

La gestión de grupos ayuda a mejorar la organización de permisos y accesos a


diversos recursos. Una tarea muy común en empresas, por ejemplo, es crear
un directorio compartido para los usuarios de una red. Se le asignara un
usuario propietario y un compartido para los usuarios de una red. Se le
asignara un usuario propietario y un grupo de trabajo. Los dos tienen
permisos diferentes. Para que otro usuario pueda optar a ocupar este recurso
de trabajo, se le debe añadir como miembro al grupo asignado del directorio.
Como se ha visto anteriormente, un usuario puede permanecer a múltiples
grupos con simplemente agregar su nombre en línea adecuada del fichero
/etc/group. Obviamente existen mejores maneras y más automáticas para
lograr esto.

Añadiendo un grupo

Para poder crear un grupo, existe el comando groupadd. Toma como


argumento un nombre, para el nuevo grupo será creado. Genera el GID y
añade el nuevo grupo al fichero /etc/group:

En el ejemplo anterior muestra la simplicidad del comando. Para ser miembro


de el, se puede ocupar nuevamente el comando usermod para indicar de que
grupos un usuario puede ser parte:

Academy Xperts Bolivia


45
EX - LINUX EXPERTO EN LINUX. MODULO 2

Trabajando con varios grupos

Un usuario puede pertenecer a varios grupos y puede operación los recursos


que sean propiedad de ese grupo con los permisos que tenga asignados. Pero,
para ciertas operaciones como creación de ficheros nuevos o al lanzar un
proceso, el grupo que se asigna es el grupo principal del usuario. Se puede
ver a que grupos pertenece uno mismo con el comando group. El primer
grupo que se lista es el grupo principal de ese usuario. El siguiente listado
muestra un caso práctico:

En este caso, se muestra como dos diferentes usuarios pueden diferir en


cuanto a sus distintos roles en la red. Mientras que el usuario abel se
relaciona con el grupo curso_linux, el usuario root prefiere mantenerse
alejado y tiene su propio grupo de igual nombre que su cuenta. Cada ves que
root crea un fichero, este tendrá root como el grupo asociado a la cuenta. Si
el fichero root quisiera crear ficheros asignados al grupo curso_linux, tendrá
que hacer lo siguiente:

Academy Xperts Bolivia


46
EX - LINUX EXPERTO EN LINUX. MODULO 2

Si abel tiene ganas de entrar en un directorio de root, puede añadirse al


grupo por una sesión ocupando el mismo comando. Al no pertenecer a este
grupo, se le pedirá contraseña si es que tuviera:

Solo el ususario root puede asignar una contraseña al grupo. Al igual que las
contraseñas de usuario, esta esta encriptada y se guarda en el campo de
contraseña en /etc/group. La contrasela se encuentra dentro del fichero
/etc/gshadow. Para crear la contraseña, como root, ejecute el comando
gpasswd:

Añadiendo un usuario a un grupo en el root.

Borrando un grupo

Una vez que un grupo ya deje de tener validez, se puede borrar este de la
misma manera que las cuentas de usuario. Para esta tarea, se cuenta con el
comando groupdel. Es importante destacar que solo la cuenta de usuario
root puede borrar una cuenta:

Academy Xperts Bolivia


47
EX - LINUX EXPERTO EN LINUX. MODULO 2

2.2.2. Automatizar tareas de administración del sistema mediante


tareas programadas

Hay tareas de mantenimiento que se deben realizar en intervalos regulares y


están muy automatizadas. Linux posee un medio para planificar tareas de
modo que se ejecuten en momentos específicos, el programa cron que
ejecuta lo que se denomina tareas cron. Está relacionado con la herramienta
at que sirve para ejecutar un comando una vez en un momento futuro
especificado, sin embargo, cron lo hace de manera periódica.

El papel de cron

cron es un demonio y se ejecuta continuamente buscando eventos que le


hagan ponerse en acción; responde a eventos temporales, examina los
ficheros de configuración de los directorios /var/spool/cron y /etc/cron.d y el
fichero /etc/crontab una vez por minuto, ejecutando los comandos
especificados en estos ficheros si la hora coincide con la que figura en ellos.

Hay dos tipos de tarea cron:

- Las tareas cron del sistema: se ejecutan como root y llevan a cabo tareas
de mantenimiento en todo el sistema. La mayoría de distribuciones
incluyen tareas cron que eliminan los ficheros antiguos de /tmp.

Academy Xperts Bolivia


48
EX - LINUX EXPERTO EN LINUX. MODULO 2

- Las tareas cron de los usuarios: podrían ejecutar ciertos programas del
usuario de manera regular. Podemos crear una tarea cron de usuario como
root si necesitamos realizar alguna en un momento no contemplado por las
tareas cron del sistema.

Unos de los puntos críticos de las tareas cron es que se ejecutan sin
supervisión, por lo que no deberíamos llamar a ninguna tarea de ningún
programa que requiera la entrada del usuario.

Crear tareas cron del sistema

El fichero /etc/crontab controla las tareas cron del sistema, suele comenzar
con varias líneas que definen variables de entorno como $PATH y $MAILTO.
Sus líneas tienen el siguiente aspecto:

02 4 * * * root /etc/curso_linux.sh

La línea comienza con cinco campos que especifican el tiempo: minutos (0-
59), horas (0-23), día del mes (1-31), mes (1.12) y día de la semana (0-7,
tanto 0 como 7 corresponden con el domingo). Tanto para el mes como para
el día de la semana, podemos utilizar las tres primeras letras del nombre en
lugar de un número.

Academy Xperts Bolivia


49
EX - LINUX EXPERTO EN LINUX. MODULO 2

Podemos especificar varios valores de distintas maneras:

- Un asterisco (*) coincide con todos los valores posibles.


- Una lista separada por comas (0, 6, 12, 18) coincide con cualquiera de los
valores especificados.
- Dos valores separados por un guion (-) indican un rango con los valores de
los extremos incluidos (como 9-17).
- Cuando se utiliza una / junto a otras opciones de multiples valores, se
están especificando valores escalonados, es decir, la distancia que hay
entre los valores indicados. Por ejemplo, un */10 en los minutos indica una
tarea que se ejecuta cada diez minutos.

Tras los primeros cinco campos, las entradas siguen con el nombre de la
cuenta a utilizar cuando se ejecute el programa (root en este ejemplo) y el
comando a ejecutar; en este ejemplo, /etc/curso_linux.sh. El ejemplo anterior
ejecuta todos los scripts de /etc/curso_linux.sh a las 4:02 AM de cada día. La
mayoría de distribuciones incluyen tareas cron del sistema que se ejecutan
cada mes, día, semana y hora; tienen sus scripts en el directorio
/etc/cron.intervalo, donde intervalo es una palabra asociada con la frecuencia
de ejecución. Otras distribuciones utilizan los directorios /etc/cron.d/intervalo.

Para crear una tarea cron del sistema, crearemos un script para que realice la
tarea deseada y lo copiaremos en el directorio /etc/cron.intervalo apropiado.
Cuando se vuelva a leer el contenido del directorio, cron ejecutara el script.
Debemos comprobar que el script funciona correctamente antes de añadirlo
como una tarea cron, especialmente si dicha tarea se ejecuta cuando no
estemos cerca.

Si necesitamos ejecutar una tarea cron con un intervalo de tiempo no


contemplado en /etc/crontab, podremos modificar este fichero para añadir la
hora de ejecución de la tarea cron deseada o bien crear una tarea cron del
usuario. Si decidimos modificar la tarea en crontab, lo haremos a partir de una
entrada existente, cambiando las horas y el directorio de almacenamiento del
script según nuestras necesidades. El propietario de los directorios que
almacenan tareas cron del sistema debe ser root, sólo él debe tener permiso

Academy Xperts Bolivia


50
EX - LINUX EXPERTO EN LINUX. MODULO 2

para escribir en dichos directorios.

Crear tareas cron del usuario

Se crean empleando la utilidad crontab, que no debemos confundir con el


fichero /etc/crontab. Su sintaxis es la siguiente:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

Si se proporciona el parámetro -u usuario, se modifica la tarea cron asociada


con el usuario actual. Puede resultar confuso si combinamos crontab con su
para cambiar la identidad actual del usuario, por lo que es más seguro utilizar
-u usuario incluso cuando modifiquemos nuestras propias tareas cron.

Para trabajar directamente con una tarea cron utilizaremos -l, que muestra la
tarea cron actual, -r elimina la elimina y -e que abre un editor para poder
modificarla (por defecto suele ser vi). También podemos crear un fichero de
configuración de la tarea cron y pasarle el nombre del fichero a crontab, por
ejemplo, crontab -u user mi_tarea_cron. El formato del fichero cron es
similar al formato del fichero crontab. En una tarea cron del usuario no
tenemos por qué especificar el nombre del usuario que la ejecuta, al contrario
de lo que se hace con las tareas cron del sistema. La información se deduce
del propietario de la tarea.

Los ficheros de tareas cron se almacenan en los directorios /var/spool/cron,


/var/spool/cron/tabs y /var/spool/cron/crontabs. Cada fichero contenido en
uno de estos directorios recibe el nombre del usuario con el que se ejecuta.
No deberíamos modificar directamente los ficheros de estos directorios sino
utilizar crontab. El acceso a los recursos cron se puede restringir de varias
maneras

- Permisos de ejecución: podemos restringir los programas cron y crontab


con los mecanismos de permisos estándar de Linux. Hay distribuciones que
se configuran para que si queremos que un usuario pueda programar
tareas cron, se debe añadir al grupo adecuado, que se suele llamar cron.

Academy Xperts Bolivia


51
EX - LINUX EXPERTO EN LINUX. MODULO 2

Nos aseguraremos de ello consultando los permisos y el propietario del


grupo de los ficheros de programa /usr/sbin/crond y /usr/bin/crontab.
- Lista de usuarios permitidos: /etc/cron.allow contiene una lista de los
usuarios a los que se les permite el acceso a cron. Si existe este fichero,
sólo los usuarios que figuren en el podrán utilizar cron, los demás tendrán
el acceso denegado. Si el fichero no existe, cualquier usuario podrá utilizar
cron a no ser que restrinjamos el acceso mediante permisos de ejecución o
una lista de usuarios rechazados.
- Lista de usuarios rechazados: /etc/cron.deny contiene una lista de usuarios
que deberían tener denegado el acceso a cron. Si existe el fichero, los
usuarios que aparezcan en él, no podrán acceder a cron, pero los demás
sí, siempre que los permisos de ejecución y la lista de usuarios permitidos
no restrinjan el acceso.

Uso de anacron

cron es una buena herramienta para realizar tareas como rotar los ficheros de
registro en sistemas que están activos la mayor parte del tiempo, pero es
menos útil en sistemas que se apagan con frecuencia como ordenadores
portátiles o PC, ya que en este tipo de equipos no se suelen ejecutar las
tareas cron nocturnas, algo que puede saturar los ficheros de registro, crear
confusión en /tmp y otros problemas.

Una solución es utilizar anacron, que está concebido como un suplemento


para cron. anacron asegura que las tareas de mantenimiento regular se
ejecuten en intervalos razonables. Guarda un registro de los programas que
se deberían ejecutar y la frecuencia en días con la que deberían hacerlo.
anacron comprueba cuándo se ejecutaron por última vez los programas que
debe controlar, según su configuración. Si el periodo de tiempo transcurrido
es superior al intervalo de ejecución del programa, anacron ejecuta el
programa. Esto nos permite reconfigurar las tareas cron normales como
tareas anacron, asegurándonos así de que se ejecutarán incluso en los
sistemas que se apagan con regularidad.

anacron se controla a través del fichero /etc/anacrontab, que consta de tres

Academy Xperts Bolivia


52
EX - LINUX EXPERTO EN LINUX. MODULO 2

tipos de líneas:

- Líneas de comentario: denotadas por una almohadilla (#) inicial.


- Asignaciones de variables de entorno: por ejemplo, SHELL=/bin/bash.
- Líneas de definición de tareas: este tipo de líneas contiene cuatro
campos: periodo retardo identificado comando

Periodo es la frecuencia en días con la que se debe ejecutar el comando.


Retardo es el periodo en minutos que transcurre entre el inicio de anacron y el
momento en que se ejecuta el comando, algo pensada para que no se
sobrecargue el sistema si anacron tiene que ejecutar muchos comandos
cuando se inicia. Identificador es una cadena que identifica al comando. Por
último, comando es el comando a ejecutar, que puede ser un nombre de
comando o script, seguido opcionalmente de los parámetros que pueda
recibir.

A continuación se muestra un fichero /etc/anacrontab que define un par de


variables de entorno, una definición para que se ejecute el comando run-
parts, ademas de un comentario:

Academy Xperts Bolivia


53
EX - LINUX EXPERTO EN LINUX. MODULO 2

Para que esto funcione hay que llamar a anacron, lo que se suele hacer de
una de estas dos maneras:

- Mediante un script de inicio: podemos crear un script de inicio que


ejecute anacron y configurarlo para que se ejecute desde nuestro modo de
ejecución normal. Como alternativa, podemos colocar una llamada a
anacron en un script de inicio local, /etc/rc.d/rc.local en Fedora o RedHat
,o /etc/boot.d/boot.local en Suse.
- Mediante una tarea cron: podemos crear una tarea cron que ejecute
anacron. Normalmente, esta llamada reemplazará las entradas normales
de las tareas cron en /etc/crontab. Probablemente, deseemos llamar a
anacron con una frecuencia diaria o superior.

El método de script de inicio se utiliza preferiblemente en sistemas que se


apagan e inician con frecuencia. El inconveniente de este método es que
puede repercutir negativamente en el rendimiento cuando se inicia el sistema
cuando anacron tenga que ejecutar una tarea que consuma tiempo. Llamar a
anacron desde una tarea cron desplazará la carga a las horas de menor
ocupación, pero si cron puede ejecutar anacron de manera fiable, entonces las
tareas de anacron se pueden trasladar a cron. Las tareas cron se utilizan con
frecuencia en sistemas que se dejan funcionando por la noche, asegurando
que anacron y las tareas que controla se ejecutan con frecuencia.

Como alternativa, podemos llamar a anacron con una frecuencia superior a


una vez al día. Otra opción es hacer que cron llame a anacron durante el
descanso del usuario para evitar la interrupción causada por cualquier
programa. Independientemente de cómo ejecutemos anacron, tendremos que
desactivar cualquier tarea cron que esté ahora controlada por anacron, de lo
contrario la tarea se llevará a cabo dos veces y cargará el sistema
innecesariamente. anacron mide sus intervalos de ejecución en días, por lo
que no sirve para ejecutar tareas cron cuya frecuencia sea de horas. No
deberíamos eliminar las tareas cron de este tipo cuando configuremos cron
para adaptarlo a anacron.

Academy Xperts Bolivia


54
EX - LINUX EXPERTO EN LINUX. MODULO 2

Uso de at

at permite ejecutar un único comando en un momento específico del futuro


una sola vez en lugar de hacerlo regularmente, supone un despliegue menor
que cron y anacron. Normalmente, recibe una única opción (aunque también
se puede ajustar este comportamiento): una hora. Esta hora puede adoptar
varias formas:

- Una hora del día: podemos especificar la hora del día como HH:MM
seguida opcionalmente por AM o PM si utilizamos un formato de 12 horas.
Si la hora especificada ya ha pasado, la operación se ejecutará al día
siguiente.
- noon (mediodía), midnight (medianoche) o teatime (la hora de té):
estas tres palabras se explican por si solas, la hora del té son las 4 PM.
- Un día específico: podremos planificar una tarea at con más de 24 horas
de antelación especificando el día tras la hora del día. Para ello se emplea
el siguiente formato MMDDAA, MM/DD/AA o DD.MM.AA. Otra opción sería
especificar la fecha como nombre del mes día año.

Un periodo futuro especificado: podemos especificar un momento utilizando la


palabra clave now (ahora), un signo de la suma (+) y un periodo temporal,
como en now + 2 para ejecutar una tarea en 2 horas.

at depende del demonio atd, si el sistema no lo inicia automáticamente


puede que tengamos que configurar un script de inicio SysV para que lo haga.
Cuando ejecutemos at y le especifiquemos una hora, el programa responderá
con su propio prompt, at>, que trataremos igual que el prompt de bash u otra
consola de comandos. Cuando finalicemos, pulsaremos Control+d para
abandonar este prompt. Otra opción es pasarle a at un fichero de comandos
con el parámetro -f, como en at -f comands.sh noon, que ejecutará el
contenido de comands.sh al medio día.

at posee varias herramientas de soporte, una de ellas es el demonio atd que


debe estar iniciado para que at haga su trabajo. Otro programa de soporte es
atq, que lista las tareas de at pendientes. atrm elimina una tarea at de la cola

Academy Xperts Bolivia


55
EX - LINUX EXPERTO EN LINUX. MODULO 2

y batch que funciona de un modo similar a at pero que ejecuta las tareas
cuando el nivel de carga del sistema baja de 0,8. Estas utilidades son muy
sencillas, a atq le basta con que le escribamos su nombre. Para utilizar atrm
sólo tendremos que pasarle el número de tarea atque devuelve atq.

at permite restricciones similares a las de cron. Los ficheros /etc/at.allow y


/etc/at.deny funcionan exactamente igual a los ficheros /etc/cron.allow y
/etc/cron.deny. at posee algunas peculiaridades, si no existe ninguno de estos
dos ficheros, sólo root puede utilizar at. at.allow lista los usuarios que tienen
acceso a at, si at.deny existe, entonces tendrán acceso todos los usuarios
excepto los recogidos en este fichero.

Esta seguridad más restrictiva hace que el programa rara vez se instale con
permisos de ejecución restrictivos, aunque podemos utilizar los permisos del
fichero del programa para denegar a los usuarios normales la posibilidad de
ejecutar at si queremos una capa adicional de seguridad.

2.2.3. Localización e internacionalización

Linux es un SO internacional y sus desarrolladores y usuarios están dispersos


por el mundo. Incluye una amplia variedad de conjuntos de caracteres,
teclados, formatos de visualización de fecha y hora y características que
varían de una región a otra. Muchas de estas características se definen
durante la instalación, pero conocer y saber modificarlas puede ayudar a una
administración del sistema.

Modificar la zona horaria

Linux emplea internamente UTC (Tiempo universal coordinado), que es la


hora Greenwich, al que no se le ha aplicado el horario de verano. Un fichero
se guarda en disco con la marca temporal en UTC y cuando utilizamos
herramientas como cron, que “piensan” en UTC. Un usuario emplea la hora
local, por tanto, Linux debe ser capaz de traducir entre el tiempo local y UTC.
Para realizar esta traducción, busca en el fichero /etc/localtime la información
que le indica cuál es su zona horaria. Este fichero es uno de los raros ficheros
de configuración que no está en texto plano, por lo que no deberíamos

Academy Xperts Bolivia


56
EX - LINUX EXPERTO EN LINUX. MODULO 2

intentar editarlo con un editor de texto; puede ser un fichero en sí o un enlace


simbólico o de referencia a otro fichero. Si es un enlace simbólico, listando el
fichero podremos ver nuestra zona horaria a través del fichero al que apunta.

Si /etc/localtime es un fichero normal y no un enlace simbólico, o bien cuando


deseemos confirmar cuál es nuestra zona horaria, utilizaremos directamente
el comando date:

Este resultado incluye un código de zona temporal estándar de 3 letras, EDT


en este ejemplo. Podemos encontrar una lista de abreviaturas de zona horaria
en http://www.timeanddate.com/library/abbreviations/timezones. Los códigos
de zona horaria varían si está activo el horario de verano, pero los ficheros de
zona temporal de Linux no cambian con este detalle. Si necesitamos cambiar
la zona horaria, deberíamos copiar o enlazar un fichero de muestra de un
directorio estándar con /etc/localtime:

1. Acceder como root


2. Pasar al directorio /etc
3. El directorio /usr/share/zoneinfo contiene ficheros para determinadas
zonas horarias con nombres de las regiones a las que se aplican, como
GMT, Poland y Japan. La mayoría de usuarios tendrían que buscar en
subdirectorios como /usr/share/zoneinfo/US para los Estado Unidos o
/usr/share/zoneinfo/America para Norteamérica y Sudamérica, que
contienen ficheros de zona que reciben el nombre de las regiones o
ciudades a las que se aplican, como Eastern o Los_Angeles. También se

Academy Xperts Bolivia


57
EX - LINUX EXPERTO EN LINUX. MODULO 2

debe tener en cuenta que podremos utilizar un nombre de fichero con un


nombre de ciudad diferente a la nuestra, pero que se encuentre en la
misma zona horaria, el fichero Madrid funciona bien para París, Barcelona,
o cualquier otra ciudad de la misma zona horaria.
4. Si hay un fichero localtime en /etc, lo borraremos o renombraremos.
5. Finalmente, crearemos un enlace simbólico desde la zona horaria elegida
hasta el fichero /etc/localtime. Por ejemplo, ln -s
/usr/share/zoneinfo/US/Eastern localtime para configurar la zona horaria
del Este de Estados Unidos. Otra opción es copiar el fichero con el
comando cp, si /etc y el fichero objetivo están en el mismo sistema de
ficheros, podremos crear un enlace de referencia.

Si hemos cambiado correctamente la zona horaria, deberíamos poder ver la


diferencia con el comando date. El código de zona horaria del sistema debería
cambiar, así como la hora, que cambia en función del número de horas que
hay entre las zonas horarias seleccionadas. Algunas distribuciones, además de
/etc/localtime, emplean un fichero secundario con datos de zona horaria en
modo texto. Este fichero es /etc/timezone en Debian y sus derivados. En
Fedora y sus derivados se llama /etc/sysconfig/clock. Estos ficheros contienen
una línea o dos con el nombre de la zona horaria, a veces en forma de
variable de asignación. Tendremos que actualizar este fichero cuando
cambiemos la zona horaria y así no confundir a las herramientas de
configuración de nivel superior. Algunas distribuciones proporcionan
herramientas en modo texto como tzsetup, tzselect, tzconfig o algo similar,
programas que preguntan la ubicación en varios pasos y después crean el
enlace simbólico apropiado.

¿Qué es un ajuste local?

Es un modo de especificar el idioma y el país del ordenador o del usuario y la


información relacionada con la personalización de la visualización. Un ajuste
local adopta la siguiente forma:

[idioma[_territorio][.conjuntodecodigos][@modificador]]

Academy Xperts Bolivia


58
EX - LINUX EXPERTO EN LINUX. MODULO 2

Cada parte de la cadena tiene su significado. Por ejemplo, idioma puede ser:
en (ingles), fr (frances), ja (japones) o cualquier otro código de idioma de dos
o tres letras. El territorio puede ser US (Estados Unidos), FR (Francia), JP
(Japón) o cualquier otro código especifico de región, generalmente naciones.
El conjunto de códigos puede ser ASCII, UTF-8 u otra codificación. ASCII es el
método de configuración más antiguo, emplea una codificación de 7 bits que
puede utilizarse para el inglés, incluyendo símbolos y marcas de puntuación.
ASCII no puede manejar los caracteres de la mayoría de los demás idiomas.
ISO-8859 es uno de los primero intentos para ampliar ASCII, usa un octavo
bit para ampliar a 128 caracteres y hacer sitio a caracteres que necesitan un
pequeño número de alfabetos no romanos. ISO-8859 se divide en muchos
subestándares, cada uno de los cuales se ocupa de un idioma o un pequeño
grupo de idiomas (ISO -8859-1 para idiomas de Europa del este y ISO-8859-5
incluye al Cirílico).

El conjunto de códigos de idiomas más reciente es UTF-8, que se inicia con


ASCII y lo amplía a través de extensiones de tamaño variable. De esta
manera, un único carácter puede ocupar desde 1 hasta 4 bytes. Ofrece la
posibilidad de codificar texto en cualquier idioma aceptado por unicode, que es
un conjunto de caracteres diseñado para admitir todos los lenguajes que
pueda, lo que permite no tener que especificar un subestandar como en ISO-
8859. UTF-8 gestiona todos los sistemas de escritura automáticamente.

El modificador es un código específico del ajuste local que modifica el


funcionamiento de éste, por ejemplo, afectando a la ordenación de una
manera específica del idioma.

¿Cuál es nuestro ajuste local?

El código de ajuste local se puede asignar a una o varias variables de entorno.


El comando locale permite saber cómo están definidas en el sistema.

Academy Xperts Bolivia


59
EX - LINUX EXPERTO EN LINUX. MODULO 2

Cuando los programas consultan estas variables, realizan ajustes automáticos


en función de sus valores. La mayoría de estas variables definen
características obvias y específicas, como tamaño de papel (LC_PAPER), las
unidades de medida (LC_MEASUREMENT), etc. LC_ALL se utiliza para realizar
invalidaciones maestras, es decir, invalidar el resto de las variables LC_*. Otra
variable de entorno relacionada es LANG, que define el ajuste local en caso de
que las variables LC_* no se hayan definido.

La opción -a del comando locale identifica todos los ajustes locales que están
disponibles:

Academy Xperts Bolivia


60
EX - LINUX EXPERTO EN LINUX. MODULO 2

En este caso, hay muy pocos ajustes locales instalados, aunque puede haber
ordenadores que tengan cientos.

Cambiar el ajuste local

Si vamos a cambiar nuestro ajuste local, primero tendremos que verificar que
hay disponible uno apropiado para nuestro caso. Utilizaremos locale -a; en
caso de que no aparezcan los códigos apropiados, puede que necesitemos
instalar paquetes adicionales. Los nombres de estos paquetes no están
estandarizados y lo mejor para localizarlos es utilizar un gestor de paquetes
GUI como yumex o synaptic y buscar así los nombres o descripciones de
paquetes que incluyan locale o language. En sistemas como Ubuntu, sólo se
proporcionan unos cuantos ajustes locales, pero se pueden instalar más desde

Academy Xperts Bolivia


61
EX - LINUX EXPERTO EN LINUX. MODULO 2

paquetes con nombres language-support-??, ?? es un código de idioma de dos


caracteres.

El modo más sencillo de cambiar temporalmente el ajuste local es definiendo


LC_ALL y, por seguridad, LANG. Por ejemplo, para utilizar los ajustes locales
de Gran Bretaña escribiremos:

Como resultado, todas las variables locales cambian para la sesión, así como
la salida de los programas que tienen en cuenta estos ajustes. Sólo afecta a la
consola actual y a los programas que se inician desde ésta, por lo que no
habrá cambios en los programas en ejecución o los que iniciemos desde otra
consola.

Si queremos que el ajuste local sea permanente, ajustaremos los ficheros de


inicio de bash, como ~./.bashrc o /etc/profile. El fichero de configuración de X
(xorg.conf o XF86Config) incluye una opción llamada XkbLayout en la sección
InputDevice del teclado que permite la especificación parcial o completa del
ajuste local, lo que puede proporcionar acceso a teclas específicas del idioma
o el país. Tendremos que reiniciar X para que los cambios tengan efecto. Hay
programas que pueden requerir que se defina el idioma independientemente
del ajuste local global del sistema, lo que es necesario en caso de que el
programa no responda al ajuste local global.

El parámetro LANG=C hace que los programas que ven esta variable de
entorno muestren una salida que no ha pasado por el filtro de las traducciones
de los ajustes locales. Es útil cuando el ajuste local corrompe la salida de un
programa. Si definimos LANG=C, podemos evitar algunos tipos de problemas,
en particular las canalizaciones y scripts que pasan los datos de un programa
a otro en formato binario.

El soporte de localización es responsabilidad del autor de cada programa, por


tanto, no podremos hacer que todos los programas acepten el lenguaje que

Academy Xperts Bolivia


62
EX - LINUX EXPERTO EN LINUX. MODULO 2

deseamos, en particular si no es uno de los habituales.

Modificar los ajustes locales de los ficheros de texto

Si necesitamos procesar datos de tipo texto generados en un sistema que


empleaba una codificación con un programa que no la admite, el editor de
texto podría mostrar los caracteres de una manera extraña. La utilidad iconv
realiza conversiones entre conjuntos de caracteres. Su sintaxis es la siguiente:

-f y -t especifican las codificaciones de origen y de destino. Se puede obtener


una lista de codificaciones escribiendo iconv –list. Si omitimos la codificación
de destino, se utilizará como guía el ajuste local. La salida del programa se
envía a la salida estándar, por lo que si deseamos almacenarla en un fichero,
debemos redirigirla. Por ejemplo:

Academy Xperts Bolivia


63
EX - LINUX EXPERTO EN LINUX. MODULO 2

Tema 2.3: Servicios esenciales del sistema


2.3.1. Mantener la hora del sistema
Linux depende más del reloj de su sistema que otros SO. Hay herramientas como cron, at
y make que utilizan las marcas temporales de los ficheros para realizar sus acciones. Es
importante estar familiarizado con el modo en que Linux maneja el tiempo, como se define
la zona horaria, como configurar el tiempo y como mantener la precisión del reloj.
Los ordenadores que funcionan con Linux tienen dos relojes integrados: el primero se
denomina reloj del hardware y es el que conserva la hora mientras el ordenador está
apagado. Cuando iniciemos Linux, leerá el reloj del hardware y definirá el reloj del
software con el valor obtenido. El reloj del software es el que empleará Linux para la
mayoría de sus objetivos cuando esté en ejecución.

Los SO como Windows y las versiones de MacOS anteriores a X configuran sus relojes
con la hora local. Es un sistema cómodo y sencillo pero no es el más adecuado de cara a
la red ya que los protocolos de red que se basan en la hora, aunque sea parcialmente,
pueden llegar a confundirse cuando trabajen en varias zonas horarias distintas. Linux y
otros SO de tipo Unix configuran su reloj con UTC (Tiempo Universal Combinado) que, a
todos los efectos, es igual a GMT (Greenwich Mean Time), que no se ajusta al horario de
verano. Esto implica que los sistemas Linux de diferentes zonas horarias tengan horas
idénticas, suponiendo que todos estuvieran debidamente configurados. Sin embargo, para
comunicarse con los usuarios, estos sistemas necesitan conocer sus zonas horarias. Para
mostrar la información temporal de por ejemplo un archivo, Linux leerá la marca temporal
en UTC y después añadirá o substraerá la cantidad de tiempo apropiado para que la
marca temporal se muestre con nuestra hora local. Todo esto significa que tenemos que
ser capaces de configurar la zona horaria del ordenador,algo que se hace normalmente
cuando se instala el sistema; el instalador nos preguntará la zona horaria y definirá todo
correctamente.
El uso interno de UTC en Linux puede complicar la configuración del reloj del hardware,
ya que, si tenemos un arranque múltiple con Linux y un SO que espera que el reloj del
hardware tenga la hora local, tendremos que configurar el reloj del hardware y Linux para
que se tenga en cuenta este echo. Esta configuración no suele dar problemas, pero
puede que tengamos que modificar el reloj la primera vez que iniciemos en primavera u
otoño, debido al ajuste del horario de verano. Incluso, dependiendo de la configuración,
puede que el reloj del hardware se reinicie en algunos SO. Tanto el reloj del hardware
como el del software tienden a desajustarse levemente, por lo que es fácil que el reloj
acabe con una diferencia de varios minutos con respecto al tiempo correcto un mes o dos
después de ser ajustado. La solución a este problema es utilizar protocolos de red para
configurar la hora. El más popular es NTP (Protocolo de hora en red).
Configurar la hora manualmente
La principal herramienta para configurar el reloj del software es date que posee la
siguiente sintaxis:

Academy Xperts Bolivia


64
EX - LINUX EXPERTO EN LINUX. MODULO 2

date [-u|--utc|--universal] [MMDDhhmm[[SS]AA][.ss]]


Este comando muestra la fecha actual, si le pasamos una hora, configurará con ésta el
reloj del software. El formato contiene, como mínimo, un mes, un día, una hora y un
minuto, todos ellos en una codificación de dos dígitos (MMDDhhmm). El año de dos o
cuatro dígitos y los segundos transcurridos se pueden indicar opcionalmente. La hora
debe introducirse en formato 24 horas. Por ejemplo, para configurar como hora las 3:02
del 27 de octubre de 2009, escribiremos el siguiente comando:

Por defecto, date asume que la hora se especifica en tiempo local. Para configurar el reloj
en UTC incluiremos -u, –utc o .universal. Una vez configurado el reloj del software, Linux
proporciona herramientas para sincronizar esta hora con el reloj del hardware. En
concreto, la utilidad hwclock permite configurar el reloj del hardware desde el reloj del
software o viceversa, así como algunas otras cosas, su sintaxis es:
hwclock [function] [options...]
Se pasan funciones y opciones para objetivos determinados:
- Mostrar el reloj del hardware: con las opciones -r o –-show se mostrará la hora
local, incluso cuando el reloj del hardware se haya configurado con UTC.
- Configurar manualmente el reloj del hardware: –-set y -–date=nueva_fecha
permiten configurar el reloj del hardware con la hora especificada. nueva_fecha
está en el formato de fecha que acepta el programa date.
- Configurar el reloj del hardware en función del reloj del software: para
sincronizar el reloj del hardware con el mismo valor con el que hemos configurado
el valor del software, utilizaremos la opción –-systohc.
- Configurar el reloj del software en función al reloj del hardware: para definir el
reloj del software con el valor del reloj del hardware, utilizaremos la opción –-
hctosys. Se utiliza con frecuencia en los scripts de inicio SysV para definir el reloj
del sistema cuando arranque por primera vez el ordenador.
- Especificar UTC o la hora local: podemos decirle a Linux que guarde el valor del
reloj del hardware como UTC con la opción –-utc o como hora local con la opción –
localtime. El valor por defecto es que se haya utilizado la última vez que se
configuró el reloj del hardware.
No es habitual utilizar hwclock directamente, pero puede ser necesario tras el
desplazamiento provocado por el horario de verano si el reloj del hardware sigue la hora
local. Hay distribuciones que incluyen scripts que controlan esta tarea automáticamente.
Es aconsejable usarlo de vez en cuando para que el reloj del hardware no se aleje
demasiado de la hora exacta; hay distribuciones que lo hacen automáticamente durante el
proceso de apagado del sistema.

Academy Xperts Bolivia


65
EX - LINUX EXPERTO EN LINUX. MODULO 2

El reloj del hardware se puede configurar a través de la BIOS. Para ello tendremos que
reiniciar el sistema y pulsar la tecla adecuada durante el proceso de arranque para
acceder a la configuración de la BIOS. Allí buscaremos la opción horaria y la
configuraremos adecuadamente. Si Linux utiliza UTC, tendremos que configurar el reloj
con UTC en vez de la hora local.
Uso de NTP
En un ordenador aislado no suele hacer falta configurar el reloj con mucha precisión, pues
no supone un problema real mientras que la hora sea razonablemente consistente a
efectos de cron. Otras herramientas de planificación o las marcas temporales. A veces, es
importante mantener la precisión de la hora en el sistema, especialmente en las
aplicaciones científicas, empresariales e industriales; en un entorno de red es aún más
importante mantener la hora completa. Por todas estas razones, existen varios protocolos
para sincronizar los relojes de varios sistemas, NTP es el más flexible y popular y
debemos conocer los principios básicos de su funcionamiento para configurar un servidor
NTP en nuestra red y otros sistemas como clientes.
Conocer los fundamentos de NTP
NTP crea una jerarquía por capas de fuentes horarias, es una de las herramientas más
populares para configurar la hora de la red. La parte superior de la estructura contiene
una o varias fuentes horarias que normalmente son relojes atómicos o receptores de
radio, que obtienen sus horas de señales temporales emitidas en base a relojes atómicos.
Se conocen como servidores temporales estrato 0, no se puede acceder a ellos
directamente. Sólo los servidores temporales estrato 1 a los que están conectados tienen
acceso a ellos. Los ordenadores estrato 1 ejecutan servidores NTP que distribuyen la
hora a servidores estrato 2, que, a su vez, distribuyen la hora a servidores estrato 3, y así
sucesivamente en un número arbitrario de capas.

Academy Xperts Bolivia


66
EX - LINUX EXPERTO EN LINUX. MODULO 2

Otros protocolos de definición de tiempo son el integrado en SMB/CIFS e implementado


en Linux por SAMBA, y un protocolo empleado por la utilidad rdate en Linux.
La clave de NTP es que cada servidor puede distribuir la hora a un número de clientes en
expansión. El incremento en el número de clientes de un estrato reducirá ligeramente la
precisión de la señal horaria, aunque no considerablemente. Si tenemos una red,
podremos utilizar un ordenador como servidor NTP y configurar el resto desde él. Aunque
el servidor tuviera una desviación de un segundo, todos los relojes de la red deberían
encontrarse a una mínima fracción los unos de los otros, el aspecto más importante a
tener en cuenta por los protocolos de red como kerberos.
NTP funciona midiendo el tiempo round-trip (de ida y vuelta) de los paquetes de
información que se transmiten entre el servidor y el cliente, para ello utiliza el intercambio
de paquetes con marcas temporales embebidas. Cuando el cliente recibe dicho paquete,
ajusta su hora con la marca temporal de la fuente al añadir una pequeña cantidad de
tiempo para tener en cuenta el retardo del round-trip. Por este motivo, siempre se deben
seleccionar las fuentes NTP con el menor tiempo de retardo de red posible.
Localizar una fuente horaria
En la mayoría de los casos, la mejor práctica es sincronizar con un sistema de estrato 2 o
nivel inferior, lo que servirá para mantener baja la carga de los servidores del estrato 1 y
mejorar el rendimiento global de la red NTP, salvo en excepciones como la configuración
de un servidor NTP que distribuya la hora a cientos de ordenadores. Si queremos localizar
un servidor NTP, tendremos que consultar una o varias fuentes:

- Nuestro ISP: muchos ISP trabajan con servidores NTP para sus usuarios. Suelen
estar muy cerca en términos de red, lo que los convierte en buenos candidatos.
Podemos consultar a nuestro ISP o el departamento de red de nuestra empresa
para saber si disponen de un servidor de este tipo.
- El servidor NTP de nuestra distribución: hay distribuciones que trabajan con
servidores NTP para sus usuarios. Si nos encontramos cerca de estos servidores
dento de la red, pueden ser una buena opción.
- El banco de servidores NTP públicos: el subdominio http://www.pool.ntp.org/es/
está dedicado a los servidores que funcionan voluntariamente como servidores
NTP públicos. A ellos se accede en modo round-robin por su nombre de host, lo
que provoca que podamos acabar utilizando un servidor diferente cada vez que se
inicie NTP. El uso de estos bancos suele ser una apuesta arriesgada, pero los
resultados son lo suficientemente buenos para los usuarios ocasionales que no
quieren dedicar tiempo a comprobar y configurar NTP. Para utilizar el banco,
configuraremos nuestro servidor NTP para que utilice el nombre de subdominio
pool.ntp.org o un host numerado dentro de ese dominio, como 0.pool.ntp.org.
El servidor más cercano en términos de red no suele ser el más cercano en términos
geográficos. Por ejemplo, si un ISP nacional redirige todo el tráfico a través de uno o dos
sitios que hagan de concentrador y se encuentren al otro lado del mundo, es probable que
tal desvío incremente el tiempo de round-trip y reduzca la precisión de NTP. Una vez

Academy Xperts Bolivia


67
EX - LINUX EXPERTO EN LINUX. MODULO 2

localizados unos cuantos posibles servidores NTP, podemos emplear ping para
determinar el tiempo round-trip de los paquetes. Si los tiempos de ping son muy elevados,
buscaremos otro servidor.
Configurar servidores NTP
No es necesario que el ordenador sea muy potente para soportar un servidor NTP, pero
debe tener acceso permanente a la red. La mayoría de distribuciones Linux vienen con el
software NTP en un paquete llamado ntp, xntp, ntpd o xntpd. En caso de que no podamos
localizarlo, puede instalarse a través del gestor de paquetes o desde el sitio web que
aloja el código fuente de NTP (www.ntp.org/downloads.html). Si no instalamos el paquete
NTP propio de nuestra distribución, tendremos que crear el script de inicio SysV o iniciar
el demonio NTP de algún otro modo.
Para la distribución de linux que estamos utilizando en el curso debemos realizar los
siguientes comandos para configurar servidor NTP.

Una vez instalado NTP, buscaremos el fichero de configuración ntp.conf, que contiene
varias opciones de NTP, aunque las más importantes son las líneas de servidor:

Y se tiene que agregar los siguientes parámetros:


restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
server 192.168.0.1 iburst
luego se reinicia el demonio ntp

Y luego comprobamos y ajustamos la hora

Academy Xperts Bolivia


68
EX - LINUX EXPERTO EN LINUX. MODULO 2

Es recomendable inspeccionar el fichero de configuración en busca de las entradas a


eliminar, ya que el fichero puede contener referencias a servidores que no deseamos
utilizar u otras opciones extrañas. En general no deberíamos retocar otras entradas del
fichero ntp.conf que no sean las líneas de los servidores de referencia, pero hay
circunstancias especiales o ficheros de inicio atípicos que nos exigirán realizar algún
cambio. Una vez realizado los cambios iniciaremos o reiniciaremos el demonio NTP,
normalmente mediante un script de inicio SysV:
/etc/init.d/ntpd restart
Este comando no es igual en todas las distribuciones, puede cambiar ruta al fichero, el
nombre del script o la opción. En la mayoría de las distribuciones se configura NTP para
que se inicie cada vez que arranca el sistema. Podemos verificar que el servidor está
funcionando con el programa ntpq, que acepta varios comandos, como por ejemplo peers,
que indica los servidores a lo que está conectado nuestro servidor NTP. La conexión
LOCAL (0) indica la fuente de referencia para el propio reloj del ordenador. La columna
refid que se muestra en la salida del comando ntpq muestra el servidor con el que se
sincroniza cada sistema. La columna st muestra el estrato del servidor. El servidor al que
se sincroniza el nuestro se indica con un asterisco (*), los demás servidores con horas
adecuadas se indican con un signo de suma (+) y la mayoría del resto de símbolos (como
x y guion (-)) denotan servidores descartados por razones diversas. Los servidores
seleccionados como fuente no aparecerán hasta unos minutos después de reiniciar el
demonio NTP, pues el proceso NTP local tarda un tiempo en determinar cuál de las
fuentes proporciona la mejor señal.

Configurar clientes NTP


Una vez configurados uno o más servidores NTP, podremos configurar los clientes para
que apunten a ellos. La configuración es similar a la del servidor NTP, pero con un par de
excepciones:
- El cliente NTP se configura para que haga referencia al servidor o servidores NTP
que hemos configurado y no a la fuente NTP externa. De este modo, los sistemas
locales no cargarán el servidor NTP externo.
- Es recomendable asegurarse de que no se puede acceder a los clientes NTP
como si fueran servidores, lo que se puede lograr con una regla de IPTABLES o
utilizando una línea restrict default ignore en ntp.conf . Esta línea le indica al
servidor que ignore todas las peticiones entrantes. Lo ideal sería utilizar ambos
métodos.
Una vez configurado el cliente, reiniciaremos el demonio NTP. Podemos utilizar ntpq para

Academy Xperts Bolivia


69
EX - LINUX EXPERTO EN LINUX. MODULO 2

verificar su estado. Deberíamos ver que sólo hace referencia al servidor o servidores NTP
de nuestra red y que deberían tener un número de estrato superior al de los servidores a
los que se refieren en el cliente.
Hay veces en las que es más sencillo configurar la hora con ntpdate, que forma parte de
la suit de NTP y configura el reloj en un solo paso. Esto se hace escribiendo el comando
seguido del nombre de host o dirección IP de un servidor NTP:

Hay paquetes NTP que incluyen una llamada a ntpdate en los scripts de inicio del
demonio NTP para asegurarse de que el sistema tiene la hora correcta cuando se inicia.
Sin embargo, ntpdate está cayendo en desuso y podría desaparecer del paquete NTP. La
alternativa es iniciar ntpd con la opción -g, que permite configurar el reloj en un solo paso
con un valor totalmente divergente de la hora actual. En condiciones normales, ntpd
finalizará si la hora del servidor difiere de la hora local en algo más que unos pocos
minutos.

Suministrar la hora a sistemas Windows


Si nuestra red contiene sistemas Linux y Windows, podemos usar como fuente horaria
tanto un servidor Windows como un servidor Linux. Se puede ejecutar NTP en Windows.
En Windows NT/200x/XP/Vista podemos escribir NET TIME /SETSNTP:servidor.horario
donde servidor.horario es el nombre del servidor NTP local que queremos usar. Este
comando realiza la configuración del reloj en un solo paso, pero no se ejecuta en segundo
plano como lo hace NTP en Linux. Lo adecuado puede ser ejecutar este comando en un
script de inicio de Windows.

Para los clientes de tipo Windows, se ingresa como usuario administrador y se realizan
los siguientes pasos
- Ajustar Fecha y Hora.
- Hora de Internet.
- Cambiar la configuración.
- En la opción “Servidor”, ingresar la dirección IP del servidor de la red local.

Academy Xperts Bolivia


70
EX - LINUX EXPERTO EN LINUX. MODULO 2

- Actualizar Ahora.

2.3.2. Inicio de sesión en el sistema


Si modificamos el modo en que arranca el ordenador y no obtenemos los resultados
esperados, es útil saber dónde encontrar información sobre lo ocurrido durante el inicio.
Los mensajes que recibamos sobre un arranque nos guiarán una vez entendamos lo que
ocurre cuando arrancamos un sistema Linux.

Extraer información sobre el proceso arranque


Hay cierta información del kernel y del registro de módulos que se almacena en lo que se
denomina kernel ring buffer o buffer circular. Estos mensajes se muestran durante el
proceso de arranque y, normalmente, se desplazan demasiado rápido por la pantalla
como para poder leerlos; existen incluso distribuciones que ocultan estos mensajes. Si
deseamos ver esta información una vez arrancado el sistema, lo haremos con el comando
dmesg junto con el paginado less ya que este comando genera una abundante salida.
Muchas distribuciones almacenan este buffer en /var/log/dmesg; la información que se
registra se va renovando conforme el sistema opera, el tamaño de este fichero es infinito.
Otra fuente de información es el registro del sistema syslogd, cuya consulta resulta mucho
más útil. Suele encontrarse en /var/log/messages, aunque /var/log/syslog y otros ficheros
de registro de /var/log también pueden contener información útil. Debian utiliza un
demonio llamado bootlogd que registra los mensajes que van a /dev/console en el fichero
/var/log/boot; Fedora y Red Hat utilizan servicios de syslogd para registrar información en
/var/log/boot.

Academy Xperts Bolivia


71
EX - LINUX EXPERTO EN LINUX. MODULO 2

Localizar e interpretar los mensajes del arranque


Los mensajes del arranque pueden resultar críticos para los no iniciados. A continuación
se muestran unos consejos que pueden ayudarnos a localizar e interpretar la información
almacenada en los ficheros de /var/log:
- Utilizar less y sus funciones de búsqueda: es una gran herramienta para
examinar el buffer circular, los ficheros de registro y su función de búsqueda;
puede ayudarnos a buscar cadenas completas.
- Buscar por el nombre del tipo de hardware: muchos mensajes del arranque
están relacionados con el hardware, por lo que, si tenemos algún problema con
algún hardware en particular, deberíamos probar a hacer una búsqueda con
palabras que estén relacionadas con él.
- Buscar por el nombre del chipset del hardware: los drivers de Linux registran a
veces mensajes junto a los nombres de los drivers, normalmente relacionados con
un chipset. Si conocemos lo suficiente el hardware como para saber el nombre del
chipset, podremos realizar una búsqueda para localizarlo mediante el nombre del
chipset. También podemos realizar búsquedas por nombres de módulos del kernel
de nivel superior.
- Estudiar la salida de un sistema en funcionamiento: deberemos familiarizarnos
con el contenido del buffer circular y los ficheros de registro del sistema en
funcionamiento, ya que si, conocemos los mensajes habituales de un sistema que
funciona correctamente, será más fácil identificar los mensajes de error cuando los
haya.
Hay veces que un sistema no se inicia; en estos casos, se muestran por pantalla los
mensajes de arranque del kernel, lo que ayuda a identificar la causa del fallo. Hay muchas
distribuciones que esconden estos mensajes, pero podemos verlos pulsando la tecla
escape (esc) durante el proceso de arranque. Una vez el kernel esté arrancado, hay
sistemas que toman el control y muestran por pantalla los últimos mensajes; estos
sistemas pueden ser servidores, aplicaciones del espacio de usuario, etc., que también
pueden estar provocando que el sistema no arranque.

El proceso de arranque
Los pasos que sigue un ordenador para arrancar un SO son los siguientes:
1. Se enciende el sistema, un circuito de hardware especial hace que la CPU mire en
determinadas direcciones y ejecute el código de la BIOS.
2. La BIOS hace algunas tareas entre las que se incluyen la comprobación del
hardware, su configuración y la búsqueda un sector de arranque que contenga el
cargador de arranque.
3. Cuando la BIOS le pasa el control al cargador de arranque, éste buscará un
cargador de arranque secundario siempre y cuando exista uno en una partición
marcada como activa.
4. El objetivo final del cargador de arranque es encontrar un kernel, cargarlo en la
memoria y ejecutarlo.

Academy Xperts Bolivia


72
EX - LINUX EXPERTO EN LINUX. MODULO 2

5. Cuando el kernel Linux toma el control, inicializa dispositivos, monta la partición


raíz y, por último, carga y ejecuta el programa inicial del sistema que por defecto
es /sbin/init
6. El programa inicial recibe la ID de proceso 1, ya que es el primer programa que se
ejecuta en el sistema. /sbin/init leerá un fichero llamado /etc/inittab para
determinar qué otros programas ejecutar si hay más particiones para montar o
iniciar servicios del sistema, así como un entorno X para proporcionar una interfaz
gráfica de acceso.
2.3.3. Mail Transfer Agent (MTA)
El correo electrónico es uno de los servicios de red más importantes, Linux se basa en el
correo electrónico incluso en entornos completamente ajenos a las redes. Algunos
subsistemas como cron pueden utilizar el correo para informar de sus actividades. La
mayoría de las distribuciones llevan instalado software de servidor de correo configurado
para sus actividades básicas, lo que obliga a conocer su funcionamiento para poder
utilizarlos para acometer diversas tareas. Debemos poder identificar el paquete de
servidor de correo que utiliza nuestro sistema. También debemos ser capaces de
configurar alias de correo y el reenvío. Por último, deberíamos conocer las implicaciones
de seguridad para poder prevenir problemas o identificarlos cuando ocurran.
Cómo funciona el correo electrónico
El protocolo más común para administrar el correo electrónico es SMTP, que está
diseñado como un sistema push, es decir, el sistema emisor es quien inicia la
transferencia. Este diseño es apropiado para enviar información y, por eso, SMTP se
utiliza en la mayoría de sistemas de reparto de correo. En la etapa final, frecuentemente
se utiliza un protocolo de correo de tipo pull, como POP o IMAP. En estos protocolos es el
sistema receptor quien inicia la transferencia. Esto resulta útil cuando el sistema receptor
es el equipo de un usuario, que puede no estar encendido en todo momento.
SMTP permite que un mensaje pase por un número arbitrario de ordenadores. Un usuario
final podría confeccionar un mensaje que se enviará al servidor SMTP local. Este servidor
buscará un sistema receptor utilizando DNS y enviará el mensaje a dicho sistema. Este
sistema puede utilizar su propia tabla de enrutamiento para redireccionar los mensajes a
otros sistemas locales, ya sea directamente o a través de un servidor POP o IMAP. La
siguiente figura muestra esta composición; debemos tener presente que el número de
enlaces es variable y depende de cómo esté configurado cada sistema. En el caso más
sencillo los correos locales permanecen en un solo sistema. Podrían verse implicados en
el intercambio de correo un gran número de ordenadores, aunque en la práctica es raro
encontrarse con correos que pasen por más de media docena de sistemas. Cada eslabón
altera el correo y, lo que es más importante, cada servidor añade un encabezado al correo
que proporciona información sobre el mensaje en particular, añaden encabezados
Received: (Recibido) para documentar la ruta que ha tomado el correo. Esto permite
hacer una traza inversa del correo hasta llegar a su origen, aunque hoy en día, los
spammers han aprendido a falsificar los encabezados del correo, lo que complica
enormemente el análisis.

Academy Xperts Bolivia


73
EX - LINUX EXPERTO EN LINUX. MODULO 2

Como un servidor SMTP puede hacer tanto de servidor como de cliente, debemos tratar
con ambos lados de la ecuación en la configuración. Hay veces en las que un sistema
funciona con uno u otro rol, lo que simplifica las cosas; pero entonces debemos tener
cuidado de no configurar el sistema incorrectamente por accidente. Debemos evitar las
configuraciones open relay (de transmisión abierta), en las que un servidor de correo
transmite el correo de cualquier usuario.
El correo está estrechamente ligado a las cuentas de usuario de Linux. El servidor
contiene los mensajes entrantes de cada usuario almacenados en un fichero de
/var/spool/mail, sin embargo, hay servidores que almacenan el correo entrante en
subdirectorios del directorio home del usuario. Este fichero o directorio de correo entrante
se conoce como buzón de correo del usuario. El método tradicional para enviar correos en
Linux es hacer que los programas locales contacten con el servidor de correo local para el
reenvío, entonces, el servidor local contactará con el servidor de correo saliente. La
mayoría de clientes de correo (conocidos como agentes del usuario del correo o MUA),
así como los programas similares de otras plataformas, ofrecen la opción de contactar
directamente con un servidor SMTP remoto al enviar el correo. Esta configuración
simplifica ligeramente la ruta del correo, pero puede hacer que la operación sea poco
fiable si se cae la conexión de la red local. Si el cliente de correo se comunica con un
servidor SMTP local, el correo se podrá encolar para que lo distribuya el servidor SMTP
aunque la red esté caída temporalmente.
Escoger el software del correo electrónico
Es probable que nuestro sistema ya tenga instalado por defecto uno de los principales
servidores de correo, algunos servidores son más fáciles de configurar que otros o
admiten opciones específicas que otros no. Los cuatro servidores de correo más
populares en Linux son:

- Sendmail: fue durante muchos años el paquete de servidor de correo dominante


en Internet. En los últimos años, ha cedido parte de su hegemonía a los demás
servidores aquí descritos, así como a los servidores de Windows. Pese a ello,

Academy Xperts Bolivia


74
EX - LINUX EXPERTO EN LINUX. MODULO 2

sigue siendo un servidor popular. Es muy potente, aunque difícil de configurar, ya


que sus ficheros de configuración tienen un formato bastante arcaico.
(www.senmail.org).
- Postfix: fue diseñado como un sustituto modular para sendmail. No es un único
programa que lo hace todo, sino que utiliza varios programas que controlan una
pequeña tarea específica. Esto mejora la seguridad, al menos en teoría. Es más
fácil de configurar que sendmail y es el servidor por defecto de muchas
distribuciones. (www.postfix.org).
- Exim: es un servidor monolítico como senmail, posee un formato de configuración
más sencillo. Hay unas cuantas distribuciones que utilizan exim como servidor por
defecto. (www.exim.org).
- qmail: es un servidor modular con la seguridad como principal objetivo. Es más
fácil que configurar que sendmail, aunque no es el servidor de correo estándar de
ninguna distribución, pues su licencia es un poco extraña y complica su
distribución con Linux. Muchos administradores prefieren utilizar qmail en lugar de
los servidores estándar de las distribuciones.
Podemos averiguar cuál es el servidor de correo que ejecuta nuestra distribución de
varias maneras. Lo más fiable es utilizar ps para buscar el proceso en ejecución o
utilizar las herramientas de administración de paquetes para ver qué paquete está
instalado. Por ejemplo, podríamos encontrarnos con resultados como los siguientes:

La búsqueda de un proceso que contenga la cadena send no ha funcionado, pero la


búsqueda post ha devuelto un proceso llamado /usr/libexec/postfix/master, por lo que
parece que en este sistema se está ejecutando postfix.
Además del servidor SMTP, un sistema de correo Linux totalmente funcional,
probablemente, incluya otro software:
- Servidor pull de correo: hay dos protocolos pull de correo populares, POP e
IMAP. Si nuestro sistema funciona como servidor desde el que los usuarios
pueden leer sus correos remotamente, es probable que tengamos instalado un
paquete servidor POP o IMAP, como Cyrus IMAP o Dovecot.
- Fetchmail: este programa rellena un extraño hueco en la cadena de distribución
del correo. Si ejecutamos un sitio que se basa en un ISP externo para la
distribución de correo, es probable que el ISP sólo soporte POP o IMAP. Si
queremos utilizar una variedad de clientes de correo, es recomendable que

Academy Xperts Bolivia


75
EX - LINUX EXPERTO EN LINUX. MODULO 2

ejecutemos nuestro propio servidor SMTP y, quizás, nuestro propio servidor POP
o IMAP para el reparto local de correo. Para esto necesitamos un programa que
obtenga el correo utilizando POP o IMAP y que después lo inserte en una cola
SMTP. Esta es la función de fetchmail. La mayoría de los sitios no lo necesitan,
pero hay algunos en los que resulta imprescindible.
- Lectores de correo: es el último eslabón de la cadena de correo. En Linux
tenemos ejemplos como evolution, kmail, pine y mut. La utilidad mail viene
instalada por defecto en la mayoría de los sistemas Linux. La mayoría de los
clientes de correo permiten leer desde una cola de correo local a un servidor POP
o IMAP remoto. Los sistemas multiusuario probablemente tengan instalados varios
clientes de correo para que cada usuario escoja el que desee.
En la práctica, necesitaremos saber cómo configurar estos paquetes dependiendo de las
necesidades de nuestro sitio. Afortunadamente, la configuración de los lectores de correo,
que es la tarea más habitual, suele ser bastante intuitiva, siempre que dispongamos de
información sobre los nombres de host de los servidores de correo saliente (SMTP) y
entrante (POP, IMAP o una cola local).
Administración del correo electrónico
A continuación vamos a describir las tareas administrativas más habituales relativas al
envío y la recepción del correo empleando la utilidad mail, la administración de la cola de
correo, la configuración de alias y el reenvío de correos.
Linux soporta una amplia variedad de clientes de correo que probablemente incluyan
todas las funcionalidades, sin embargo, debemos saber cómo utilizar el programa básico
de la línea de comandos mail. Posee la ventaja de que se puede utilizar desde un script,
por lo que podemos controlar automáticamente algunas tareas del correo. Por ejemplo, el
script podría buscar las contraseñas que estén a punto de expirar y enviar un aviso a los
usuarios para que cambien sus contraseñas.
Algunos sistemas vienen con un programa llamado nail en lugar de mail, que incluye
funcionalidades adicionales como la posibilidad de añadir ficheros adjuntos. Normalmente,
hay un enlace llamado mail que apunta a nail, por lo que podemos llamar a nail como
mail.
La sintaxis más básica de mail, incluyendo sus opciones más útiles es la siguiente:
mail [-s "asunto"] curso_linux@localhost
mail -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q
FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users
La primera línea se utiliza para enviar correo y la segunda para leerlo. A diferencia de la
mayoría de lectores de correo, mail sólo permite leer la cola de correo local, no los
correos almacenados en servidores remotos que utilizan POP o IMAP. Las opciones de
mail permiten conseguir distintos fines:

- Detalle del funcionamiento: -v genera una salida más detallada, lo que puede

Academy Xperts Bolivia


76
EX - LINUX EXPERTO EN LINUX. MODULO 2

servir para depurar problemas.


- Especificar una línea de asunto: -s asunto permite especificar una línea para el
asunto.
- Especificar la dirección del receptor: la dirección de correo del receptor finaliza la
línea de comandos de mail de un correo saliente.
Esta lista sólo incluye las funcionalidades más importantes. Debemos recordar que hay
sistemas que utilizan mail y otro utiliza nail, ya que las opciones disponibles para estos
dos programas difieren. Las opciones aquí mostradas tienen el mismo efecto en ambos
programas, pero algunas opciones como -a (permite insertar un encabezado de correo
arbitrario en mail pero en nail se utiliza para adjuntar un fichero) poseen distinto
significado según el programa.
Supongamos que deseamos enviar un correo a dos destinatarios diferentes, lo haremos
del siguiente modo:

Después de escribir el comando mail, el comando esperará datos por la entrada estándar.
Una vez escribamos el mensaje, se volverá de nuevo al promt. Si utilizamos mail en un
script, podemos pasarle el contenido de un fichero para enviarlo mediante una redirección
de la entrada.

Esta línea enviará el contenido de /tmp/alert.txt a abel@example.com con el asunto


especificado.
Podemos utilizar mail para leer los mensajes entrantes, pero sólo si están ubicados en un
buzón de correo local de Linux. En este caso lo normal es utilizar mail interactivamente.
Escribiremos mail para ver el contenido del buzón de correo, cada mensaje muestra una
línea de resumen que lista el emisor, la fecha y el asunto entre otras cosas:

En la práctica se suelen utilizar lectores de correo más sofisticados, mail es más útil para
enviar correos encriptados que para leer el correo o enviar correos personales.

Academy Xperts Bolivia


77
EX - LINUX EXPERTO EN LINUX. MODULO 2

Comprobar la cola de correo


Un servidor de correo gestiona la cola de los mensajes que debe distribuir. Esta cola es
similar a la cola de tareas de impresión, con la diferencia de que en lugar de enviar tareas
a una impresora, se envían mensajes de correo a otro ordenador o se almacenan en los
buzones de los usuarios locales. Esta tarea puede resultar muy compleja. Se le puede
pedir al servidor que distribuya muchos mensajes en muy poco tiempo, por lo que es
posible que tenga que retrasar el envío de algunos mensajes mientras trabaja en otros,
incluso pueden aparecer problemas que deriven en una incapacidad temporal o
permanente para enviar mensajes. Si el fallo es temporal, el servidor de correo guardará
el mensaje e intentara enviarlo más tarde. Por tanto, la cola de correo de un ordenador
puede contener mensajes no enviados. Identificar estos mensajes y gestionar la cola será
de utilidad para mantener la fluidez del subsistema de correo en un ordenador Linux.
El programa mailq es la principal herramienta para la administración de colas de correo.
Originalmente formaba parte del paquete sendmail aunque postfix, exim, qmail y otos
servidores SMTP tienen implementados comandos compatibles, pero las opciones de los
comandos difieren entre implementaciones. El comando sin opciones muestra el
contenido de la cola de correo en todos los sistemas:

Este ejemplo, tomado de un sistema que ejecuta postfix, muestra un mensaje de la cola
con información relevante para su identificación. El formato exacto varía de un servidor
SMTP a otro. Normalmente escribir mailq equivale a sendmail -bp.
Si la conexión de red se cae temporalmente o si un servidor de correo deja de estar
operativo durante un tiempo, los mensajes se amontonarán en la cola y el servidor SMTP
intentará redistribuirlos más adelante; si nuestra conexión vuelve a funcionar y deseamos
vaciar la cola de inmediato, en la mayoría de servidores SMTP escribiremos senmail q,
otros servidores tienen comandos equivalentes como postqueue en postfix o runq en
exim.
Todos los servidores de correo proporcionan opciones para priorizar el envío de correos,
aceptar mensajes por la línea de comandos, borrar mensajes específicos de la cola,
depurar conexiones de correo, etc. Lamentablemente, los comandos y procedimientos

Academy Xperts Bolivia


78
EX - LINUX EXPERTO EN LINUX. MODULO 2

que utilizan estas funcionalidades varían de un servidor a otro, por tanto, deberíamos
consultar la documentación de nuestro servidor para saber cómo utilizar estas
funcionalidades.
Redirigir el correo
Los alias de correo permiten utilizar una dirección en lugar de otra. Por ejemplo, se
supone que los servidores de correo mantienen una cuenta llamada postmaster, cuyo
correo debería leer la persona que mantiene el sistema. Una manera de hacerlo es
configurar un alias que enlace el nombre postmaster con el nombre de una cuenta real.
Esto se hace editando el fichero aliases que suele estar en /etc o a veces /etc/mail. Su
formato es bastante intuitivo, las líneas de comentario empiezan con almohadilla (#) y el
resto adoptan la siguiente forma:

El nombre es un nombre local, como postmaster. Cada dirección (dir1, dir2, etc) puede
ser un nombre de cuenta local al que reenviar los mensajes, el nombre de un fichero local
en el que guardarlos (denotado por una barra inicial), un comando por el que se
canalizarán los mensajes (denotado por una barra vertical), el nombre de un fichero cuyo
contenido se trata como una serie de direcciones (denotado por una cadena: include:
inicial) o una dirección de correo completa.
La configuración por defecto incluye unos cuantos alias útiles para cuentas como
postmaster. La mayoría de estas configuraciones asocian a root la mayoría de estos alias.
No se recomienda leer el correo como root, ya que incrementa las posibilidades de crear
una fisura en la seguridad u otros problemas debidos a un error de escritura o un bug del
lector de correo; es aconsejable definir una línea de alias como la siguiente:

Academy Xperts Bolivia


79
EX - LINUX EXPERTO EN LINUX. MODULO 2

Esto redirecciona todo el correo de root a nombre_de_usuario, que puede adoptar


cualquiera de las formas que acabamos de describir. Algunos servidores como sendmail,
postfix y qmail requieren que se compile /etc/aliases en un fichero binario que se procesa
más rápidamente. Para ello utilizaremos el comando newaliases.
Otra manera de redirigir el correo es hacerlo a nivel de usuario. Podemos editar el fichero
~/.forward del directorio home de un usuario para que el correo de éste se envíe a otra
dirección. El fichero debería contener específicamente la nueva dirección: bien un
nombre de usuario del ordenador o bien una dirección de correo completa de otro
ordenador. La ventaja de este sistema es que lo pueden utilizar los usuarios particulares
para, por ejemplo, unificar el correo de varios sistemas en una cuenta sin molestar a los
administradores de sistemas. La desventaja es que se puede utilizar para definir alias de
cuentas no existentes o para cuentas que carecen de directorios home. ~/.forward lo
puede cambiar o borrar el propietario de la cuenta, algo no deseable si queremos
implementar una regla de redirección que el usuario no pueda invalidar.
Proteger el servidor de correo
Como cualquier otro servidor, un servidor de correo es un riesgo potencial para la
seguridad. Por regla general este riesgo adopta dos formas:
- Errores (bugs): en teoría, un bug podría permitir a alguien obtener acceso a
nuestro sistema enviando un correo o conectándose al puerto SMTP 25 mediante
un cliente telnet y escribiendo comandos SMTP para aprovecharse del error. Hoy
en día las distribuciones reducen el acceso al servidor de correo a sólo el
ordenador local.
- Configuración defectuosa: los servidores de correo no están diseñados para
proporcionar acceso, por lo que es poco probable obtener un acceso completo. El
riesgo está en una configuración que haga que nuestro sistema sea una amenaza
para Internet. La configuración defectuosa más habitual es un open relay, que
consiste en un ordenador que transmite el correo de un ordenador a otro. En el
pasado, los spammers se aprovechaban de este tipo de sistemas para ocultar sus
identidades, hoy en día se utilizan otras técnicas. Aun así, algunos aún abusan de
los open relays.
Para protegerse de los bugs nos aseguraremos de que el servidor de correo esté
actualizado con la última versión. Las principales distribuciones configuran los servidores
de correo evitando los open relays, aun así, una configuración defectuosa puede dejar
abierto el servidor de correo. Hay sitios web que permiten comprobar estas
configuraciones, por ejemplo, http://www.abuse.net/relay.html o
http://www.spamhelp.org/shopenrelay permiten asegurarnos de que nuestro sistema no es
un open relay. Estos sitios y otros similares ejecutan una serie de pruebas que intentan
transmitir correos a través de nuestro servidor. Si el servidor está configurado
adecuadamente, la página nos informará de que no ha podido conectarse o enviar los
correos. Pero si el sitio ha podido transmitir el correo, deberíamos buscar información
para configurar adecuadamente nuestro servidor. Los pasos necesarios para proteger un
open relay varían según el servidor y requieren una configuración relativamente
avanzada. Podemos descubrir cómo cerrar configuraciones open relay en la

Academy Xperts Bolivia


80
EX - LINUX EXPERTO EN LINUX. MODULO 2

documentación de nuestro servidor de correo.


2.3.4. Gestión de impresión e impresoras
La mayoría de usuarios de escritorios Linux trabajan con X, pero algunos lo hacen con
otro medio de salida: las páginas impresas. La impresión es un trabajo entre varias
herramientas, las cuales envían tareas como documentos PostScript. Sin embargo, los
sistemas Linux no están conectados directamente a impresoras PostScript. El programa
Ghostscript convierte la tarea de impresión, de forma que la impresora del sistema pueda
controlarla. La cola de impresión la gestiona CUPS y, después, es enviada a la impresora
como una tarea. Se puede examinar y modificar el contenido de la cola de impresión en
varias etapas.
Conceptualización de la arquitectura de impresión de Linux
La impresión en Linux se construye alrededor del concepto de cola de impresión, una
especie de área en la que los ficheros esperan el momento de la impresión. Un ordenador
puede admitir varias colas de impresión distintas, que suelen corresponder a impresoras
físicas diferentes, aunque también se pueden configurar varias colas para que se
impriman de manera distinta en la misma impresora. Las tareas de impresión las envían
los usuarios mediante el programa lprI, ya sea de manera directa o dejando que otro
programa realce la llamada; lpr enviará la tarea a una cola específica. La cola suele ser un
subdirectorio de /var/spool/cups. El demonio CUPS se ejecuta en segundo plano y
permanece a la espera hasta que se le envíen las tareas de impresión; acepta tareas de
impresión de lpr o de ordenadores remotos, colas de impresión de monitores y hace de
“agente de trafico”, es decir, dirige las tareas de impresión de una manera ordenada de
las colas de impresión a las impresoras.
Los sistemas más antiguos empleaban LPD (Demonio de impresión en línea) o los
sistemas de impresión LPRng. Muchas herramientas de CUPS son similares a las de
LPD. Si utilizamos un sistema que ejecuta LPD o LPR, los comandos de usuario como lpr
funcionan de la manera esperada, pero la configuración de la impresora se debe hacer de
manera diferente.
Una característica importante de Linux es que está orientado a la red y, por lo tanto, las
herramientas de impresión pueden aceptar tareas que se le envían mediante protocolos
de red, aunque normalmente no utilizan hardware de red. De este modo, incluso un
ordenador sin red puede imprimir. CUPS puede funcionar como cliente, pasándole las
tareas de impresión a otros ordenadores que ejecutan los mismos protocolos. Las
aplicaciones pueden consultar CUPS acerca de las prestaciones de las impresoras. Los
antiguos sistemas LPD y LPR no admitían la comunicación bidireccional, por lo que el
soporte para estas características sigue sin ser universal. Existen programas que hacen
suposiciones sobre las prestaciones de la impresora, pero necesitan otros programas que
puedan averiguarlas.
PostScript y Ghostscript
En Linux, el driver de impresión es parte de Ghostscript que, a su vez, forma parte de la
cola de impresión en su parte final. Esta relación puede resultar confusa, pues no todas
las aplicaciones o impresoras necesitan Ghostscript. Ghostscript hace de medio para

Academy Xperts Bolivia


81
EX - LINUX EXPERTO EN LINUX. MODULO 2

traducir PostScript, un lenguaje común de las impresoras, a formatos inteligibles para


muchas impresoras diferentes. Es importante conocer las capacidades de Ghostscript y
cómo encaja este en una cola de impresión.
PostScript: El lenguaje de impresora de Linux
Las primeras impresoras láser (de la década de los 80) incorporaban lo que por entonces
era un nuevo y potente lenguaje para impresión: PostScript, lo que provocó que se
hicieran populares entre los sistemas UNIX del momento. Las colas de impresión de UNIX
se diseñaron sin tener en cuenta los drivers de tipo Windows, por lo que los programas
UNIX de las impresoras láser se desarrollaron para generar directamente una salida
PostScript. Llegó a ser el estándar para la impresión en UNIX, algo que heredo Linux.
Algunos programas (sobre todo en sistemas Windows) no siguen este estándar y pueden
generar salida como texto sin formato, raramente supone un gran problema para las
impresoras modernas, pero nos sirve para algunos de los modelos que sólo admiten
PostScript. Hay programas que pueden producir una salida PostScript o PCL (lenguaje de
control de impresoras) para impresoras láser HP o sus muchas imitadoras. Muy pocos
programas pueden generar una salida que otros tipos de impresora puedan aceptar
directamente. Este problema con PostScript es poco habitual en las impresoras de un
rango de precios bajo o medio que se suelen asociar a Linux. Para imprimir en dichas
impresoras con programas tradicionales que generan salida PostScript necesitaremos un
traductor y un modo que adapte dicho traductor a la cola de impresión, aquí es cuando
entra en acción Ghostscript.
Ghostscript: El traductor de PostScript
Si empleamos una impresora PostScript tradicional, el ordenador le envía un fichero
PostScript directamente. PostScript es un lenguaje de programación, aunque está
orientado a generar como salida una página impresa. Ghostscript es un intérprete que
toma la entrada de PostScript, la analiza y genera una salida en cualquiera de varias
decenas de formatos de mapas de bits diferentes, incluyendo formatos válidos para
impresoras que no son PostScript. Ghostscript es un medio para convertir impresoras
económicas en impresoras PostScript de bajo coste compatibles con Linux, está
disponible como software de código abierto (GNU Ghostscript), con una variante más
avanzada (AFPL Ghostscript). Ambas son gratuitas, aunque AFPL Ghostscript no se
distribuye gratuitamente en ningún paquete comercial, las distribuciones Linux disponibles
en CD-ROM vienen con el antiguo GNU Ghostscript, válido para la mayoría de los
usuarios.
Una de las desventajas de Ghostscript es que genera ficheros de salida largos;
PostScript, sin embargo, genera una página llena de texto que ocupa sólo unos cuantos
KB. Si la página incluyese color, el tamaño de la salida Ghostscript sería mucho mayor.
De alguna manera, esto carece de importancia, ya que los ficheros grandes sólo se
almacenan en el disco durante un periodo corto de tiempo; sin embargo, esto ralentiza la
llegada de los archivos desde el ordenador a la impresora. Algunas impresoras láser
pueden necesitar una ampliación de memoria para manejar los ficheros grandes.

Academy Xperts Bolivia


82
EX - LINUX EXPERTO EN LINUX. MODULO 2

Escoger la impresora apropiada para Linux


Si queremos una impresora rápida para Linux, escogeremos un modelo con PostScript
incorporado, sobre todo para salidas de tipo texto o dibujos sin colorear, que son los que
más sufren en el paso de PostScript a mapa de bits. Ghostscript funciona bien en
impresoras en blanco y negro de 600 dpi y velocidades de hasta 6 páginas por minuto. El
puerto paralelo y el USB 1.x deberían poder manejar velocidades de entre 3 y 5 veces
este valor. Si la impresora posee una velocidad mayor, puede que ni el paralelo ni el USB
1.x sean capaces de ofrecer el rendimiento necesario; USB 2.0 y ethernet pueden
controlar velocidades superiores, algo importante en las impresoras rápidas a color.
Las impresoras a color de inyección de tinta suelen estar más limitadas por la velocidad
de impresión del cabezal que por la velocidad de los datos que entran por sus puertos;
pocas de este tipo admiten PostScript. Algunos modelos vienen con motores PostScript
para Windows, similares a Ghostscript de manera conceptual, pero no se pueden utilizar
en Linux. Podemos encontrar información sobre qué impresoras pueden trabajar con
Ghostscript en la página web de OpenPrinting (www.linuxprinting.org/printer_list.cgi).
Integrar Ghostscript en la cola
Si queremos imprimir desde Linux en una impresora que no sea PostScrip, tendremos
que integrar Ghostscript en la cola de impresión empleando un filtro inteligente, un
programa al que se llama como parte del proceso de impresión. El filtro inteligente
examina el fichero a imprimir, determina su tipo y lo pasa por uno o varios programas
adicionales antes de que el software de impresión lo envíe a la impresora; este filtro se
puede configurar para que llame a Ghostscript con los parámetros necesarios para
generar la salida para la impresora de la cola.
CUPS tiene sus propios filtros inteligentes y los llama automáticamente cuando le
indicamos al sistema el modelo de la impresora; también proporciona una herramienta de
configuración de tipo web que permite configurar una impresora para CUPS de una
manera bastante intuitiva.
El resultado final de la configuración de una impresora en Linux es la posibilidad de
tratarla como una impresora PostScript, permitiendo que las aplicaciones con salida
PostScript puedan imprimir directamente en la cola; el filtro inteligente detecta esta salida
y la pasa por Ghostscript, así como otros tipos de fichero, que envía a los programas
pertinentes con el fin de generar una impresión razonable.
Si tenemos una impresora que pude procesar PostScript, probablemente esté implicado
un filtro inteligente, pero no pasará el PostScript por Ghostscript; en este caso, el filtro
inteligente pasará el PostScript directamente a la impresora y los demás tipos de ficheros
al procesamiento que sea necesario para convertirlos a PostScript.
Ejecutar un sistema de impresión
Los sistemas de impresión se ejecutan como demonios y se deben iniciar antes de ser
utilizados, normalmente a través de los scripts de inicio de /etc/rc.d/, /etc/init.d/ o
/etc/rc?.d/, donde ? es el número del modo de ejecución. Tendremos que buscar scripts
de inicio que contengan la cadena cups, lpd o lprng para saber lo que está ejecutando el

Academy Xperts Bolivia


83
EX - LINUX EXPERTO EN LINUX. MODULO 2

sistema. Si no estamos seguros de si el servidor de impresión está activo, podemos


utilizar ps para buscar el proceso por su nombre:

Este ejemplo muestra que cupsd, el demonio de cups, se está ejecutando, por lo que el
sistema está utilizando cups para la impresión. Si no conseguimos encontrar ningún
demonio de sistema de impresión en ejecución, tendremos que consultar la
documentación de la distribución para saber si hay uno disponible y comprobar si está
instalado. La mayoría de distribuciones incluyen scripts de inicio para ejecutar el demonio
de impresión al arrancar el ordenador.
Configurar cups
Cups tiene varios ficheros de configuración en el directorio /etc/cups y sus subdirectorios.
Podemos modificar estos ficheros directamente y de forma casi segura si deseamos
compartir impresoras o utilizar impresoras compartidas por otros sistemas cups; sin
embargo, el modo más sencillo de agregar impresoras a cups es utilizar la aplicación tipo
web.
Editar los ficheros de configuración de cups
En el fichero /etc/cups/printers.conf podemos añadir o eliminar impresoras a través de
definiciones. Una definición empieza por el nombre de la impresora junto con la cadena
DefaultPrinter (para la impresora por defecto) o Printer (para otra impresora) entre
corchetes angulares (<>):
<DefaultPrinter curso>
Esta línea es el comienzo de la definición de la impresora llamada curso; el final de la
definición sería </Printer>. Las líneas entre ambas definen diversas opciones de la
impresora, como cadenas identificadoras, ubicación de la impresora, estado actual, etc.
Estas opciones se pueden almacenar en ficheros PPD (definición de impresora
PostScript) que reciben el nombre de la cola y se almacenan en /etc/cups/ppd con formato
estándar. Para las impresoras PostScript podemos obtener el fichero PPD del fabricante,
aunque cups y sus paquetes de drivers contienen un gran número de ficheros PPD que se
instalan automáticamente cuando empleamos las utilidades de configuración web.
Es preferible utilizar las herramientas de configuración web de cups para añadir
impresoras en lugar de utilizar los ficheros de configuración. Podemos estudiar y
manipular los ficheros de configuración para no tener que recurrir a la herramienta web
para realizar un cambio menor. Una excepción a esta regla es la configuración de la
interface web de cups y la capacidad de cups para hacer de interfaz entre los demás
sistemas cups. La mayor ventaja es que utiliza IPP (protocolo de internet para impresión),
ademas de LPD y LPRng. La funcionalidad browsing (navegación) permite a los

Academy Xperts Bolivia


84
EX - LINUX EXPERTO EN LINUX. MODULO 2

ordenadores de una red intercambiar las listas de impresoras de manera automática, lo


que simplifica la configuración de impresoras en red. Puede que haya que hacer algún
ajuste en el fichero /etc/cups/cupsd.conf para activar esta característica, un fichero de
estructura similar al del servidor web apache que contiene varios bloques de configuración
que especifican qué otros sistemas deberían poder acceder a éste; cada bloque controla
el acceso a un lugar concreto del servidor y presenta este aspecto:
<Location /printers>
Order Deny,Allow
Deny from All
BrowseAllow from 127.0.0.1
BrowseAllow from 192.168.1.0/24
BrowseAllow from @LOCAL
Allow from 127.0.0.1
Allow from 192.168.1.0/24
Allow from @LOCAL
</Location>
Si estamos configurando una estación de trabajo con una impresora local que no
queremos compartir, o si queremos configurar ésta para que utilice las impresoras
compartidas a través de un protocolo distinto de IPP, no tendremos que ajustar
/etc/cups/cupsd.conf; pero si queremos acceder a las impresoras IPP remotas, tendremos
que definir la directiva Browsing On.
El sitio /printers controla el acceso a las impresoras. Los datos del ejemplo son los
siguientes:
- Directiva orden: esta línea le indica a cups el orden en el que se aplican las
directivas Allow y Deny; en este caso Allow modifica las directivas Deny.
- Política por defecto: la línea Deny from All le indica al sistema que rechace todas
las conexiones excepto las que estén explicitamente permitidas.
- Líneas de control de la navegación: las líneas BrowseAllow le indican a cups
desde qué sistemas debería aceptar las peticiones de navegación.
- Líneas de control de acceso: las líneas Allow permiten un acceso sin navegación
a las impresoras en los sistemas especificados, para poder así imprimir en las
impresoras locales a aquellos ordenadores no conectados a la red. Normalmente,
las líneas Allow son las mismas que BrowseAll.
Podemos crear una definición que utilice Allow from All y después crear líneas
BrowseDeny y Deny para limitar el acceso; sin embargo, el método mostrado en este
ejemplo es más seguro. También podemos especificar lugares distintos a /printers a
través del sitio /admin, que controla el acceso a las funcionalidades administrativas de
cups. Antes de las definiciones de ubicación de cupsd.conf, hay unos cuantos parámetros

Academy Xperts Bolivia


85
EX - LINUX EXPERTO EN LINUX. MODULO 2

que activan o desactivan la navegación y otras operaciones de red:


- Activar la navegación: la directiva Browsing acepta los valores On y Off. En cups
por defecto es On, pero hay distribuciones que la desactivan por defecto,
- Controlar el acceso a la navegación: la directiva BrowseAddress especifica la
dirección de multidifusión a la que se debe enviar la información de navegación;
por ejemplo, si la red es 182.168.1.0/24 tendremos que especificar BrowseAddress
192.168.1.255.
Una vez configurado el servidor cups permitiendo acceso a los demas sistemas de las
direcciones y los sitios pertinentes y una vez configurados los clientes para que empleen
la navegación a través de Browsing On, todos los sistemas de la red deberían detectar
automáticamente todas las impresoras de la red. Sólo tendremos que configurar la
impresora en el ordenador en el que esté conectada directamente y cups propagará
automáticamente las características de la impresora, además de los sitios de red y los
ficheros PPD. Esta funcionalidad es útil al configurar grandes redes con muchas
impresoras o en las que se agreguen y eliminen impresoras frecuentemente.
Obtener las definiciones de impresora de cups
La mayoría de distribuciones tienen un filtro inteligente de cups que admite varias
impresoras; si no encontramos la nuestra, podemos buscar definiciones que pueden
consistir en ficheros PPD, ademas de ficheros de driver de Ghostscript. Podemos obtener
estas definiciones de impresora de varias maneras:
- Nuestra distribución Linux: hay distribuciones con definiciones de impresora
adicionales bajo varios nombres, muchas incluyen algunos paquetes de drivers,
por lo que deberíamos buscar en la distribución un paquete de este tipo.
- Foomatic: es el conjunto de utilidades y definiciones de impresora del sitio web de
impresión de Linux; proporciona definiciones de impresora adicionales para cups y
otros sitemas de impresión. El sitio web es
http://www.linuxfoundation.org/en/OpenPrinting/Database/Foomatic.
- Guntenprint: estos drivers, originalmente conocidos GIMP Print, admiten una
amplia variedad de impresoras. Su sitio web es http://gimp-print.sourceforge.net.
- CUPS DDK: es el kit de desarrollo de drivers de cups, un conjunto de
herramientas diseñado para simplificar el desarrollo de driver con forma de
conjunto de drivers para impresorar HP y Epson. SU sitio web es
http://www.cups.org/ddk.
- Los fabricantes de impresoras: hay fabricantes que proporcionan drivers cups
para las impresoras. Normalmente se trata de los drivers Foomati, Guntenprint y
otros de código abierto; sin embargo, hay fabricantes que proporcionan drivers
propietarios, algunos de los cuales incluyen funcionalidades que los drivers de
código abierto no poseen.
Es probable que la instalación estándar incluya nuestra impresora, en particular si la
distribución instala los paquetes Foomatic o Gunterprint. De todos modos, si tratamos de
configurar la impresora y no localizamos nuestro modelo, tendremos que buscar un
conjunto adicional de definiciones entre los indicados en la lista.

Academy Xperts Bolivia


86
EX - LINUX EXPERTO EN LINUX. MODULO 2

Las utilidades web de CUPS


El sistema de impresión cups ipp está relacionado con el protocolo http. Es tan similar que
podemos acceder al demonio cupsdesde un navegador web; sólo tendremos que
especificar el puerto 631, el puerto normal para impresión. Introduciremos
http://localhost:631 en el navegador web del ordenador que ejecuta cups y, dependiendo
de los ajustes de cupsd.conf, puede que consigamos sustituir el nombre de host o
acceder a cups desde otro ordenador utilizando el nombre de host. Esta acción muestra
una lista de las tareas administrativas que podemos realizar:

Podemos añadir, eliminar o modificar colas de impresión a través del control web de cups.
Para añadir una impresora, seguiremos los pasos que se describen a continuación:
1. Desde la pantalla home o administraciónharemos click en Add Printer.
2. Se mostrará una página que solicita el nombre de impresora, su ubicación y su
descripción en los campos name, location y description, totalmente descriptivos,
por lo que podemos introducir lo que queramos. Suele utilizarse el valor del campo
name para acceder a la impresora. Cuando hagamos click en continue cups nos
preguntara por el dispositivo de impresión.
3. El dispositivo de impresión puede ser un puerto de hardware local, una impresora
LPD remota, una impresora SMB/CIFS remota u otro dispositivo; las opciones
disponibles varían según la distribución, seleccionaremos la apropiada de la lista
desplegable y haremos click en continuar.
4. Si hemos introducido una impresora de red, el resultado es una página en la que
tendremos que introducir la ruta completa del dispositivo. Por ejemplo,
lpd://printserv/brother imprime en la cola brother del ordenador printserv. Cuando
hayamos terminado pulsaremos continue.
5. Después de introducir el dispositivo local o de red, veremos una lista de
fabricantes de entre los que seleccionaremos uno para continuar. Podemos
apuntar directamente al fichero PPD, en este caso nos saltaremos el siguiente
paso.
6. Ahora cups muestra una lista completa de modelos de impresora del fabricante
seleccionado. Elegiremos el modelo apropiado y haremos click en continuar o
aportaremos un fichero PPD.
7. Si aún no hemos realizado otras tareas administrativas, cups nos pedirá nombre
de usuario y contraseña, escribiremos root como usuario y nuestra contraseña de
root. cups no encripta los datos y no deberíamos utilizarlo para administrar
impresoras remotamente, ya que las contraseñas quedarían expuestas a los
intrusos.
8. cups informará de que se ha añadido la impresora.
9. Si esperamos unos segundos, esta notificación se sustituirá por una página donde
podremos definir las opciones específicas de la impresora. Ajustaremos las que
necesitemos y haremos click en Set Printer Options.
El elemento printers de la parte superior de la página nos llevara a la lista de impresoras

Academy Xperts Bolivia


87
EX - LINUX EXPERTO EN LINUX. MODULO 2

donde nuestra impresora debería aparecer listada entre las colas existentes. Podemos
imprimir una página de prueba haciendo click en Print Test Page. Si este test no funciona,
tendremos que revisar la configuración de la impresora haciendo click en Modify Printer
que nos llevará a un proceso similar al de añadir una impresora, pero mostrando por
defecto los valores que previamente habíamos introducido, de manera que sólo será
necesario modificar aquellos que contengan errores.
Imprimir en impresoras en red
Si la impresora aloja muchos ordenadores Windows, podemos utilizar SMB/CIFS para
compartirla entre sistemas Windows. El servidor SAMBA de Windows implementa este
protocolo, por lo que podemos utilizarlo para compartir impresoras desde LInux. También
podemos imprimir en una cola de impresión SMB/CIFS desde un sistema Linux: para ello,
en la herramienta de configuración web de cups, en el paso 3, seleccionaremos una
impresora llamada “Windows Printer via SAMBA”, el formato de configuración en la
herramienta web no es obvio:
smb://nombreusuario:contraseña@SERVIDOR/RECURSO
Esto es un identificador uniforme de recursos (URI) para un recurso compartido
SMB/CIFS. Sustituiremos nombre de usuario, contraseña, servidor y recurso por los
valores apropiados, tras lo que deberíamos poder enviar tareas de impresión al recurso
SMB/CIFS. Cuando estas impresoras están configuradas en sistemas Windows, no
suelen ser modelos PostScript, por lo que tendremos que escoger un filtro inteligente
Linux y un driver Ghostscript local. En cambio, si están configuradas en sistemas Linux
que ejecutan SAMBA, con frecuencia se configuran para que hagan de impresoras
PostScript, lo que debería permitirnos escoger un driver PostScript para la impresora.

Si queremos imprimir en un servidor que utilice el protocolo LPD, el formaro de la URI es


similar pero sin usuario y contraseña:
lpd://nombrehost/cola
Si el servidor cups tiene desactivada la navegación, pondremos ipp:// en lugar de lpd://
para poder imprimir en el servidor cups.
En la práctica, puede que tengamos que decidir cuál de los 3 protocolos deberíamos usar
para imprimir (LPD, IPP o SMB/CIFS), ya que no todas las impresoras admiten todos,
aunque un servidor linux si podría trabajar con los 3. Por lo general, IPP es el más sencillo
de configurar, ya que admite la navegación y permite, así, que los clientes no necesiten
una configuración específica para controlar impresoras específicas. Esto hace de IPP la
mejor elección para la impresión de Linux a Linux si los dos utilizan cups. Si cups no está
en uso, LPD suele ser más fácil de configurar que SMB/CIFS y posee la ventaja de que
no necesita un nombre de usuario o una contraseña para controlar el acceso. SMB/CIFS
se basa en contraseñas, los clientes sulen almacenarlas en el disco sin encriptarlas, algo
que puede ser un lastre para la seguridad, en particular si utilizamos la misma cuenta para
imprimir y para otras tareas. Es más ventajoso para la seguridad almacenar una
contraseña en el servidor que en el cliente.

Academy Xperts Bolivia


88
EX - LINUX EXPERTO EN LINUX. MODULO 2

En términos generales, si los clientes son pocos y están bien protegidos, el uso de
contraseñas puede ser beneficioso mientras el servidor no esté expuesto a internet. Si los
clientes son numerosos y están expuestos a internet, siempre que el servidor de
impresión esté bien protegido, puede ser preferible un sistema de seguridad libre de
contraseñas que se basa en direcciones ip.
Desde la lista de colas de impresión también podemos hacer click en Configure Printer
para definir varias opciones de la impresora, aunque dependerán del tipo de impresora.
Las habituales son: la resolución, las mezclas de colores, el tamaño de papel, la
impresión a doble cara y la presencia de la página de encabezado.
Monitorizar y controlar la cola de impresión
Existen varias utilidades para enviar tareas de impresión, examinar y manipular una cola
de impresión de Linux. Utilizan, lpr, lpq, lprm y lpc, que emplean el parámetro -P para
especificar la cola de impresión.
Imprimir ficheros con lpr
El programa lpr envía las tareas de impresión a la cola de impresión. Acepta muchas
opciones que modifican sus acciones:
- Especificar un nombre de cola: -Pnombredecola permite especificar una cola de
impresión. Es útil si tenemos varias impresoras o si tenemos definidas varias colas
para una impresora.
- Borrar el fichero original: la opción -r permite que LPR elimine el fichero original
tras imprimirlo; de lo contrario, se envía una copia a la cola del fichero a imprimir y
se deja intacto el original.
- Suprimir el encabezado: -h suprime el encabezado para una tarea de impresión.
Las versiones antiguas de cups no incluyen esta opción.
- Especificar un nombre de tarea: las tareas de impresión tienen nombres para
identificarlas tanto en la cola como cuando se imprimen. El nombre suele ser el
nombre del primer fichero de la tarea de impresión, -J nombredetarea permite
cambiar este nombre, -C y -T son sinonimos de -J.
- Notificar a un usuario por correo: -m nombreusuario hace que LPD envie un
correo a nombredeusuario cuando la tarea finalice, las primeras versiones de cups
no incluían esta opción.
- Especificar el número de copias: el número de copias se puede especificar con
la opción -# número, donde número es el número de copias a imprimir.
lpr -Plexmark -m ljones report.txt

Este comando imprime el fichero report.txt en la cola lexmark y una vez terminado el
trabajo, avisa al usuario ljones.

El comando lpr es accesible para usuarios y para root. También recurren a él muchos
programas que necesitan imprimir directamente, como los programas gráficos y
procesadores de texto. Estos programas suelen incluir algún método de ajuste de
impresión. Hay programas que ofrecen un campo de introducción de texto donde
podemos escribir total o parcialmente comandos de lpr. Un programa útil para procesar un

Academy Xperts Bolivia


89
EX - LINUX EXPERTO EN LINUX. MODULO 2

fichero antes de enviarlo es mpage, que lee ficheros en texto plano o PostScript y les
vuelve a dar formato para que cada hoja impresa contenga varias páginas con un tamaño
reducido respecto al documento original. Es un buen modo de ahorrar papel, si no nos
importa reducir el tamaño del documento original. En prinicipio, se emplea igual que lpr:

mpage -Plexmark report.ps

Este comando imprime el fichero report.ps reducido a 4 páginas por hoja. Las opciones -1,
-2, -4 y -8 permiten especificar 1, 2, 4 u 8 páginas por cada página de salida. mpage
también puede controlar características como el tamaño de papel, la fuente a utilizar y el
rango de páginas del fichero de entrada a imprimir.

Mostrar la información de la cola de impresión con lpq

lpq muestra la información de la cola de impresión: cuántos ficheros contiene, su tamaño,


quiénes son los propietarios, etc. También podemos pasarle el nombre de usuario para
gestionar cualquier tarea de un usuario en particular. Si queremos examinar la cola,
ejecutaremos algo como lo siguiente:

lpq -Php400
hp4000 is ready and printing
Rank Owner Job File Total Size
active rodsmit 1630 file:/// 90112 bytes
De particular interés es el número de la cola, 1630 en este ejemplo. Utilizaremos este
número para borrar una tarea de la cola o reordenar las tareas para que se impriman. lpq
lo puede utilizar cualquier usuario.

Eliminar tareas de impresión con lprm

lprm elimina una o más tareas de la cola de impresión. Podemos ejecutar este comando:

- Si utilizamos lprm con un número, se entiende que dicho número es la id de la


tarea que se muestra en la salida de lpq.
- Si el usuario ejecuta BSD lprm y le pasa un guión (-) al programa, éste eliminará
todas las tareas que pertenezcan al usuario.
Este programa lo puede ejecutar root o un usuario normal, pero su capacidad varía
dependiendo de quién lo haga, ya que los usuarios sólo pueden eliminar de la cola
sus propias tareas, pero root puede eliminar cualquier tarea de cualquier usuario.
Controlar la cola de impresión
El sistema BSD lpd original proporciona un comando lpc que inicia, detiene y reordena
tareas dentro de las colas de impresión. cups proporciona un comando lpc que posee
pocas funcionalidades. En lugar de esta utilidad, deberiamos utilizar la interfaz web de
cups, que permite administrar las colas empleando el ratón:
- Podemos desactivar una cola haciendo click en Stop Printer en la interfaz web de
cups. Cuando lo hagamos, este enlace pasará a poner, Start Printer. El enlace

Academy Xperts Bolivia


90
EX - LINUX EXPERTO EN LINUX. MODULO 2

Jobs permite cancelar y gestionar determinadas tareas de alguna otra manera.


- Podemos utilizar una serie de comandos para controlar la cola: cupsenabled activa
una cola de impresión; cupsdisabled desactiva una cola y lpmove permite mover
una tarea de una cola a otra, éste último es útil cuando tenemos que cerrar una
cola por motivos de mantenimiento y tenemos que redirigir a otra impresora sus
tareas.

________________________________________________________________________

Tema 2.4: Fundamentos de Red


2.4.1 Fundamentos de los protocolos de internet
Las redes TCP/IP
Las redes implican varios componentes, como el hardware de red, los paquetes de datos
y los protocolos. Todos juntos componen la pila de red (network stack), la más común hoy
en día es la pila TCP/IP, aunque no es la única disponible.
Conocer las funciones básicas del hardware de red
El hardware de red permite que dos o más ordenadores se comuniquen entre sí. Los más
modernos tienen tarjetas de red integradas en la placa base, aunque también hay
disponibles tarjetas de red internas (PCI o ISA) y externas (USB, PCCard y similares).
Muchas redes se basan en cables que transmiten los datos entre máquinas con impulsos
eléctricos, también hay protocolos de red que utilizan ondas de radio o luz para transmitir
la información.
A veces, la línea que separa el hardware de red de los puertos de las interfaces
periféricas puede ser difusa. Por ejemplo, los puertos paralelos no suelen considerarse
puertos de red, pero cuando se utilizan con el protocolo PLIP (protocolo de interfaz en
paralelo), se convierten en un dispositivo de red. Algo más habitual es que un puerto USB
o un puerto serie RS-232 se conviertan en un interfaz de red cuando se utiliza con ppp
(protocolo punto a punto), normalmente en conjunción con un MODEM telefónico.
En esencia, el hardware de red facilita la transferencia de datos entre ordenadores. El
hardware que se utiliza con más frecuencia para la red incluye funcionalidades que
contribuyen a esta transferencia de varias maneras. Por ejemplo, se pueden incluir
medios para dirigir información destinada a ordenadores remotos específicos. Si tenemos
que recurrir a hardware que no es específico de red para que haga de dispositivo de red,
la ausencia de características específicas puede limitar la utilidad del hardware o requerir
software adicional para cubrir esta carencia. Si necesitamos usar software extra, es poco
probable que observemos las deficiencias, ya que los drivers del protocolo controlarán las
tareas; esto hará que el hardware sea más difícil de configurar y más propenso a
ralentizarse o a experimentar problemas.

Academy Xperts Bolivia


91
EX - LINUX EXPERTO EN LINUX. MODULO 2

Investigar los tipos de hardware de red


El hardware de red más común en Linux es ethernet, que presenta algunas variedades.
La más moderna utiliza un cableado de par tranzado (pares de cables tranzados) con el
fin de minimizar las interferencias. Estas variedades de ethernet vienen identificadas por
un subfijo -T añadido al nombre de la variedad de ethernet, como 10base-T o 100base-T,
los números indican la velocidad en Mb por segundo (Mbps). Hoy en día, la variante
1000base-T es capaz de obtener velocidades del 1000 Mbps, por lo que se ha convertido
en el estándar más utilizado.
Hay otros tipos de hardware de red que son menos comunes que ethernet, entre ellos
están Token Ring, LocalTalk, FDDI, HIPPI y fibre channel, interfaces de alta velocidad
utilizadas en aplicaciones de alto rendimiento. Estos protocolos admiten longitudes
máximas de cable superiores a ethernet, lo que los hace más adecuados para conexiones
con dispositivos que se encuentran a muchos metros de distancia e, incluso, kilómetros.
Las conexiones inalambricas (Wi-Fi) son una excepción al dominio de ethernet. Los
protocolos inalámbricos habituales son 802.11a con velocidad máxima de 11 Mbps,
802.11b y 802.11g con velocidad máxima de 54 Mbps y 802.11n con velocidades
máximas de hasta 300 Mbps. Con la excepción del raramente utilizado 802.11a, los
protocolos Wi-Fi son compatibles los unos con los otros, aunque la velocidad será la del
protocolo más lento utilizado. Este tipo de redes son útiles en ordenadores portátiles,
hogares y pequeñas oficinas que no poseen una infraestructura de cableado adecuada.
Advertencia: Si utilizamos un protocolo inalámbrico, los datos se transmitirán a través de
ondas de radio que se pueden interceptar con facilidad. Estos protocolos incluyen una
encriptación opcional que suele estar desactivada por defecto o utilizan variedades
especialmente pobres. Tendremos que asegurarnos de activar una encriptación WPA o
preferiblemente WPA2, ya que la encriptación WEP se supera con facilidad. Podemos
añadir una protección adicional utilizando un protocolo de encriptación fuerte, como una
herramienta de acceso por SSH o una encriptación SSL para transferir cualquier
información que consideremos mínimamente sensible. Debemos ser especialmente
cautelosos con la seguridad de las redes de acceso inalámbrico. En una configuración
típica, podría irrumpir un intruso en el punto de acceso de la red para después acceder al
resto de la red como cualquier otro usuario local.
Además del hardware de red de los ordenadores, necesitaremos hardware adicional fuera
de ellos. Con la excepción de las redes inalámbricas, necesitaremos alguna forma de
cableado de red que se ajuste a nuestro tipo de hardware. Muchos tipos de red requieren
el uso de un dispositivo central como un HUB o un Switch, al que se conectan todos los
ordenadores de una red local. El HUB o Switch se encargara de transmitir la información
entre los ordenadores.

Academy Xperts Bolivia


92
EX - LINUX EXPERTO EN LINUX. MODULO 2

Los Switch son superiores a los HUB, ya que los HUB redirigen todo el tráfico entre todos
los ordenadores mientras que los Switch son lo bastante inteligentes como para enviar
paquetes sólo al destino pertinente. Los Switch permiten transmisiones Full-Duplex, en las
que ambas partes pueden enviar información al mismo tiempo, los HUB sólo permiten
transmisiones Half-Duplex, en las que los dos ordenadores deben comunicarse por
turnos. Los Switch permiten a dos pares de ordenadores interconectarse para una
transferencia de datos a alta velocidad, con un HUB estas dos transferencias interferirían
entre sí.
Los ordenadores con adaptadores Wi-Fi pueden configurarse para que se comuniquen
entre ellos directamente, aunque lo más común es emplear un Router inalámbrico, que
conecta dispositivos tanto Wi-Fi como Ethernet. Estos Router también proporcionan
conexiones a una red de salida, que suele ser Internet, normalmente a través de una
conexión de banda ancha.
Los paquetes de red
Las redes modernas envían bloques de datos conocidos como paquetes en lugar de
enviar un fichero de una sola vez, el ordenador divide en pedazos dicho fichero y lo envía
al sistema receptor uno a uno. De este modo, si hay un error durante el envío de un
paquete, el ordenador podrá enviar de nuevo sólo dicho paquete en lugar del fichero
entero. Cuando el sistema receptor recibe el paquete, debe recomponer el orden correcto
para volver a crear el fichero recibido. No es raro que la transmisión se retrase o incluso
se pierdan paquetes, los procedimientos de recuperación de errores son críticos en los
protocolos que gestionan grandes transferencias. El hardware de red gestiona algunos
tipos de recuperación ante errores de manera transparente.
Existen diferentes tipos de paquetes y algunos se pueden almacenar dentro de otros. Por
ejemplo, ethernet incluye su propio tipo de paquete (frame), de esta forma los paquetes

Academy Xperts Bolivia


93
EX - LINUX EXPERTO EN LINUX. MODULO 2

generados por protocolos que se ejecutan sobre ethernet se almacenan dentro de frames
de ethernet. Una transferencia de datos puede implicar varias capas en las que se
encapsula y desencapsula la información, cada capa puede fusionar o dividir los paquetes
de la capa anterior.
Las pilas de los protocolos de red
La información sobre la red se puede dividir en varios niveles de abstracción; por ejemplo,
en un nivel una red transporta los paquetes de datos para un tipo de red específico, los
paquetes de datos se dirigen a ordenadores específicos de una red local. Esta descripción
permite entender una red local, pero no sirve de mucho para conocer los protocolos de
red de nivel superior, que se suelen describir en términos de comandos enviados en
ambos sentidos entre ordenadores; las referencias a los paquetes no son habituales. Otra
capa de la pila podría tomar estos paquetes y volver a empaquetarlos en frames. Las
distintas capas de cualquier pila de protocolo interactúan de maneras muy específicas.
Normalmente es posible intercambiar un componente por otro en una capa concreta. Por
ejemplo, podemos pasar de un cliente de correo a otro sin mucha dificultad, ya que ambos
se encuentran en el mismo nivel de la pila.
Cada ordenador de una transacción necesita un protocolo de pila compatible. Durante la
comunicación, los ordenadores transmiten los datos a sus respectivas pilas y después
envían sus datos a su sistema compañero, que a su vez le pasa los datos a su propia pila.
Cada capa del sistema receptor v los datos que ha empaquetado tienen su
correspondencia en el ordenador emisor. Las pilas se suelen representar con diagramas,
la que domina actualmente Internet es la pila del protocolo TCP/IP.

Los programas cliente de la capa de aplicación inician la transferencia de datos, las

Academy Xperts Bolivia


94
EX - LINUX EXPERTO EN LINUX. MODULO 2

peticiones pasan a través de las capas de transporte, Internet y de enlace del ordenador
cliente y, después, se envían al sistema servidor donde se invierte el proceso con el
programa servidor que se ejecuta en la capa de aplicación. Esta respuesta invierte el
recorrido, descendiendo por la pila del ordenador servidor hasta llegar a la pila del cliente.
Una conexión de red con todas las funcionalidades puede implicar muchas transferencias
de datos en ambos sentidos. Cada capa de las que componen el sistema emisor equivale
a una capa del sistema receptor, aunque no tienen por qué ser absolutamente idénticas.
Por ejemplo, podemos utilizar tipos de hardware de red totalmente diferentes como
ethernet o Token Ring siempre y cuando haya un sistema intermedio que funcione de
transductor entre ambos o podemos tener distintos modelos de tarjeta de red en la capa
de enlace. Los ordenadores pueden ejecutar distintos SO y utilizar pilas de protocolo
diferentes lógicamente equivalentes, lo importante es que las pilas trabajen de maneras
compatibles.
Linux está diseñado con TCP/IP en mente, Internet se creó sobre TCP/IP, aunque es
posible que nos encontremos con otras pilas de protocolo. NetBEUI era la pila de
Microsoft e IBM para Windows, AppleTalk era la pila inicial de Apple e IPX/SPX era la pila
preferente de Novell. Las tres tienen una importancia menor en la actualidad aunque
podemos encontrarlas en algunas ocasiones en entornos muy concretos, Linux admite
AppleTalk e IPX/SPX pero no NetBEUI.
Conocer los tipos de protocolos de TCP/IP
Dentro de TCP/IP existen varios protocolos diferentes que se pueden clasificar en una de
las capas de la pila TCP/IP. Los protocolos más importantes de las capas de Internet y de
transporte son los pilares de los protocolos de la capa de aplicación, que es con la que
interactúan más directamente, entre ellos se incluyen los siguientes:
- IP: el protocolo de Internet es el protocolo central de la red TCP/IP. Se encuentra
en la capa de Internet (capa de red o capa dos), transfiere los paquetes con un
método best effort, lo que significa que no se garantiza que los paquetes alcancen
su destino; además, pueden llegar desordenados o corrompidos. Hay otros
componentes de la pila que se encargan de estos problemas. IP es también la
parte de TCP/IP con la que se asocian las direcciones IP.
- ICMP: el protocolo de mensajes de control de Internet es un sencillo protocolo que
se suele utilizar con frecuencia para enviar mensajes de error entre ordenadores.
Esto se suele hacer modificando un paquete IP y devolviéndolo a su emisor. ICMP
es técnicamente un protocolo de la capa de Internet, aunque se basa en IP.
Normalmente, no usaremos programas que generan paquetes ICMP por
demanda, sino que se crearán automáticamente conforme utilicemos otros
protocolos. Una excepción es el programa ping.
- UDP: el protocolo de datagramas del usuario es más sencillo que los protocolos
TCP/IP habituales de la capa de transporte. No proporciona procedimientos para
corregir los paquetes desordenados, garantizar el envío ni, en general, mejorar las
limitaciones de IP. Esto significa que UDP puede ser más rápido que las
herramientas más sofisticadas que proporcionan tales mejoras a IP. Entre los
protocolos de la capa de aplicación que se construyen sobre UDP se incluyen
DNS, NFS y muchos protocolos de medios streaming.

Academy Xperts Bolivia


95
EX - LINUX EXPERTO EN LINUX. MODULO 2

- TCP: el protocolo de control de transmisión puede ser el protocolo de transporte


más ampliamente utilizado en la pila TCP/IP. A diferencia de UDP, crea
conexiones con comprobación de errores y otras funcionalidades que simplifican la
creación de protocolos de red que deben intercambiar grandes cantidades de
datos, aunque TCP supone una pequeña penalización para el rendimiento. La
mayoría de los protocolos de la placa de aplicación como SMTP, HTTP, FTP y
otros, se construyen sobre TCP.
El nombre de la pila TCP/IP está compuesto por los nombres de los protocolos TCP e IP
debido a que son muy importantes para las redes TCP/IP, que son mucho más que estos
dos protocolos. Incluyen protocolos adicionales que suelen estar por debajo de la capa de
aplicación y son bastante desconocidos. Por otra parte, un intercambio TCP/IP no tiene
por qué utilizar tanto TCP como IP, podría tratarse de un intercambio UDP o ICMP, por
ejemplo.
Las direcciones de red
El mecanismo básico para que dos ordenadores se comuniquen a través de una red lo
proporcionan las direcciones de red, que sirven para referenciar los ordenadores. Pueden
adaptar formas diferentes dependiendo del tipo de hardware de red, la pila de protocolos,
etc. Las redes grandes y dirigidas plantean retos adicionales a las direcciones de red que
resuelve TCP/IP. Para dirigir un programa específico a un ordenador remoto, TCP/IP
utiliza un número de puerto que identifica con un programa en ejecución específico.

La llegada de IPv6

IPv6 es una extensión de TCP/IP. IP ha estado en la versión 4 durante muchos años,


hoy en día hay una importante actualización que recibe el nombre de IPv6
(IP versión6).Incorpora varias funcionalidades y mejoras a TCP/IP, incluyendo soporte
estándar a las conexiones más seguras y la posibilidad de tener muchas más
direcciones. TCP/IP admite un máximo teórico de unos 4 billones de direcciones,
direcciones que no han sido distribuidas de la manera más eficaz posible. En
consecuencia, según Internet se ido expandiendo, el número de direcciones disponibles
se ha reducido rápidamente. IPv6 eleva el número de direcciones 2¹²⁸ . Hoy en día tiene
una presencia real en la red en muchas partes del mundo. El kernel Linuxincluye soporte
para IPv6 y la mayoría de distribuciones procuran
configurar automáticamente redes IPv6ademas de las IPv4. Configurar un sistema
para IPv6 es algo diferente a configurarlo para IPv4.

Utilizar direcciones de red


Cuando un frame sale de un ordenador se dirige a otra tarjeta ethernet empleando
funcionalidades de ethernet de bajo nivel, independientemente de la pila de protocolo.
Internet se compone de muchas redes diferentes que utilizan muchos componentes de
hardware diferentes. Por ejemplo, podemos tener una conexión telefónica por marcado y
conectarnos a un servidor que utilice ethernet y a otro que emplee Token Ring. Cada uno
de estos dispositivos utiliza un tipo diferente de direcciones de red. TCP/IP necesita algo
para integrar estos tipos diferentes de hardware de red, para lo que existen 3 tipos de
direcciones importantes que debemos conocer: las direcciones del hardware de red, las

Academy Xperts Bolivia


96
EX - LINUX EXPERTO EN LINUX. MODULO 2

direcciones IP numéricas y los nombres de host de tipo texto.


Direccionar el hardware
Una de las características del hardware de red dedicado es que lleva programadas
direcciones de red únicas conocidas como direcciones MAC en el caso de ethernet. Estas
direcciones tienen una longitud de 6 bytes y se suelen expresar como números en
hexadecimal (base 16) separados por dos puntos ( : ). Podemos descubrir estas
direcciones de hardware en una tarjeta ethernet mediante el comando ifconfig donde
veremos una línea como la siguiente:
eth0 Link encap:Ethernet HWaddr 00:A0:CC:24:BA:02
Esta línea indica que se trata de una tarjeta ethernet y que su dirección de hardware es
00:A0:CC:24:BA:02. Algunas utilidades y hardware de red utilizan estas direcciones de
hardware, como por ejemplo los switch, que las utilizan para dirigir paquetes de datos
detectando que una dirección en particular está conectada a un cable concreto y envía los
datos sólo a dicha dirección. DHCP es un medio para automatizar la configuración de
ordenadores específicos, una de sus opciones es emplear las direcciones del hardware
para asignar la misma IP a un ordenador concreto. Hay herramientas de diagnóstico que
permiten examinar los paquetes que proceden de o están dirigidos a direcciones de
hardware específicas. Normalmente no tendremos que preocuparnos de las direcciones
del hardware, en la mayoría de utilidades o programas no se accede a ellas, pero son
importantes por lo que hacen.
Linux identifica los dispositivos del hardware de red con códigos específicos según el tipo.
El hardware de ethernet es ethn, donde n es un número que va de cero en adelante. Los
dispositivos inalámbricos tienen nombres con la forma wlann. A diferencia de la mayoría
de los dispositivos de hardware, los dispositivos de red no tienen entradas en /dev, sino
que las utilidades de red de bajo nivel toman los nombres de los dispositivos y trabajan
con ellos directamente.
Administrar direcciones IP
IPv4 admite unos 4 billones de direcciones pero no todas pueden ser utilizadas, algunas
están ya asociadas a definiciones de red o bien están reservadas, las direcciones de 4
bytes de IPv4 y las direcciones de 6 bytes de ethernet no están relacionadas
matemáticamente, en realidad, la pila TCP/IP realiza conversiones entre ambas utilizando
ARP para IPv4 o NDP para IPv6 . Estos protocolos permiten que un ordenador envíe una
consulta a través de un mensaje que se envía a todos los ordenadores de la red
(radiodifusión). Cuando obtenemos una respuesta, incluye la dirección de hardware, por lo
que la pila TCP/IP puede dirigir el tráfico para una IP dada a la dirección del hardware del
ordenador de destino. Si el ordenador no se encuentra en la red local, el proceso es
mucho más complejo, ya que implica el uso de un router. Los ordenadores locales envían
a los routers los paquetes destinados a las direcciones distantes, los cuales envían a su
vez los paquetes a otros routers o a sus sistemas de destino.
Las direcciones IPv4 se suele expresar como 4 números en base decimal (0 – 255)
separados por puntos. Si la pila de nuestro sistema ya está funcionando podemos ver
nuestra dirección IP con el comando ifconfig. La salida incluye una línea como la siguiente

Academy Xperts Bolivia


97
EX - LINUX EXPERTO EN LINUX. MODULO 2

donde se identifica la dirección IP:


inet addr:192.168.29.39 Bcast:192.168.29.255 Mask:255.255.255.0
Las direcciones IP se dividen en dos componentes: una dirección de red y una dirección
de ordenador. La dirección de red identifica un bloque de direcciones IP utilizadas por una
red física; la dirección de ordenador identifica a un pc dentro de dicha red. Esta
separación facilita la tarea de los routers, que no tienen así que guardar los destinos de
los 4 billones de direcciones IP, los routers están preparados para dirigir el tráfico en
función de las direcciones de red de los paquetes.Normalmente, un ordenador solo puede
comunicarse directamente con los ordenadores de su segmento de red local, para
comunicarse con los que se encuentran fuera de ese conjunto, se debe utilizar un router.
Las direcciones IPv6 (128 bits) constan de ocho grupos de números hexadecimales de
cuatro dígitos separados por dos puntos ( : ). Si uno o varios grupos de cuatro dígitos son
0000, este o estos se pueden omitir, indicándolo con “::”. Sólo podemos comprimir de
esta manera un grupo de ceros, ya que de lo contrario no habría manera de saber
cuántos conjuntos de ceros hay que sustituir en cada grupo.
La máscara de red es un número que identifica la parte de dirección IP que es una
dirección de red y la que es una dirección de ordenador; se expresan en base10 y suelen
consistir en valores 255 o 0, correspondiendo 255 a un byte de red y cero a un byte de
ordenador. Si un byte es en parte dirección de red y en parte dirección de ordenador,
tendremos algún otro valor. También podemos expresar la más de red con un único
número que representa el número de bits de red en la dirección, suele indicarse con una
barra para separarlo de la dirección IP, por ejemplo, 192.168.29.39/24 que equivale a
192.168.29.39 con máscara de red 255.255.255.0.La notación que muestra los cuatro
bytes de la máscara de red se conoce como notación dotted quad. Las máscaras de red
IPv6 funcionan exactamente igual, con la diferencia de que los números son más largos y
que en IPv6 se tiende a utilizar notación hexadecimal.
Hoy en día, la máscara de red se suele describir en la forma CIDR (enmascaramiento
inter-dominios sin clases), separado por cualquier bit para cualquier dirección, por
ejemplo, 192.168 puede tener una máscara de red 255.255.0.0, 255.255.255.0,
255.255.255.128 o muchos otros valores. Tradicionalmente, las redes IPv4 se han
dividido en varias clases. Las clases A, B y C son para uso general de la red. Las
direcciones de clase D están reservadas para multidifusión. Las direcciones de clase E se
reservan para un uso futuro. La mayoría de estos rangos tienen casos especiales, como
por ejemplo las direcciones 127.x.y.z, que están reservadas para los dispositivos de
circuito cerrado haciendo referencia al ordenador en el que se introduce la dirección. Las
direcciones con todos sus bits de máquina con valor 1 hacen referencia al propio bloque
de red y se utilizan para multidifusión. La dirección multidifusión exhaustiva es
255.255.255.255, que envía información a todos los ordenadores de un segmento de red
(los router suelen bloquear los paquetes dirigidos a esta dirección).

Academy Xperts Bolivia


98
EX - LINUX EXPERTO EN LINUX. MODULO 2

Clase Rango de direcciones Direcciones privadas reservadas

A 1.0.0.0 – 127.255.255.255 10.0.0.0 – 10 .255.255.255

B 128.0.0.0 – 191.255.255.255 172.16.0.0 – 172.31.255.255

C 192.0.0.0 – 223.255.255.255 192.168.0.0 – 192.168.255.255

D 224.0.0.0 – 239.255.255.255 Ninguna

E 240.0.0.0 – 255.255.255.255 Ninguna

Dentro de cada clase de uso general existe un rango de direcciones reservado para el uso
privado. La mayoría de las IP se asignan a ordenadores individuales por uno autoridad
apropiada y así evitar que dos sistemas utilicen la misma dirección en Internet. Por el
contrario, cualquiera puede utilizar las direcciones privadas reservadas. Debemos tener
en consideración que los routers se suelen deshacer de los paquetes enviados a estas
direcciones aislándolas de Internet en bloque. La idea es que las pequeñas redes
privadas puedan utilizar estas direcciones con seguridad. Hoy en día se utilizan tras
routers NAT, permitiendo a un número arbitrario de ordenadores ocultarse tras un único
sistema. El router NAT sustituye su propia dirección IP en los paquetes salientes y dirige
la respuesta al sistema correcto, algo útil para conectar a Internet más ordenadores que
direcciones IP de las que disponemos.
IPv6 posee un equivalente a las direcciones privadas, las locales del sitio se pueden dirigir
dentro de una red pero no hacia fuera. Comienzan con los números hexadecimales fec,
fed, fee o fef. Las direcciones de enlace local están restringidas a un único segmento de
red y comienzan por los números hexadecimales fe8, fe9, fea o feb.
Las clases IPv4 se crearon para simplificar el enrutamiento pero, según Internet fue
creciendo, se volvieron restrictivas. Hoy en día sirven principalmente para definir
máscaras por defecto; la mayoría de herramientas de configuración definen estas
máscaras de red de forma automática. La dirección IP y la máscara de red son
extremadamente importantes para la configuración de la red. Si nuestra red no utiliza
DHCP o algo similar, tendremos que configurar manualmente las direcciones. Un error en
dicha configuración puede provocar un fallo completo de la red o la incapacidad de
comunicarse con algunos ordenadores.
Las pilas que no son TCP/IP tienen sus propios métodos de direccionamiento. NetBEUI
utiliza los nombres de máquina, no posee un método de direccionamiento numérico
independiente. AppleTalk utiliza dos números de 16 bits. Estos esquemas de
direccionamiento son independientes de las direcciones IP.

Academy Xperts Bolivia


99
EX - LINUX EXPERTO EN LINUX. MODULO 2

Multidifusión de datos
La multidifusión es un tipo de transmisión en red que se envía a todos los ordenadores de
la red local, o, a veces, a todos los ordenadores de una red remota. TCP/IP lleva a cabo la
multidifusión especificando valores 1 binarios en todos los bits de máquina de la dirección.
La parte de red de la dirección se configura con el valor normal de la red, algo obligatorio
en las multidifusiones dirigidas, que son las que se envían a una red remota (muchos
routers rechazan este tráfico). En muchos casos, las multidifusiones se especifican
utilizando 255.255.255.255 como dirección IP, los paquetes dirigidos a esta dirección se
envían a todas las máquinas de una red local. Ya que la dirección de multidifusión viene
determinada por la dirección IP y la máscara de red, podemos realizar conversiones entre
la dirección de multidifusión y la máscara de red si conocemos una de ellas y la dirección
IP de un ordenador. Si la máscara de red está compuesta por valores de bytes completos
(0 o 255) la conversión es sencilla: sustituiremos los componentes de la dirección IP que
tengan valores cero en la máscara de red por valores 255 para obtener la dirección de
multidifusión. Por ejemplo, si tenemos la IP 172.24.21.201 y la máscara 255.255.0.0 los
dos últimos elementos de la máscara tienen valor cero, si intercambiamos estos por
valores 255 obtendremos la dirección de multidifusión 172.24.255.255.
En el caso de una dirección CIDR que posee valores distintos a 255 en la máscara de red,
la situación será más compleja porque tendremos que recurrir a números binarios. Por
ejemplo, si tenemos la dirección 172.24.21.201 y la máscara 255.255.128.0 (es decir
172.24.21.201/17), expresado en binario estos números son:
10101100 00011000 00010101 11001001
11111111 11111111 10000000 00000000
Para crear la dirección de multidifusión definiremos los valores superiores (dirección de
red) como 1, cuando los inferiores (mascara de red) sean 0. El resultado es:
10101100 00011000 01111111 11111111
Si realizamos la conversión a notación en base10 la dirección sería 172.24.127.255.
Raramente tendremos que realizar cálculos de este tipo. Al configurar el ordenador
introduciremos la dirección IP y la máscara de red y dejaremos que el ordenador haga los
cálculos binarios.
Puertos de red
Además de la dirección del ordenador a contactar, hace falta otro tipo adicional de
direccionamiento: el emisor debe tener una dirección para un programa específico en el
sistema remoto, por ejemplo, supongamos que tenemos un navegador web, puede que el
ordenador del servidor web esté ejecutando otros servidores, como por ejemplo SMTP o
FTP. Agregaremos otro número a las direcciones IP para dirigir el tráfico al servidor web.
Este número es el puerto de red, los programas que acceden a una red TCP/IP suelen
hacerlo a través de uno o más puertos. Los números de puerto son características de
UDP y TCP, hay protocolos como ICMP que no usan número de puerto.
Los servidores se asocian automáticamente a puertos específicos definidos por
convención y asociados a programas específicos del servidor. Un cliente puede dirigir su

Academy Xperts Bolivia


100
EX - LINUX EXPERTO EN LINUX. MODULO 2

petición a un puerto específico y esperar a contactar con el servidor apropiado, el número


de puerto del cliente no es fijo, sino que lo asigna el SO. Ya que es el cliente quien inicia
la transferencia, incluye su propio número de puerto en la petición de conexión, por lo que
los clientes no necesitan números de puerto fijos. Esta asignación dinámica del puerto del
cliente permite a un ordenador ejecutar varias instancias de un mismo cliente de modo
que no compitan por un único puerto.

Número TCP o
Uso Servidores Linux de ejemplo
de puerto UDP

20 TCP Datos FTP ProFTPd, VSFTPd

21 TCP FTP ProFTPd, VSFTPd

22 TCP SSH OpenSSH, Dropbear

23 TCP Telnet in.telnetd

25 TCP SMTP sendmail, postfix, exim, qmail

TCP y
53 DNS BIND, djbdns
UDP

67 UDP DHCP ISC, DHCP (DHCPd)

80 TCP HTTP Apache, roxen, thttpd

110 TCP POP3 Dovecot, Qpopper, popa3d

TCP y NFS, NIS y otros servicios basados


111 Mapeador de puertos
UDP en RPC

113 TCP auth/ident identd

InterNetNews (INN), Diablo,


119 TCP NTTP
LeafNode

139 TCP NetBIOS session SAMBA

143 TCP IMAP Dovecot, Cyrus IMAP, UW-IMAP

161 UDP SNMP Net-SNMP

177 UDP XDMCP XDM, KDM, GDM

Academy Xperts Bolivia


101
EX - LINUX EXPERTO EN LINUX. MODULO 2

389 TCP LDAP OpenLDAP

443 TCP HTTP sobre SSL Apache, Roxen

445 TCP Microsoft Directory Services SAMBA

SMTP sobre SSL o URL


rendezvous directory (URD)
Este puerto
esta restringido oficialmente
sendmail, postfix, exim, qmail o
465 TCP para URD.
routers de red
Aunque se suele utilizar para
el envió
seguro de correos de forma
extraoficial.

Protocolo de impresión de
631 TCP CUPS
Internet

993 TCP IMAP sobre SSL Dovecot, Cyrus IMAP, UW-IMAP

995 TCP POP-3 sobre SSL Dovecot, Qpopper, popa3d

5900+ TCP Remote framebuffer (RFB) VNC: OpenVNC, TightVNC

6000 –
TCP El sistema XWindow (X) X.org-X11, XFree86
6007

Una diferencia clave de los puertos TCP/IP es la existente entre puertos con y sin
privilegios. Los puertos con privilegios son los inferiores a 1024, puertos que tienen
restringido el acceso, sólo root puede acceder a ellos. La intención es que un cliente se
conecte a un puerto con privilegios con la seguridad de que el servidor que se ejecuta en
ese puerto está configurado por el administrador del sistema. Hoy en día, la confianza no
se puede basar únicamente en el puerto, por lo que esta distinción no resulta muy útil. Los
usuarios pueden acceder a los puertos superiores al 1024.
En un funcionamiento básico no tendremos que hacer nada para configurar los puertos en
un sistema Linux, aunque puede que lo necesitemos si utilizamos servidores poco usuales
que necesitan una configuración para que el servidor pueda enlazarse con los puertos
correctos. Esto implica, a veces, la modificación del fichero /etc/services, que asocia
números de puerto a nombres, permitiendo utilizar dichos nombres en las configuraciones
de servidores y en otros sitios, este fichero contiene líneas que empiezan con un nombre

Academy Xperts Bolivia


102
EX - LINUX EXPERTO EN LINUX. MODULO 2

y terminan con un número de puerto, incluyendo el tipo de protocolo utilizado (TCP o


UDP):
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
smtp 25/tcp

2.4.2 Configuración básica de la red


Configurar Linux para una red local
La mayoría de distribuciones ofrecen medios para configurar la red durante la instalación
del sistema. Lo más normal es que la red ya esté en funcionamiento en nuestro sistema,
de no ser así, podemos hacer una configuración mediante DHCP o direcciones IP
estáticas. Los mecanismos de configuración de red de Linux se basan en scripts de inicio
y sus ficheros de configuración, también es posible utilizar herramientas GUI para
configurar la red.
Configuración del hardware de red
Poner en funcionamiento el hardware de red, en la mayoría de los casos, es una tarea
bastante automatizada. La mayoría de las distribuciones vienen con scripts de inicio del
sistema que detectan automáticamente la tarjeta de red y cargan el módulo del driver
correspondiente. Si recompilamos el kernel, tendremos que asegurarnos de compilar el
driver correcto en el fichero principal del kernel para que se cargue al inicio del sistema.
Si el hardware no se detecta correctamente tendremos que cargar el driver del hardware
de red utilizando el comando modprobe.

Configuración con DHCP


DHCP es la manera más fácil de configurar un ordenador en una red TCP/IP, pues
permite a un ordenador gestionar los parámetros de muchos otros ordenadores. Cuando
un ordenador que ejecuta un cliente DHCP arranca, envía una multidifusión en busca de
un servidor DHCP. El servidor responde a la dirección del hardware del cliente con la
información de configuración que el cliente necesita para unirse a la red, sobre todo, la
dirección IP, la máscara de red, las direcciones de la puerta de acceso y el servidor DNS.
El servidor DHCP también puede proporcionar un nombre de host. El cliente se
configurará automáticamente con los parámetros recibidos. La IP asignada no es
permanente, sino temporal (DHCP lease). Si la IP no se renueva, el servidor podría
asignársela a otro ordenador, por lo que el cliente consulta al servidor de vez en cuando
para efectuar la renovación.
Los tres clientes DHCP más habituales en Linux son: pump, dhclient y dhcpcd (que no
hay que confundir con el servidor dhcpd). Las distribuciones pueden incluir uno o incluso

Academy Xperts Bolivia


103
EX - LINUX EXPERTO EN LINUX. MODULO 2

los tres, pero todas tienen un cliente DHCP por defecto que se instala cuando se le indica
al sistema que se quiere utilizar DHCP durante la instalación. Si la distribución viene con
varios clientes, podremos intercambiarlos sin ningún problema. Lo ideal es que el cliente
DHCP se ejecute en el inicio del sistema, lo que se suele controlar desde su propio fichero
de inicio SysV o como parte del fichero de inicio principal de configuración de la red.
Frecuentemente, el sistema posee una línea en un fichero de configuración para
determinar si debe ejecutar un cliente DHCP, en Red Hat y Fedora esta opción se define
en el fichero /etc/sysconfig/network-scripts/ifcfg-eth0 (el nombre del fichero puede diferir
según el número de interfaz ethernet). La línea en cuestión presenta el siguiente aspecto:
BOOTPROTO= dhcp
Si BOOTPROTO está configurado con algún otro valor y lo modificamos, como en el
ejemplo anterior, el sistema utilizará DHCP, aunque suele ser más fácil utilizar una
herramienta GUI para definir esta opción. Ubuntu utiliza el fichero /etc/network/interfaces
para el mismo fin, aunque los detalles difieren. La línea en cuestión para este archivo es
como la siguiente:
iface eth0 inet dhcp
Una vez configurado el cliente DHCP para ejecutarse durante el arranque del sistema, la
tarea de configuración habrá finalizado, si todo funciona como esperamos. En muy raras
ocasiones tendremos que modificar los parámetros de DHCP para resolver alguna
incompatibilidad entre cliente y servidor o para que el cliente DHCP haga algo inusual.
Para ello, probablemente, tendremos que modificar el script de inicio SysV o el fichero al
que haga referencia para cambiar su funcionamiento.
Si necesitamos ejecutar un cliente DHCP a mano lo haremos escribiendo su nombre
como root, seguido opcionalmente de un identificador de red, como por ejemplo, dhclient
eth0, para hacer que el cliente DHCP intente configurar eth0 con la ayuda del servidor
DHCP que encuentre en la red.
Configuración con una dirección IP estática

SI la red no tiene un servidor DHCP, tendremos que configurar manualmente el


ordenador. Estas opciones podemos configurarlas mediante comandos interactivos. Si
queremos configurarlas a largo plazo, ajustaremos ficheros de configuración como
/etc/sysconfig/network-scripts/ifcfg-ethx (donde X es el número de dispositivo) o
/etc/network/interfaces. El siguiente listado muestra un fichero típico ifcfg-eth0 configurado
con una IP estática.
DEVICE= eth0
BOOTPROTO= static
IPADDR=192.168.29.39
NETMASK=255.255.255.0

Academy Xperts Bolivia


104
EX - LINUX EXPERTO EN LINUX. MODULO 2

NETWORK=192.168.29.0
BROADCAST=192.168.29.255
GATEWAY=192.168.29.1
ONBOOT=yes
La configuración de IP estáticas requiere varios elementos específicos necesarios o que
resultan de utilidad:
- Dirección IP: podemos definir la IP manualmente con el comando ifconfig o a
través del elemento IPADDR del fichero de configuración.
- Máscara de red: podemos definirla manualmente con el comando ifconfig o a
través del elemento NETMASK del fichero de configuración.
- Dirección de la puerta de acceso: se puede definir manualmente con el
comando route. Para definirla permanentement,e ajustaremos el fichero de
configuración, que puede ser el mismo que contiene las demás opciones u otro
fichero. En ambos casos, es probable que la opción se llame GATEWAY. La
puerta de acceso no es necesaria en sistemas que sólo trabajan en una red local
que no contiene routers.
- Parámetros de las DNS: si queremos que Linux realice conversiones entre
direcciones IP y nombres de host, tendremos que especificar al menos un servidor
DNS en el fichero /etc/resolv.conf. La IP del servidor DNS se define precedida de
la palabra clave nameserver. Podemos incluir hasta tres líneas nameserver en
este fichero. Una vez realizada esta configuración, será permanente. También
podemos definir el nombre de dominio local utilizando la opción domain.
El script de configuración de red puede contener opciones adicionales. El ejemplo anterior
tiene una opción que especifica el nombre de la interfaz (DEVICE=eth0), otra que le dice
al ordenador que asigne una IP estática (BOOTPROTO=static) y una tercera que muestra
por pantalla la interfaz cuando arranca el ordenador (ONBOOT=yes). NETWORK y
BROADCAST se obtienen de los elementos IPADDR y NETMASK.
Los detalles de la configuración varían de una distribución a otra, por ejempl,o en Ubuntu
editaremos /etc/network/interfaces y en Fedora /etc/syconfig/network-scripts/ifcfg-ethx. La
distribución y formato de la información difieren en ambos ficheros, puede que
necesitemos consultar la documentación de la distribución para conocer los detalles. Otra
alternativa son las herramientas GUI, cuyo uso es muy intuitivo. No debemos introducir
valores aleatorios o inventados similares a los utilizados por otros sistemas de nuestra
red, ya que es improbable que funcionen y pueden provocar daños enormes.
El programa ifconfig es de una importancia crítica para definir la IP y la máscara de red,
también puede mostrar los parámetros actuales. Su uso básico para mostrar una interfaz
de red presenta el siguiente aspecto:
ifconfig interfaz up dir netmask mascara
Por ejemplo, si queremos configurar eth0 con la dirección IP 192.168.10.10 y la máscara
de red 255.255.255.0 utilizaremos el siguiente comando:

Academy Xperts Bolivia


105
EX - LINUX EXPERTO EN LINUX. MODULO 2

ifconfig eth0 up 192.168.10.10 netmask 255.255.255.0


De este modo definiremos la IP especificada para que el ordenador responda a ella y la
utilice como origen para los datos que envía. Esto no configura la ruta para el tráfico
exterior a la red actual, para ello tendremos que utilizar el comando route:
route add default gw 192.168.10.1
Tanto ifconfig como route pueden mostrar información de la configuración actual de la red.
Para ifconfig introduciremos el comando seguido del nombre de la interfaz:
Eth0 Link encap:Ethernet direcciónHW 00:22:fa:43:2a:3c
Direc. inet:192.168.10.10 Difus.:192.168.10.255 Másc:255.255.255.0
Dirección inet6: fe80::222:faff:fef9:fb5a/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:6559207 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:4529577 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:7857152048 (7.8 GB) TX bytes:2055391477 (2.0 GB)
ifconfig debería mostrar una dirección de hardware (HWaddr), una dirección IP (inet addr)
y estadísticas de paquetes rechazados o desbordamientos por los paquetes recibidos
(RX) y transmitidos (TX), lo ideal es que estas colisiones sean pocas, aunque son
inevitables si utilizamos un HUB en lugar de un SWITCH. Podemos utilizar route para
efectuar un diagnóstico escribiendo lo siguiente:

route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.10.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo

Esto muestra que los datos destinados a 192.168.10.0 pasan directamente por eth0.
127.0.0.0 es un interfaz especial que crea un circuito cerrado con el ordenador de origen.
Se utiliza para ciertos fines internos de la red. La última línea muestra la ruta por defecto,
que describe lo que hacer con todo lo que no coincida con las demás entradas de la tabla
de enrutamiento. En este caso, 192.168.10.1 es la puerta de acceso por defecto de la
ruta. Si no aparece o está mal configurada, el tráfico destinado a redes externas no
pasará del segmento de red local.

Academy Xperts Bolivia


106
EX - LINUX EXPERTO EN LINUX. MODULO 2

Es más fácil utilizar una herramienta GUI para definir direcciones IP para los nuevos
administradores, ya que la ubicación exacta de los ficheros de configuración varía de una
distribución a otra y los ejemplos listados anteriormente pueden no ser válidos para
nuestro sistema actual.
Configuración del enrutamiento
Los routers pasan el tráfico de una red a otra. Cuando configuramos Linux le
suministramos la dirección del router que utilizará como puerta de acceso a Internet. El
tráfico que no esté destinado a la red local se dirigirá a este router, que a su vez se lo
pasará al destinatario. En la práctica, es probable que haya una decena o más routers
entre nuestro equipo y la mayoría de los sitios de Internet, cada router tiene al menos dos
interfaces de red y mantiene una tabla que indica dónde enviar la información según la IP
de destino. Nuestro propio ordenador tiene una tabla de este tipo, pero es muy simple
comparada con las tablas de los principales routers de Internet.
Linux puede funcionar como un router, conectando dos o más redes entre sí y dirigiendo
el tráfico entre ellas en base a su tabla de enrutamiento, lo que se controla, en parte, con
route. Este comando se puede utilizar para mucho más que especificar un único sistema
de puerta de acceso. La sintaxis simplificada de route sería la siguiente:

route {add | del} [-net | -host] destino [netmask nm] [gw gw] [reject] [[dev] interfaz]
Junto a add o del se especifica un destino (ordenador o dirección de red) y otros
parámetros opcionales. La opción -net fuerza a route a interpretar el destino como una red
y -host como una dirección de ordenador. La opción netmask permite definir una máscara
de red y gw permite especificar el router por el que deberían pasar los paquetes hacia el
destino especificado. reject instala una ruta de bloqueo que rechaza el tráfico destinado a
la red especificada, aunque no es un cortafuegos. route puede adivinar por sí mismo el
dispositivo de red aunque se puede forzar a que utilice uno en concreto con la opción dev.
Por ejemplo, una red en la que los paquetes dirigidos a la subred 172.20.0.0/16 deberían
pasar a través del router 172.21.1.1 y no es el sistema de puerto de acceso por directo.
Configuraremos esta ruta con el siguiente comando:
route add -net 172.20.0.0 netmask 255.255.0.0 gw 172.21.1.1
Las tablas de enrutamiento incorrectas pueden causar serios problemas debido a que
algunos o todos los ordenadores no respondan. Podemos examinar la tabla de
enrutamiento escribiendo solo route. Una vez localizadas las entradas incorrectas,
podremos borrarlas y añadir otras nuevas que las sustituyan a la larga. La mejor opción
es cambiar los ficheros de configuración, aunque un par de comandos route solucionaran
el problema a corto plazo.
Si queremos configurar un router en Linux que permita el reenvío de los paquetes entre
redes, debemos activar la funcionalidad modificando un fichero clave del sistema de
ficheros /proc:
echo “1” > /proc/sys/net/ipv4/ip_forward

Academy Xperts Bolivia


107
EX - LINUX EXPERTO EN LINUX. MODULO 2

Este comando activa el reenvío de IP, pero, si queremos activar permanentemente esta
opción, tendremos que modificar un fichero de configuración. En algunas distribuciones es
/etc/sysctl.conf:
net.ipv4.ip_forward = 1
Otras distribuciones utilizan otros ficheros de configuración y opciones, como
/etc/sysconfig/sysctl y su línea IP_FORWARD. Podemos utilizar grep para buscar por
ip_forward o IP_FORWARD si no podemos encontrar el archivo; también podemos
modificar un script de inicio local para añadir el comando que aplique el cambio.
Uso de herramientas GUI de configuración
La mayoría de distribuciones incluyen sus propias herramientas GUI de configuración de
red. Fedora y Red Hat vienen con la herramienta llamada network configuration (system-
config-network) y Suse posee la herramienta de tipo texto llamada YaST. Los detalles de
funcionamiento de estos programas difieren, pero todas proporcionan un medio para
introducir la información anteriormente descrita. Estas herramientas GUI son normalmente
más fáciles de encontrar y utilizar que los ficheros de configuración en los que se guardan
los parámetros, por lo que es recomendable localizarlas y aprender a utilizarlas. Una vez
entendido los principios de la configuración de las redes, no deberíamos tener problemas
para introducir la información en los campos GUI. Los detalles precisos de la
configuración utilizando herramientas GUI difieren de una distribución a otra. Por ejemplo,
YuST no distribuye sus opciones de la misma manera que network configuration, aunque
los principios básicos son los mismos. Debemos escoger entre una asignación de IP
estática o automática e introducir un número de opciones clave dependiendo del método
de configuración que escojamos.
Uso de los comandos ifup e ifdown
ifup y ifdown combinan las Configuración del hardware de red funciones de varios
comandos de red entre los que destacan ifconfig y route. En sus formas más sencillas,
abren interfaces o las cierran en función de la información almacenada en los ficheros de
configuración de red:

ifup eth0
Determining IP information for eth0… done.
Después de ejecutar este comando eth0 estará totalmente configurada, suponiendo que
hayamos configurado adecuadamente la información utilizando las herramientas de
configuración de red de la distribución, o bien manualmente, editando los ficheros de
configuración. Podemos cerrar con la misma facilidad la interfaz escribiendo ifdown eth0.
ifup y ifdown son útiles para verificar que los parámetros de red están correctamente
configurados de cara a la próxima vez que arranque el ordenador. También se utilizan
para tirar o levantar la red rápidamente. Si necesitamos experimentar o depurar un
problema, es preferible utilizar ifconfig y route, ya que proporcionan un control más
preciso sobre el proceso. Los comandos ifup y ifdown se implementan como scripts que

Academy Xperts Bolivia


108
EX - LINUX EXPERTO EN LINUX. MODULO 2

consultan los ficheros de configuración y ejecutan entre bastidores comandos relevantes


de bajo nivel.
Nombres de host
TCP/IP utiliza números como direcciones de ordenadores, sin embargo, la gente recuerda
mejor los nombres; por este motivo TCP/IP incluye un modo de vincular nombres de
ordenadores (nombres de host o hostnames) a las direcciones IP. Al igual que las
direcciones IP, los nombres de host se componen de dos partes: nombres de máquina y
nombre de dominio. Los nombres de máquina hacen referencia a un ordenador
específico; los nombres de dominio, a una colección de ordenadores. Los nombres de
dominio no equivalen a la parte de red de una dirección IP que registran los particulares o
las empresas para uso propio. Esto permite asignar nombres de máquina dentro del
dominio y vincularlos a cualquier dirección IP arbitraria. Un particular o empresa que
controle un dominio necesitará, probablemente, un bloque de direcciones IP para los
ordenadores de dicho dominio.
Los dominios de internet se estructuran jerárquicamente: en lo más alto se encuentran los
dominios de nivel superior (TLD), como .com, .edu y .uk, que aparecen al final de una
dirección de Internet. Dentro de cada TLD hay varios dominios que identifican a
organizaciones específicas, como por ejemplo, sybex.com o loc.gov. Estas
organizaciones pueden dividir opcionalmente sus dominios en subdominios, como por
ejemplo, cix.sybex.con o upe.loc.gov. Los TLD que parecen al final de las direcciones de
Internet pueden corresponder a naciones, como por ejemplo .uk para Reino Unido y .us
para Estados Unidos; otros corresponden a tipos particulares de entidades como por
ejemplo .com para organizaciones comerciales y .edu para organizaciones educativas.
Incluso los subdominos se pueden dividir en sus propios subdominios.
Esta estructura puede alcanzar más niveles, pero no suele hacerlo. Los dominios y
subdominios incluyen ordenadores específicos, como por ejemplo http://www.sybex.com,
que es el servidor web de sybex. Si nuestro ordenador forma parte de una red corporativa,
puede que necesitemos conocer nuestro nombre de host para configurarlo. Este nombre
nos lo asignará el administrador de red y será un nombre de máquina perteneciente al
dominio de la empresa. Si nuestro ordenador no forma parte de una red corporativa,
tendremos que inventarnos un nombre de host. Si nuestra red utiliza DHCP, puede que se
nos asigne automáticamente un nombre de host o puede que no.

Si inventamos un nombre de host, escogeremos una TLD valida, como .invalid para
garantizar que no le daremos por accidente al ordenador un nombre que ya pertenezca
legítimamente a alguien más. Un conflicto de este tipo puede impedirnos contactar con el
sistema, aparte de causar otros problemas como errores en el direccionamiento de
correos electrónicos.
Resolución de nombres de host
DNS es una base de datos distribuida en ordenadores que realizan conversiones entre
direcciones IP y nombres de host. Cada dominio debe mantener, al menos, dos
servidores DNS; ambos deben proporcionar los nombres de cada ordenador del dominio o

Academy Xperts Bolivia


109
EX - LINUX EXPERTO EN LINUX. MODULO 2

re direccionar una petición DNS a otro servidor DNS que pueda gestionar mejor la
petición.
En la práctica, este proceso está oculto, ya que las empresas mantienen servidores DNS
que hacen todo el trabajo sucio. Bastará con que nuestro ordenador apunte a los
servidores DNS de nuestro ISP. Esto se puede controlar con DHCP o introduciendo la
información manualmente en los ficheros de configuración. A veces necesitaremos
comprobar manualmente las DNS debido a que nuestra configuración DNS está
distribuyendo la dirección errónea o para verificar si el servidor está operativo. Los
programas que nos ayudan a realizar estas comprobaciones son los siguientes:
- nslookup: realiza búsquedas DNS (por defecto, en determinados ordenadores en
particular) y devuelve los resultados. Tiene un modo interactivo con el que
podemos realizar una serie de consultas. El programa está oficialmente obsoleto,
lo que significa que ya no recibe mantenimiento y será eliminado de su paquete
padre (bind-utils o bind-tools). Lo mejor es utilizar host o dig.
- host: es el sustituto para las funciones más sencillas de nslookup, carece de un
modo interactivo y difiere en muchos detalles de funcionamiento. En el caso más
simple, escribiremos host nombre_objetivo donde nombre_objetivo es el nombre
de host o la dirección IP que queremos consultar. Admite varias opciones para
modificar su comportamiento básico.
- dig: realiza búsquedas DNS más complejas que host. Podemos utilizarlo para
localizar la dirección IP de un único nombre de host o el nombre de host de una
única dirección IP, es más flexible que host.
- whois: busca la información de un dominio en conjunto y nos proporciona
información sobre quién es el propietario del dominio, con quién contactar en caso
de problemas, etc. Se suele utilizar junto con la opción -H, que omite las cláusulas
legales que muchos registradores de dominios incorporan a la información de
whois.
Si sólo necesitamos resolver un puñado de nombres de host y no queremos recurrir a las
DNS, utilizaremos el fichero /etc/hosts para definir las asociaciones de direcciones IP con
nombres de host (una por línea). Cada asociación incluye por lo menos un nombre,
aunque puede ser más de uno:
127.0.0.1 localhost
192.168.7.23 apollo.luna.edu apollo
En este ejemplo, el nombre localhost está asociado a la dirección 127.0.0.1; los nombres
apollo.luna.edu y apollo están asociados a 192.168.7.23. El primer vínculo debería
aparecer en cualquier fichero /etc/hosts; el segundo es un nombre de host completo que
incluye la parte del domino. Los siguientes nombres de esta línea son alias (normalmente
el nombre del host sin la especificación del dominio). Una vez configurado este fichero,
podemos hacer referencia a los ordenadores que parecen en él por sus nombres, estén o
no en los servidores DNS que utiliza el ordenador.
La principal desventaja de /etc/hosts es que es un fichero local y la definición de las
asociaciones sólo afecta a las búsquedas de nombre realizadas por el ordenador. Si

Academy Xperts Bolivia


110
EX - LINUX EXPERTO EN LINUX. MODULO 2

queremos hacerlo en toda la red, tendremos que modificar los ficheros de todos los
ordenadores de esta. Linux suele realizar búsquedas en /etc/hosts antes que en las DNS;
para modificar este comportamiento configuraremos el fichero /etc/nsswitch.conf, en su
línea hosts. Esta línea indica el orden de las opciones files y DNS, que corresponden a
/etc/hosts y DNS respectivamente:
hosts: files dns
Invertiremos el orden de las opciones files y dns para obligar al sistema a consultar las
DNS antes que /etc/hosts. El fichero /etc/nsswitch.conf admite opciones como, por
ejemplo, realizar una resolución de nombres utilizando llamadas NetBIOS de Windows, o
un servidor LDAP añadiendo las opciones pertinentes a la línea hosts junto con el
software de apoyo necesario. Las líneas passwd, shadow y group controlan cómo se
autentifican los usuarios y gestionan los grupos Linux. No deberíamos intentar cambiar
estas configuraciones a menos que entendamos los sistemas implicados.
El fichero /etc/networks funciona de un modo similar a /etc/hosts, pero se aplica a las
direcciones de red e invierte el orden de los nombres y las direcciones IP en cada línea:
loopback 127.0.0.0
mynet 192.168.7.0
Este ejemplo define dos vinculaciones: el nombre loopback con la red 127.0.0.0/8 y
mynet para la red 192.168.7.0/24. No tendremos que editar este fichero salvo en contadas
ocasiones.
Configuración de los nombres de host
Los nombres de host se configuran:
- En las DNS: el administrador de la red puede añadir una entrada en el servidor
DNS de la red que convierta el nombre de nuestro ordenador en un objetivo válido
para los demás ordenadores de la red local. Otra alternativa es modificar los
ficheros /etc/hosts de los sistemas remotos para incluir nuestro sistema.
- En el ordenador local: hay varios programas locales que deben conocer el
nombre de nuestro ordenador como, por ejemplo, cuándo queremos que se
muestre nuestro nombre de host como parte del prompt. Para ello debemos definir
localmente nuestro nombre de host, algo totalmente independiente del nombre de
host DNS. Se pueden definir ambos nombres con valores diferentes, pero esto
puede llevar a confusiones e incluso impedir a algunos programas funcionar
correctamente.
La herramienta más básica para definir localmente nuestro nombre de host se llama
hostname. Si escribimos el comando sin ningún parámetro se mostrara nuestro nombre
de host actual; si lo escribimos seguido del nuevo nombre a definir como nombre del host,
hostname sustituirá el antiguo por el que acabamos de escribir.
Hay dos comandos similares domainname y dnsdomainname. domainname define el
nombre de dominio utilizado por NIS (sistema de información de red) y dnsdomainname
define el nombre de dominio utilizado por las DNS. Estos comandos no afectan a los

Academy Xperts Bolivia


111
EX - LINUX EXPERTO EN LINUX. MODULO 2

servidores remotos, sólo al nombre dado a los programas que emplean llamas concebidas
para estos servidores. Linux suele buscar en el fichero /etc/hostname o /etc/HOSTNAME
un nombre de host para configurar durante el inicio. Si queremos configurar el nombre de
host de manera permanente, deberíamos buscar y modificar estos ficheros. Fedora utiliza
/etc/sysconfig/network para este fin, entre otros.
4.2.3 Resolución de problemas sencillos de red
Diagnosticar conexiones de red
La configuración de las redes es compleja, ya que las cosas no siempre funcionan como
se planearon. Existen unos cuantos comandos que ayudan a diagnosticar problemas:
ping, traceroute, tracepath, netstat y tcpdump. Cada comando proporciona una
información concreta que nos puede servir para seguir la pista del origen de un problema.

Verificar la conectividad básica


El comando ping hace la comprobación más básica de la red enviando un paquete ICMP
al sistema citado (a través de una IP o un nombre de host) y espera una respuesta. ping
enviará paquetes una vez por segundo hasta que lo interrumpamos pulsando control+c.
También podemos limitar el número de comprobaciones con la opción -c num. Podemos
aislar el lugar donde se produce un problema en la red haciendo ping a sistemas locales y
remotos. Por ejemplo, si podemos hacer ping a sistemas locales pero no a sistemas
remotos, el problema probablemente esté en la configuración del router; sin embargo, si
podemos hacer ping por dirección IP pero no por nombre de host, entonces el problema
residirá en la configuración de las DNS.
Hacer una traza de una ruta
traceroute envía una serie de tres paquetes de prueba a cada ordenador desde nuestro
sistema al sistema objetivo, su salida es similar a la siguiente:
traceroute -n 10.1.0.43
traceroute to 10.1.0.43 (10.1.0.43), 30 hops max, 52 byte packets
1 192.168.1.254 1.021 ms 36.519 ms 0.971 ms
2 10.10.88.1 17.250 ms 9.959 ms 9.637 ms
3 10.9.8.173 8.799 ms 19.501 ms 10.884 ms
4 10.9.8.133 21.059 ms 9.231 ms 103.068 ms
5 10.9.14.9 8.554 ms 12.982 ms 10.029 ms
6 10.1.0.44 10.273 ms 9.987 ms 11.215 ms
7 10.1.0.43 16.360 ms * 8.102 ms
-n hace que se muestren las direcciones IP de los ordenadores objetivo en lugar de sus
nombres de host, lo que podría acelerar el proceso, sobre todo si tenemos problemas de

Academy Xperts Bolivia


112
EX - LINUX EXPERTO EN LINUX. MODULO 2

DNS. Suele ser recomendable conocer los nombres de host, ya que ayudan a determinar
con precisión quien es el responsable de un problema. El ejemplo anterior muestra una
gran variabilidad en los tiempos de respuesta, el dato de 192.168.1.54 es totalmente local:
este router respondió en 1.021, 3.519 y 0.971 ms a las 3 pruebas; es probable que, por la
segunda prueba y su tiempo de respuesta, se puede deducir que el sistema estaba
ocupado en alguna otra tarea. El resto de pruebas se encuentra en el rango de los 8-20
ms. En el último sistema sólo se presentan dos tiempos y en la prueba intermedia se
marca como un asterisco (*) debido a que el paquete nunca regresó.
traceroute permite localizar los problemas de conectividad de la red si tenemos una gran
variabilidad en los tiempos. La ausencia de alguno tiempo indica que el router está
sobrecargado o que tiene una conexión poco fiable con el sistema anterior de la lista. Si
observamos un salto muy grande en los tiempos, suele indicar que hay una enorme
distancia física entre dos de los routers, algo habitual en las conexiones
intercontinentales. Estos saltos no son necesariamente un problema a no ser que los dos
sistemas estén lo suficientemente cerca como para que este salto enorme carezca de
sentido.
La salida de traceroute nos permite determinar si existe un problema en la conectividad de
la red de la que somos responsables. Por ejemplo, la variabilidad del primer dato en el
ejemplo anterior puede indicar un problema en la red local, aunque lo más probable es
que e paquete se perdiera antes de llegar a su destino final, por lo que no se trata de un
problema en la red. Si la conexión problemática esta dentro de nuestra área de
responsabilidad, tendremos que comprobar el estado del sistema problemático, los
sistemas vecinos y el segmento de red. Hay routers que bloquean todos los datos de
traceroute, independientemente de que estén destinados a ellos o sean paquetes de
paso. Si la salida de traceroute contiene una o dos líneas de asteriscos (*) pero todo lo
demás parece estar bien, es probable que nos hayamos topado con uno de estos
sistemas.
tracepath es una alternativa a traceroute. Es similar en su funcionamiento básico, pero
genera una línea de salida por cada paquete de prueba, lo que produce una salida más
larga que traceroute. Además, tracepath dispone de menos opciones que traceroute.
Comprobar el estado de la red
netstat es la navaja suiza de las herramientas de red. Puede devolver información que no
se obtiene fácilmente de otras maneras, por ejemplo:
- Información sobre la interfaz: los parámetros –interface o -i dan información sobre
los interfaces de red similar a la que devuelve ifconfig. Hay versiones de netstat
que utilizan el mismo formato de salida que ifconfig, pero, normalmente, la
muestran de manera diferente.
- Información del enrutamiento: –route o -r permiten obtener un listado de la tabla
de enrutamiento similar al que muestra el comando route.
- Información de enmascaramiento: con los parámetros –masquerade o -M
obtendremos información sobre las conexiones en las que intervengan las
funcionalidades NAT de Linux (enmascaramiento de IP). NAT permite a un router
Linux “ocultar” una red tras una única dirección IP, lo que resulta bueno para

Academy Xperts Bolivia


113
EX - LINUX EXPERTO EN LINUX. MODULO 2

expandir las direcciones IPv4.


- Uso del programa: –program o -p intentan proporcionar información sobre los
programas que utilizan conexiones de red. No siempre tiene éxito, pero, en caso
de que sí, podremos ver qué programas están realizando conexiones al exterior.
- Puertos abiertos: cuando se utiliza sin parámetro alguno, netstat devuelve
información sobre los puertos abiertos y los sistemas a los que se conectan.
- Todas las conexiones: -all o -a hacen que netstat muestre información sobre los
puertos que abren los programas de servidor para escuchar las conexiones de red,
además de las conexiones ya abiertas.
netstat es una herramienta muy potente; ni las opciones ni la salida son exactamente las
mismas en todas las distribuciones.
Examinar el tráfico de red en su formato original
tcpdump es una herramienta avanzada para la resolución de problemas de red. Es un
sneffer (husmeador de paquetes) que puede interceptar los paquetes de la red para
registrarlos o mostrarlos por pantalla. Los sniffers son muy útiles, ya que pueden
ayudarnos a verificar si un ordenador recibe la información de otros ordenadores.
También nos permite examinar los datos en su formato original, algo útil para localizar
problemas si conocemos los detalles de implementación del protocolo.
La forma más básica de utilizar tcpdump es escribiendo su nombre; se debe ejecutar
como root, ya que los usuarios normales no pueden monitorizar el tráfico de red de este
modo. Cuando está en funcionamiento, tcpdump comienza a mostrar líneas, una por cada
paquete que monitoriza. Las líneas incluyen una marca temporal, un identificador de pila,
el nombre o la IP del sistema de origen y su puerto, el nombre o la IP del sistema destino
y su puerto e información específica del paquete. tcpdump muestra paquetes
indefinidamente mientras no pulsemos control+c. También podemos pasarle la opción -c
num para que muestre num paquetes y finalice; tcpdump permite descartar un rango
completo de posibilidades de problemas en base a los datos de su salida, como, por
ejemplo, fallos de cableado o un bloqueo del tráfico debido al cortafuego. Hay varias
opciones que amplían o modifican la salida, por ejemplo -A mostrará en ASCII el
contenido de los paquetes, -D mostrará una lista de interfaces en las que puede escuchar
tcpdump, -n mostrará todas las direcciones numéricamente, -v (o -vv y -vvv) mostrará
información adicional del paquete y -w fichero guardará los paquetes capturados en el
fichero especificado.
Uso de opciones adicionales
Además de programas de diagnóstico especializados, podemos utilizar algunos
programas de usuario como herramientas de depuración. Uno de los más útiles es telnet,
programa y protocolo de acceso remoto. Para utilizarlo escribiremos el nombre del
programa seguido del nombre o IP de un sistema remoto para obtener un prompt de
acceso a dicho sistema: telnet dirección_IP.

telnet no posee encriptación alguna y, por lo general, deberíamos eliminar el servidor


telnet de nuestro sistema. No obstante, puede ser un protocolo útil en redes privadas lo

Academy Xperts Bolivia


114
EX - LINUX EXPERTO EN LINUX. MODULO 2

suficientemente protegidas; es también práctico para la depuración.


Para utilizar telnet para depurar protocolos de red, indicaremos un número de puerto tras
el nombre de host provocando que telnet se conecte a dicho puerto y permitiéndonos
interactuar con el servidor:
telnet speaker 25
Trying 192.168.1.1. …
Connected to speaker.
Escape character is „ ^]‟ .
220 speaker.example.com ESMTP Postfix
HELO nessus.example.com
250 speaker.example.com
En este ejemplo nos conectamos al puerto 25 (SMTP- correo electrónico). Una vez
conectados, utilizamos el comando HELO, que provoca que SMTP lo utilice para
identificar un cliente; el servidor responde con un 250 code, lo que denota un comando
aceptado. Si queremos utilizar telnet de este modo, tendremos que conocer muy bien el
protocolo a depurar. Si no conocemos bien el protocolo, podemos utilizar telnet para
comprobar si un servidor está en ejecución: si intentamos conectarnos y obtenemos un
mensaje de error connection refused (conexión rechazada), sabremos que el servidor
remoto no está en ejecución o es inaccesible por algún motivo. Por el contrari,o si
llegamos al mensaje Escape character (conseguimos acceder), sabremos que el servidor
está en ejecución, aunque puede que no funcione correctamente. Estas pruebas sólo
funcionan con protocolos que utilizan TCP.
El protocolo FTP también puede ser una útil herramienta de diagnóstico. FTP permite
transferir ficheros entre sistemas. Para utilizarlo, escribiremos el nombre del programa
seguido de la IP o nombre del servidor FTP. Tras la conexión, veremos un prompt de
acceso donde podremos ejecutar comandos FTP:
ftp speaker
Connected to speaker.
220 (vsFTPd 1.2.1)
Name (speaker:harry): harry
530 Please login with USER and PASS.
SSL not available
331 Please specify de password.
Password:
230 Login successful

Academy Xperts Bolivia


115
EX - LINUX EXPERTO EN LINUX. MODULO 2

Remote system type is UNIX.


Using binary mode to transfer files.
ftp> get archivo.wav
local: archivo.wav remote: archivo.wav
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for archivo.wav (109986 bytes).
226 File send OK.
109986 bytes recived in 0.104 secs (1e+03 kbytes/sec)
ftp> quit
221 Goodbye
En este ejemplo obtenemos del ordenador remoto el fichero archivo.wav. El cliente FTP
muestra el tamaño del fichero, el tiempo de transferencia y la velocidad de transferencia
(1e+03 kbytes/sec que es lo mismo que 1×10³ KB/s o 1000 KB/s). Es un medio útil para
comprobar la velocidad de transferencia de la red. El resultado será más fiable cuanto
mayor sea el tamaño de los archivos.
get devuelve los ficheros solicitados, aunque existen más comandos como put que
permite subir un fichero, ls o dir que muestran el contenido del directorio del sistema
remoto, cd cambia de directorio, delete elimina un fichero y quit o exit para salir del
programa. Los comandos help y ? permiten ver una lista de comandos FTP disponibles.
Al igual que telnet, FTP es una pobre elección como protocolo por motivos de seguridad.
Existe una importante razón para no utilizar FTP hoy en día: los sitios FTP anónimos son
un medio común de distribución de ficheros públicos en Internet, incluso GNU/Linux se
puede descargar de sitios FTP anónimos. Se suele utilizar como nombre de usuario
anonymous y cualquier contraseña para obtener acceso al contenido; normalmente, no
podremos subir ficheros a los sitios FTP anónimos; además, tendremos acceso a un
número limitado de ficheros.
Podemos acceder a sitios FTP públicos utilizando un navegador web, para ello,
introduciremos una URL que comience por ftp://, como por ejemplo
ftp://downloads.example.org y el navegador se conectara al sitio utilizando FTP en lugar
de HTTP.

Academy Xperts Bolivia


116

También podría gustarte