Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1.3.3 Apple OS X
Apple produce el sistema operativo OS X que pasó por la certificación de UNIX. OS X está
parcialmente basado en software del proyecto FreeBSD.
Por el momento, OS X es principalmente un sistema operativo de escritorio, pero existen
paquetes opcionales que ayudan con la gestión de servicios de red que permiten a muchas
computadoras de escritorio OS X colaborar, tal como compartir archivos o ejecutar un inicio de
sesión de red.
OS X en el escritorio suele ser una decisión personal ya que mucha gente considera este
sistema más fácil de usar. La creciente popularidad de OS X ha asegurado un sano soporte
de proveedores de software. OS X es también muy popular en las industrias creativas como
por ejemplo la producción de vídeo. Es un área donde las aplicaciones manejan la decisión de
sistema operativo y por lo tanto la elección de hardware, ya que OS X se ejecuta en el
hardware de Apple.
1.3.4 BSD
Hay varios proyectos open source BSD (Berkeley Software Distribution) como OpenBSD,
FreeBSD y NetBSD. Estas son alternativas a Linux en muchos aspectos ya que utilizan una
gran cantidad de software común. BSD por lo general se implementa en la función del
servidor, aunque también hay variantes como GNOME y KDE que fueron desarrolladas para
las funciones del escritorio.
Oracle Solaris
IBM AIX
HP-UX
1.3.6 Linux
Un aspecto donde Linux es muy diferente a las alternativas, es que después de que un
administrador haya elegido Linux todavía tiene que elegir una distribución Linux. Acuérdate del
tema 1, la distribución empaca el kernel, utilidades y herramientas administrativas de Linux en
un paquete instalable y proporciona una manera de instalar y actualizar paquetes después de
la instalación inicial.
Algunos sistemas operativos están disponibles a través de un único proveedor, como OS X y
Windows, con el soporte del sistema proporcionado por el proveedor. Con Linux, hay múltiples
opciones, desde las ofertas comerciales para el servidor o de escritorio, hasta las
distribuciones personalizadas hechas para convertir una computadora antigua en un firewall
de red.
A menudo los proveedores de aplicaciones eligen un subconjunto de distribuciones para
proporcionar soporte. Diferentes distribuciones tienen diferentes versiones de las librerías
(bibliotecas) principales y es difícil para una empresa dar soporte para todas estas versiones
diferentes.
Los gobiernos y las grandes empresas también pueden limitar sus opciones a las
distribuciones que ofrecen soporte comercial. Esto es común en las grandes empresas donde
pagar para otro nivel de soporte es mejor que correr el riesgo de interrupciones extensas.
También, las diferentes distribuciones ofrecen ciclos de liberación a veces tan frecuentes
como cada seis meses. Mientras que las actualizaciones no son necesarias, cada versión
puede obtener soporte sólo para un periodo razonable. Por lo tanto, algunas versiones de
Linux tienen un Periodo Largo de Soporte (LTS- Long Term Support) hasta 5 años o más,
mientras que otros sólo recibirán soporte por dos años o menos.
Algunas distribuciones se diferencian entre estables, de prueba y versiones inestables. La
diferencia es que la distribución inestable intercambia fiabilidad a cambio de funciones.
Cuando las funciones se hayan integrado en el sistema por mucho tiempo y muchos de los
errores y problemas hayan sido abordados, el software pasa por pruebas para ser una versión
estable. La distribución Debian advierte a los usuarios sobre los peligros de usar la liberación
"sid" con la siguiente advertencia:
Otras versiones dependen de las distribuciones Beta. Por ejemplo, la distribución de Fedora
libera las versiones Beta o versiones de su software antes de la liberación completa para
minimizar errores. Fedora se considera a menudo una comunidad orientada a la versión Beta
de RedHat. Se agregan y cambian las funciones en la versión de Fedora antes de encontrar
su camino en la distribución de RedHat Enterprise.
1.3.7 Android
Android, patrocinado por Google, es la distribución Linux más popular del mundo. Es
fundamentalmente diferente de sus contrapartes. Linux es un kernel y muchos de los
comandos que se tratarán en este curso son en realidad parte del paquete GNU (GNU no es
Unix). Por esta razón algunas personas insisten en utilizar el término GNU/Linux en lugar de
Linux por sí solo.
Android utiliza la máquina virtual Dalvik con Linux, proporcionando una sólida plataforma para
dispositivos móviles como teléfonos y tabletas. Sin embargo, carece de los paquetes
tradicionales que se distribuyen a menudo con Linux (como GNU y Xorg), por lo que Android
es generalmente incompatible con distribuciones Linux de escritorio.
Esta incompatibilidad significa que un usuario de RedHat o Ubuntu no puede descargar
software de la tienda de Google Play. Además, un terminal emulador en Android carece de
muchos de los comandos de sus contrapartes de Linux. Sin embargo, es posible utilizar
BusyBox con Android para habilitar el funcionamiento de la mayoría de los comandos.
sysadmin@localhost:~$ ls -l /tmp/*.gz
-rw-r--r-- 1 sean root 246841 Mar 5 2013 /tmp/fdboot.img.gz
sysadmin@localhost:~$ rm /tmp/fdboot.img.gz
3.1 Introducción
Antes de que te puedas convertir en un administrador eficaz de los sistemas Linux, debes
saber utilizar Linux como tu escritorio y tener aptitudes con las habilidades básicas de la
Tecnología de Información y Comunicación (TIC). No sólo eso te ayudará al tratar con
usuarios, sino sumergiéndote en el Linux te ayudará a mejorar tus habilidades más
rápidamente. Además, la vida de un administrador de sistemas es más que un trabajo en el
servidor - ¡hay también correo electrónico y documentación para hacer!
Puedes ver el mensaje original para entrar en la parte superior con el texto más reciente
añadido a continuación. Durante el inicio de sesión podrías ver algunos mensajes, llamados el
mensaje del día (MOTD), que es una oportunidad para que el administrador de sistemas para
pasar información a los usuarios. El MOTD es el símbolo del sistema. En el ejemplo anterior,
el usuario introdujo el comando w que muestra quién está conectado. De manera que son
introducidos y procesados los comandos nuevos, la ventana se desplaza hacia arriba y el
texto más antiguo se pierde en la parte superior. La terminal es responsable de mantener
cualquier historia, tal como para permitir al usuario desplazarse hacia arriba y ver los
comandos introducidos. En cuanto a Linux, lo que está en la pantalla es todo lo que hay. No
hay nada para navegar.
Procesador de textos
Hoja de cálculo
Paquete de presentación
Navegador web
4.1 Introducción
Si eres como la mayoría de las personas, probablemente estés familiarizado con el uso de
la Interfaz Gráfica de Usuario (o GUI «Graphical User Interface») para controlar tu
computadora. Fue introducida a las masas por Apple en la computadora Macintosh y
popularizado por Microsoft. La GUI proporciona una forma fácil de descubrir y administrar tu
sistema. Sin una GUI, algunas herramientas para gráficos y video no serían prácticas.
Antes de la popularidad de la GUI, la Interfaz de Línea de Comandos (o CLI «Command Line
Interface») era la forma preferida para controlar una computadora. La CLI se basa únicamente
en la entrada por teclado. Todo lo que quieres que tu computadora haga, se retransmite
escribiendo comandos en lugar de ir haciendo clics en los iconos.
Si nunca has usado una CLI, al principio puede resultar difícil porque requiere de memorizar
comandos y sus opciones. Sin embargo, la CLI proporciona un control más preciso, una
mayor velocidad y capacidad para automatizar fácilmente las tareas a través del scripting (ver
barra lateral). Aunque Linux tiene muchos entornos GUI, podrás controlar Linux mucho más
eficazmente mediante la Interfaz de Línea de Comandos.
Una terminal virtual puede ejecutarse al mismo tiempo que una GUI, pero requiere que
el usuario se conecte o inicie sesión a través de la terminal virtual antes de que pueda
ejecutar los comandos (como lo haría antes de acceder a la interfaz GUI). La mayoría
de los sistemas tienen múltiples terminales virtuales que se pueden acceder pulsando
una combinación de teclas, por ejemplo: Ctrl-Alt-F1
Nota: En las máquinas virtuales puede que las terminales virtuales no estén disponibles.
4.3.1 Prompt
Una ventana del terminal muestra un prompt (o «símbolo o aviso» en español); el prompt
aparece cuando no se ejecutan ningún comando y cuando la salida completa del comando se
ha desplegado en la pantalla. El prompt está diseñado para decirle al usuario que introduzca
un comando.
La estructura del prompt puede variar entre las distribuciones, pero por lo general contiene
información sobre el usuario y el sistema. A continuación te mostramos una estructura común
de un prompt:
sysadmin@localhost:~$
El prompt anterior proporciona el nombre del usuario registrado en (sysadmin), el nombre del
sistema (localhost) y el directorio actual (~). El símbolo ~ se utiliza como abreviación para
el directorio principal del usuario (el directorio principal del usuario viene bajo el
directorio /home (o «inicio» en español) y con el nombre de la cuenta de usuario, por
ejemplo: /home/sysadmin).
4.3.2 El Shell
Un shell es el intérprete que traduce los comandos introducidos por un usuario en acciones a
realizar por el sistema operativo. El entorno Linux proporciona muchos tipos diferentes de
shells, algunos de los cuales han existido por muchos años.
El shell más comúnmente utilizado para las distribuciones de Linux se llama el BASH shell. Es
un shell que ofrece muchas funciones avanzadas, tales como el historial de comandos, que te
permite fácilmente volver a ejecutar comandos previamente ejecutados.
El BASH shell tiene también otras funciones populares:
Nota: La lista anterior es sólo un breve resumen de algunas de las muchas funciones
proporcionadas por el BASH shell.
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
Videos
sysadmin@localhost:~$
sysadmin@localhost:~$ ls /etc/ppp
ip-down.d ip-up.d
sysadmin@localhost:~$
sysadmin@localhost:~$ ls -l
total 0
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Desktop
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Documents
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Downloads
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Music
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Pictures
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Public
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Templates
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Videos
sysadmin@localhost:~$
En la mayoría de los casos, las opciones pueden utilizarse conjuntamente con otras opciones.
Por ejemplo, los comandos ls -l -h o ls -lh listarán los archivos con sus detalles, pero se
mostrará el tamaño de los archivos en formato de legibilidad humana en lugar del valor
predeterminado (bytes):
sysadmin@localhost:~$ ls -l /usr/bin/perl
-rwxr-xr-x 2 root root 10376 Feb 4 2014 /usr/bin/perl
sysadmin@localhost:~$ ls -lh /usr/bin/perl
-rwxr-xr-x 2 root root 11K Feb 4 2014 /usr/bin/perl
sysadmin@localhost:~$
Nota que el ejemplo anterior también demostró cómo se pueden combinar opciones de una
letra: -lh . El orden de las opciones combinadas no es importante.
La opción -h también tiene la forma de una palabra completa: --human-readable (--
legibilidad-humana).
Las opciones a menudo pueden utilizarse con un argumento. De hecho, algunas de las
opciones requieren sus propios argumentos. Puedes utilizar los argumentos y las opciones
con el comando ls para listar el contenido de otro directorio al ejecutar el comando ls
-l/etc/ppp:
sysadmin@localhost:~$ ls -l /etc/ppp
total 0
drwxr-xr-x 1 root root 10 Jan 29 2015 ip-down.d
drwxr-xr-x 1 root root 10 Jan 29 2015 ip-up.d
sysadmin@localhost:~$
sysadmin@localhost:~$ date
Sun Nov 1 00:40:28 UTC 2015
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
Videos
sysadmin@localhost:~$ cal 5 2015
May 2015
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
sysadmin@localhost:~$ history
1 date
2 ls
3 cal 5 2015
4 history
sysadmin@localhost:~$
Pulsando la tecla de Flecha Hacia Arriba ↑ se mostrará el comando anterior en tu línea de
prompt. Puedes presionar arriba repetidas veces para moverte a través del historial de
comandos que hayas ejecutado. Presionando la tecla Entrar se ejecutará de nuevo el
comando visualizado.
Cuando encuentres el comando que quieres ejecutar, puedes utilizar las teclas de Flecha
Hacia Izquierda ← y Flecha Hacia Derecha → para colocar el cursor para edición. Otras
teclas útiles para edición incluyen Inicio, Fin, Retroceso y Suprimir.
Si ves un comando que quieres ejecutar en la lista que haya generado el comando history,
puedes ejecutar este comando introduciendo el signo de exclamación y luego el número al
lado del comando, por ejemplo:
!3
sysadmin@localhost:~$ history
1 date
2 ls
3 cal 5 2015
4 history
sysadmin@localhost:~$ !3
cal 5 2015
May 2015
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
sysadmin@localhost:~$
Ejemplo Significado
sysadmin@localhost:~$ HISTSIZE=500
sysadmin@localhost:~$ echo $HISTSIZE
500
sysadmin@localhost:~$
Hay muchas variables del shell que están disponibles para el shell BASH, así como las
variables que afectarán a los diferentes comandos de Linux. No todas las variables del shell
están cubiertas por este capítulo, sin embargo, conforme vaya avanzando este curso
hablaremos de más variables del shell.
4.6 La Variable PATH
Una de las variables del shell BASH más importante que hay que entender es la
variable PATH.
El término path (o «ruta» en español) se refiere a una lista que define en qué directorios el
shell buscará los comandos. Si introduces un comando y recibes el error "command not found"
(o «comando no encontrado» en español), es porque el shell BASH no pudo localizar un
comando por ese nombre en cualquiera de los directorios en la ruta. El comando siguiente
muestra la ruta del shell actual:
Basado en la anterior salida, cuando intentas ejecutar un comando, el shell primero busca el
comando en el directorio /home/sysadmin/bin. Si el comando se encuentra en ese
directorio, entonces se ejecuta. Si no es encontrado, el shell buscará en el
directorio /usr/local/sbin.
Si el comando no se encuentra en ningún directorio listado en la variable PATH, entonces
recibirás un error, command not found:
sysadmin@localhost:~$ zed
-bash: zed: command not found
sysadmin@localhost:~$
sysadmin@localhost:~$ PATH=/usr/bin/custom:$PATH
sysadmin@localhost:~$ echo $PATH
/usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/
sbin:/usr/bin:/sbin:/bin:/usr/games
sysadmin@localhost:~$
sysadmin@localhost:~$ variable1='Something'
Para ver el contenido de la variable, te puedes referir a ella iniciando con el signo de $:
Para ver las variables de entorno, utiliza el comando env (la búsqueda a través de la salida
usando grep, tal como se muestra aquí, se tratará en los capítulos posteriores). En este caso,
la búsqueda para variable1 en las variables de entorno resultará en una salida nula:
Para cambiar el valor de una variable de entorno, simplemente omite el $ al hacer referencia a
tal valor:
Esta salida sería similar a la salida del comando which (tal como se explica en el apartado
anterior, que muestra la ruta completa del comando):
sysadmin@localhost:~$ type ll
ll is aliased to `ls -alF'
sysadmin@localhost:~$ type ls
ls is aliased to `ls --color=auto'
La salida de estos comandos indican que ll es un alias para ls - alF, incluso ls es un alias
para ls --color=auto. Una vez más, la salida es significativamente diferente del
comando which:
sysadmin@localhost:~$ which ll
sysadmin@localhost:~$ which ls
/bin/ls
sysadmin@localhost:~$ alias
alias alert='notify-send —urgency=low -i "$([ $? = 0 ] && echo terminal
|| echo error)" "$(history|tail -n1|sed -e
'\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
Los alias que ves en los ejemplos anteriores fueron creados por los archivos de inicialización.
Estos archivos están diseñados para hacer automático el proceso de creación de los alias.
Hablaremos sobre ellos con más detalle en un capítulo posterior.
Los nuevos alias se pueden crear introduciendo alias name=command (o «alias
nombre=comando» en español), donde nombre es el nombre que quieres dar a el alias y
comando es el comando que quieres que se ejecute cuando se ejecuta el alias.
Por ejemplo, puedes crear un alias de tal manera que lh muestre una lista larga de archivos,
ordenados por tamaño con un tamaño "human friendly" (o «amigable para el usuario» en
español) con el comando alias lh='ls -Shl'. Introduciendo lh debe ahora dar lugar a la
misma salida que introduciendo el comando ls -Shl:
Los alias creados de esta manera sólo persistirán mientras el shell esté abierto. Una vez que
el shell es cerrado, los nuevos alias que hayas creado, se perderán. Además, cada shell
posee sus propios alias, así que si creas un alias en un shell y luego lo abres en otro shell, no
verás el alias en el nuevo shell.
4.11 Globbing
Los caracteres de globbing se denominan a menudo como "comodines". Estos son símbolos
que tienen un significado especial para el shell.
A diferencia de los comandos que ejecutará el shell, u opciones y argumentos que el shell
pasará a los comandos, los comodines son interpretados por el mismo shell antes de que
intente ejecutar cualquier comando. Esto significa que los comodines pueden utilizarse con
cualquier comando.
Los comodines son poderosos porque permiten especificar patrones que coinciden con los
nombres de archivo en un directorio, así que en lugar de manipular un solo archivo a la vez,
puedes fácilmente ejecutar comandos que afectarán a muchos archivos. Por ejemplo,
utilizando comodines es posible manipular todos los archivos con una cierta extensión o con
una longitud de nombre de archivo determinado.
Ten en cuenta que estos comodines pueden utilizarse con cualquier comando, ya que es el
shell, no el comando que se expande con los comodines a la coincidencia de nombres de
archivo. Los ejemplos proporcionados en este capítulo utilizan el comando echo para
demostración.
El patrón t* significa "cualquier archivo que comienza con el carácter t y tiene cero o más de
cualquier carácter después de la letra t".
Puedes usar el asterisco en cualquier lugar dentro del patrón del nombre de archivo. El
siguiente ejemplo coincidirá con cualquier nombre de archivo en el directorio /etc que
termina con .d:
El asterisco y el signo de interrogación también podrían usarse juntos para buscar archivos
con extensiones de tres letras ejecutando el comando echo /etc/*.???:
4.11.3 Corchetes [ ]
Los corchetes se utilizan para coincidir con un carácter único representando un intervalo de
caracteres que pueden coincidir con los caracteres. Por ejemplo, echo /etc/[gu]* imprimirá
cualquier archivo que comienza con el carácter g o u y contiene cero o más caracteres
adicionales:
Los corchetes también pueden ser utilizados para representar un intervalo de caracteres. Por
ejemplo, el comando echo /etc/[a-d]* mostrará todos los archivos que comiencen con
cualquier letra entre e incluyendo a y d:
El intervalo se basa en el cuadro de texto de ASCII. Esta tabla define una lista de caracteres
disponiéndolos en un orden estándar específico. Si proporcionas un orden inválido, no se
registrará ninguna coincidencia:
Esto es útil cuando quieres mostrar algo en la pantalla, lo que suele ser un carácter especial
para el shell:
Las comillas dobles todavía permiten la sustitución de comando (se tratará más adelante en
este capítulo), sustitución de variable y permiten algunos metacaracteres de shell sobre los
que aún no hemos hablado. Por ejemplo, en la siguiente demostración, notarás que el valor de
la variable PATH es desplegada:
sysadmin@localhost:~$ echo "The service costs $100 and the path is $PATH"
The service costs 00 and the path is
/usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/
sbin:/usr/bin:/sbin:/bin:/usr/games
sysadmin@localhost:~$ echo 'The service costs $100 and the path is $PATH'
The service costs $100 and the path is $PATH
sysadmin@localhost:~$ echo The service costs \$100 and the path is $PATH
The service costs $100 and the path is
/usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/
sbin:/usr/bin:/sbin:/bin:/usr/games
sysadmin@localhost:~$
sysadmin@localhost:~$ date
Mon Nov 2 03:35:50 UTC 2015
February 2015
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
March 2015
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
sysadmin@localhost:~$ ls /etc/xml
catalog catalog.old xml-core.xml xml-core.xml.old
sysadmin@localhost:~$ ls /etc/junk
ls: cannot access /etc/junk: No such file or directory
sysadmin@localhost:~$
4.1 Introducción
Este es Lab 4: Los fundamentos de la Línea de Comandos. Mediante la realización de esta
práctica de laboratorio, los estudiantes aprenderán cómo utilizar las funciones básicas del
shell.
En este capítulo harás las siguientes tareas:
sysadmin@localhost:~$
Recuerda: Es posible que tengas que presionar Entrar en la ventana para visualizar la línea.
4.2.1 Paso 1
El siguiente comando mostrará la misma información que ves en la primera parte del prompt.
Asegúrate de que hayas seleccionado (hecho clic) la primera ventana de la Terminal e
introducido el siguiente comando seguido por la tecla Entrar:
whoami
sysadmin@localhost:~$ whoami
sysadmin
sysadmin@localhost:~$
La salida del comando whoami visualiza el nombre del usuario actual. Aunque en este caso el
nombre de usuario se muestra en el prompt, este comando se podría utilizar para obtener esta
información en una situación en la que el prompt no contuviera tal información.
4.2.2 Paso 2
El siguiente comando muestra información sobre el sistema actual. Para poder ver el nombre
del kernel que estás utilizando, introduce el siguiente comando en la terminal:
uname
sysadmin@localhost:~$ uname
Linux
Muchos de los comandos que se ejecutan producen salida de texto como ésta. Puedes
cambiar la salida producida con un comando mediante el uso de las opciones después del
nombre del comando.
Las opciones para un comando se pueden especificar de varias formas. Tradicionalmente, en
UNIX, las opciones se expresaban por un guión seguido por otro carácter, por ejemplo: -n.
En Linux, las opciones pueden a veces también ser dadas por dos caracteres de guión
seguidos por una palabra o palabra con guión, por ejemplo: --nodename.
Ejecuta el comando uname de nuevo dos veces en la terminal, una vez con la opción -n y de
nuevo con la opción --nodename. Esto mostrará el nombre del host del nodo de la red,
también visualizado en el prompt.
uname -n
uname --nodename
sysadmin@localhost:~$ uname -n
localhost
sysadmin@localhost:~$ uname --nodename
localhost
4.2.3 Paso 3
El comando pwd se utiliza para mostrar tu «ubicación» actual o el directorio de «trabajo»
actual. Introduce el siguiente comando para visualizar el directorio de trabajo:
pwd
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$
4.3.1 Paso 1
El comando echo se puede utilizar para imprimir el texto, el valor de una variable y mostrar
cómo el entorno del shell expande los metacaracteres (más detailles sobre los metacaracteres
más adelante en este laboratorio). Introduce el siguiente comando para que de salida a texto
literal:
echo Hello Student
4.3.2 Paso 2
Introduce el siguiente comando para mostrar el valor de la variable PATH:
echo $PATH
4.3.3 Paso 3
Utiliza el comando which para determinar si existe un archivo ejecutable
llamado date ubicado en un directorio que aparece en el valor PATH:
which date
4.4 Globbing
El uso de los caracteres glob en Linux es similar a lo que muchos sistemas operativos se
refieren como caracteres «wildcard». Utilizando los caracteres glob haces coincidir los
nombres de archivos usando patrones.
Los caracteres glob son una característica del shell, no es algo propio de algún comando
específico. Como resultado de ello, puedes utilizar los caracteres glob con cualquier comando
de Linux.
Cuando se utilizan los caracteres glob, el shell «expande» todo el patrón para coincidir con
todos los archivos en el directorio especificado que coincide con el patrón.
A efectos de demostración, vamos a utilizar el comando echo para visualizar este proceso de
expansión.
4.4 Globbing
El uso de los caracteres glob en Linux es similar a lo que muchos sistemas operativos se
refieren como caracteres «wildcard». Utilizando los caracteres glob haces coincidir los
nombres de archivos usando patrones.
Los caracteres glob son una característica del shell, no es algo propio de algún comando
específico. Como resultado de ello, puedes utilizar los caracteres glob con cualquier comando
de Linux.
Cuando se utilizan los caracteres glob, el shell «expande» todo el patrón para coincidir con
todos los archivos en el directorio especificado que coincide con el patrón.
A efectos de demostración, vamos a utilizar el comando echo para visualizar este proceso de
expansión.
4.4.2 Paso 2
Los siguientes comandos mostrarán todos los archivos en el directorio actual que comienzan
con la letra D y la letra P:
echo D*
echo P*
sysadmin@localhost:~$ echo D*
Desktop Documents Downloads
sysadmin@localhost:~$ echo P*
Pictures Public
sysadmin@localhost:~$
Piensa en el primer ejemplo, D*, como «coincidencia con todos los nombres de archivo en el
directorio actual que comienzan con la letra d en mayúscula y tienen cero o más de cualquier
otro carácter después de la letra D».
4.4.3 Paso 3
El asterisco * se puede utilizar en cualquier lugar de la cadena. El siguiente comando
mostrará todos los archivos en tu directorio actual que terminan en la letra s:
echo *s
sysadmin@localhost:~$ echo *s
Documents Downloads Pictures Templates Videos
sysadmin@localhost:~$
4.4.4 Paso 4
Observa que el asterisco también puede aparecer varias veces o en medio de varios
caracteres:
echo D*n*s
4.4.5 Paso 5
Dado que cada signo de interrogación coincide con un carácter desconocido, introduciendo
seis de ellos coincidirán con los nombres de archivo de seis caracteres. Introduce lo siguiente
para mostrar los nombres de los archivos que tienen exactamente seis caracteres:
echo ??????
El resultado debe ser similar al siguiente:
4.4.6 Paso 6
Utilizando el signo de interrogación con otros caracteres se limitarán las coincidencias. Escribe
lo siguiente para mostrar los nombres de los archivos que comienzan con la letra D y tienen
exactamente nueve caracteres:
echo D????????
4.4.7 Paso 7
Los comodines o caracteres glob pueden combinarse entre sí. El siguiente comando mostrará
los nombres de archivo que tienen al menos seis caracteres y terminan en la letra s.
echo ?????*s
4.4.8 Paso 8
El siguiente glob es similar al glob signo de interrogación para especificar un carácter. Este
glob utiliza un par de corchetes [ ] para especificar qué se le permitirá a un carácter. Los
caracteres permitidos se pueden especificar como una serie, una lista, o por lo que se conoce
como una clase de caracteres.
Los caracteres permitidos también pueden ser anulados con un signo de exclamación !.
En el primer ejemplo, el primer carácter del nombre de archivo puede ser o bien una D o
una P. En el segundo ejemplo, el primer carácter puede ser cualquier carácter excepto
una D o P:
echo [DP]*
echo [!DP]*
4.4.9 Paso 9
En estos siguientes ejemplos se especifica una serie de caracteres. En el primer ejemplo, el
primer carácter del nombre de archivo puede ser cualquier carácter que comienze cualquier
carácter entre la D y la P. En el segundo ejemplo, este rango de caracteres es negado, lo que
significa cualquier carácter individual coincidirá, excepto si está entre la letra D y la P:
echo [D-P]*
echo [!D-P]*
Te podrías preguntar «¿quién decide qué letras haya entre la D y la P? ». En este caso la
respuesta es bastante obvia (E, F, G, H, I, J, K, L, M, N y O), pero ¿qué tal que el rango
fuese [1-A]?
Para determinar el rango de caracteres se utiliza la tabla de texto ASCII. Puedes consultar
esta tabla mediante su búsqueda en Internet o introduciendo el comando siguiente, el
comando ascii.
Por lo tanto, ¿con qué caracteres coincidirá el glob [1-A] ? De acuerdo con la tabla de texto
ASCII: 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, @ y A.
4.5 Las Comillas
Hay tres tipos de comillas utilizadas por Shell Bash: comillas simples ('), comillas dobles (")
comilla invertida (`). Estas comillas tienen características especiales dentro de shell bash tal
como se describe a continuación.
Para entender las comillas simples y dobles, considera que a veces no quieres que el shell
trate algunos caracteres como «especiales». Por ejemplo, como viste anteriormente en este
laboratorio, el carácter * se utiliza como comodín. ¿Y que pasa si quieres que el
carácter * signifique solamente un asterisco?
Las comillas simples evitan que el shell «interprete» o expanda todos los caracteres
especiales. A menudo, las comillas simples se utilizan para proteger una cadena de ser
cambiada por el shell, por lo que la cadena puede ser interpretada por un comando como
parámetro para afectar la forma en la cuál se ejecuta el comando.
Las comillas dobles detienen la expansión de los caracteres glob como el asterisco (*), signo
de interrogación (?) y corchetes ( [ ] ). Las comillas dobles no permiten que la expansión de
las variables y la sustitución de los comandos (ver comilla invertida) se lleve a cabo.
Las comillas invertidas causan «sustitución del comando», que permite que un comando
ejecute dentro de la línea de otro comando.
Al utilizar las comillas, se deben introducir en pares o de lo contrario el shell no considerará el
comando como completo.
Mientras que las comillas simples son útiles para que el shell no interprete uno o más
caracteres, el shell también proporciona una manera de bloquear la interpretación de un solo
carácter llamado «escaping». Para «evadir» el significado especial de un metacarácter del
shell, se utiliza la barra invertida \ como un prefijo para ese único carácter.
4.5.1 Paso 1
Ejecuta el siguiente comando para usar las comillas invertidas ` para ejecutar el
comando date dentro de la línea del comando echo:
4.5.2 Paso 2
También puedes colocar un $ ( antes del y ) después del comando para llevar a cabo la
sustitución de comandos:
¿Por qué dos métodos diferentes pueden lograr lo mismo? Las comillas invertidas se parecen
mucho a las comillas simples, por lo que es más difícil «ver» lo que un comando debería
hacer. Originalmente los shell utilizaban las comillas invertidas; el formato $(comando) se
añadió en una versión posterior del shell bash para que la instrucción fuera visualmente más
clara.
4.5.3 Paso 3
Si no quieres que se usen las comillas invertidas para ejecutar un comando, coloca alrededor
de ellas las comillas simples. Ejecuta lo siguiente:
4.5.4 Paso 4
Ten en cuenta que también puedes colocar una barra invertida delante de cada comilla
invertida. Ejecuta lo siguiente:
4.5.5 Paso 5
Las comillas dobles no tienen ningún efecto sobre las comillas invertidas. El shell las seguirá
utilizando como una sustitución del comando. Ejecuta lo siguiente para ver una demostración:
4.5.6 Paso 6
Las comillas dobles tendrán efecto sobre los caracteres comodín de tal manera que
deshabilitan su significado especial. Ejecuta lo siguiente:
echo D*
echo "D*"
sysadmin@localhost:~$ echo D*
Desktop Documents Downloads
sysadmin@localhost:~$ echo "D*"
D*
sysadmin@localhost:~$
Importante:
Las comillas pueden parecer triviales y raras en este momento, pero a medida que adquieras
más experiencia de trabajo en el shell de comandos, descubrirás que entender bien cómo las
diferentes comillas funcionan es fundamental para el uso del shell.
4.6.1 Paso 1
Ejecuta los tres siguientes comandos juntos separadas por punto y coma:
Como puedes ver en la salida, los tres comandos se ejecutan de forma secuencial:
4.6.2 Paso 2
Ahora, pon juntos los tres comandos separados por punto y coma, donde el primer comando
se ejecuta con un resultado de fallo:
Ten en cuenta que en el ejemplo anterior, los tres comandos se ejecutan a pesar de que el
primero falle. Aunque no lo puedes ver en la salida del comando false, éste se ejecutó. Sin
embargo, cuando los comandos están separadas por el carácter ;, son completamente
independientes entre sí.
4.6.3 Paso 3
A continuación, utiliza «logical and» («y» lógico) y para separar los comandos:
4.6.4 Paso 4
Usa «y lógico» con un comando que falla como se muestra a continuación:
4.6.5 Paso 5
Los carácteres or que separan los siguientes comandos muestra cómo el fracaso antes de la
instrucción or provoca que el siguiente comando sea ejecutado; sin embargo, la primera
instrucción exitosa hace que el comando no se ejecute:
4.7.1 Paso 1
Ejecuta algunos comandos y luego ejecuta el comando history:
date
clear
echo Hi
history
sysadmin@localhost:~$ echo Hi
Hi
sysadmin@localhost:~$ history
1 date
2 clear
3 echo Hi
4 history
sysadmin@localhost:~$
4.7.2 Paso 2
Para ver un número limitado de comandos, el comando history puede tomar un número
como un parámetro para mostrar exactamente ese número de entradas recientes. Introduce el
siguiente comando para mostrar los últimos cinco comandos de tu historial:
history 5
sysadmin@localhost:~$ history 5
185 false || Fail Or
186 false || echo Fail Or
187 true || echo Nothing to see here
188 history
189 history 5
sysadmin@localhost:~$
4.7.3 Paso 3
Para ejecutar un comando, introduce el signo de exclamación y el número de la lista del
historial. Por ejemplo, para ejecutar el comando número 94 en la lista del historial, tienes que
ejecutar lo siguiente:
!94
4.7.4 Paso 4
A continuación, experimenta con el acceso a tu historial utilizando las teclas de flecha hacia
arriba y teclas de flecha hacia abajo. Mantén presionada la tecla de flecha arriba hasta
encontrar un comando que quieras ejecutar. Si fuera necesario, utiliza otras teclas para editar
el comando y, a continuación, presiona Entrar para ejecutar el comando.
5.1 Introducción
Si le preguntas a los usuarios qué característica del Sistema Operativo Linux disfrutan más,
muchos responderán «el poder proporcionado por el entorno de la línea de comandos». Esto
es porque hay literalmente miles de comandos disponibles con muchas opciones, resultando
en herramientas poderosas.
Sin embargo, con este poder viene la complejidad. La complejidad, a su vez, puede crear
confusión. Como resultado, saber encontrar ayuda cuando trabajas en Linux es una habilidad
esencial para cualquier usuario. Referirte a la ayuda te permite recordar cómo funciona un
comando, además de ser un recurso de información al aprender nuevos comandos.
NAME
cal, ncal -- displays a calendar and the date of Easter
SYNOPSIS
cal [-3hjy] [-A number] [-B number] [[month] year]
cal [-3hj] [-A number] [-B number] -m month [year]
ncal [-3bhjJpwySM] [-A number] [-B number] [-s country_code] [[month]
year]
ncal [-3bhJeoSM] [-A number] [-B number] [year]
ncal [-CN] [-H yyyy-mm-dd] [-d yyyy-mm]
DESCRIPTION
The cal utility displays a simple calendar in traditional format and
ncal offers an alternative layout, more options and the date of
Easter. The new format is a little cramped but it makes a year fit
on a 25x80 terminal. If arguments are not specified, the current
month is displayed.
MOVING
Comando Función
1G Ir a Inicio
G Ir a la final
h Mostrar ayuda
OPTIONS (Opciones) Muestra las opciones para el comando, así como una
descripción de cómo se utilizan. A menudo esta información se
encontrará en la sección DESCRIPTION (o «DESCRIPCIÓN» en
español) y no en una sección separada de OPTIONS (o
«OPCIONES» en español).
FILES (Archivos) Muestra las opciones para el comando, así como una
descripción de cómo se utilizan. Estos archivos pueden
utilizarse para configurar las características más avanzadas del
comando. A menudo esta información se encontrará en la
sección de DESCRIPTION y no en una sección separada
de OPTIONS.
SEE ALSO (Ver También) Proporciona una idea de dónde puedes encontrar información
adicional. También suele incluir otros comandos que están
relacionados con este comando.
SYNOPSIS
cal [-3hjy] [-A number] [-B number] [[[day] month] year]
Los corchetes [ ] se utilizan para indicar que esta característica no es necesaria para
ejecutar el comando. Por ejemplo, [-3hjy] significa que puedes usar las opciones -h, -j, -
y, 1 o 3, pero ninguna de estas opciones son necesarias para el correcto funcionamiento del
comando cal.
El segundo conjunto de corchetes en la SYNOPSIS del comandocal ([[[day] month]
year]) muestra otra característica. Esto significa que puedes especificar un año por sí mismo,
pero si se especifica un mes también se debe especificar un año. Además, si especificas un
día entonces también necesitarás especificar un mes y un año.
Otro componente de SYNOPSIS que puede causar cierta confusión puede verse en
SYNOPSIS del comando date:
SYNOPSIS
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Cuando utilizas el comando man, éste busca cada una de estas secciones por orden hasta que
encuentra al primer "match" (o «coincidencia» en español). Por ejemplo, si ejecutas el
comando man cal, en la primera sección (programas ejecutables o comandos del shell) se
buscará la página man llamada cal. Si no lo encuentra, entonces se busca en la segunda
sección. Si no se encuentra ninguna página man tras buscar en todas las secciones, recibirás
un mensaje de error:
Para especificar una sección diferente, proporciona el número de la sección como el primer
argumento del comando man. Por ejemplo, el comando man 5 passwd buscará la página man
de passwd sólo en la sección 5:
Al utilizar esta opción puedes recibir una gran cantidad de salidas. El comando anterior, por
ejemplo, dió salida a 60 resultados.
Recuerda que hay miles de páginas man, así que cuando buscas por una palabra clave, sé
tan específico como sea posible. Usando una palabra genérica, como "the" (o «el/la» en
español), podría resultar en cientos o incluso miles de resultados.
Ten en cuenta que en la mayoría de las distribuciones de Linux, el comando apropos hace lo
mismo que el comando man -k. En esas distribuciones, ambas producen la misma salida.
The `ls' program lists information about files (of any type,
including directories). Options and file arguments can be intermixed
arbitrarily, as usual.
Observa que la primera línea proporciona información que te indica dónde dentro de la
documentación info estás ubicado. Esta documentación se divide en nodes (o «nodos» en
español) y en el ejemplo anterior estás actualmente en el nodo ls invocation. Si pasaras
al siguiente nodo (tal como ir al siguiente capítulo en un libro), estarías en el nodo dir
invocation. Si te pasaras un nivel hacia arriba estarías en el nodo Directory listing.
Ten en cuenta que si quieres cerrar la pantalla de ayuda, debes introducir la letra l. Esto te
regresa a tu documento y te permite a continuar leyendo. Para salir completamente, introduce
la letra q.
La tabla siguiente proporciona un resumen de los comandos útiles:
Comando Función
s Buscar un término
[ Ir al nodo anterior
u Subir un nivel
INICIO Ir a inicio
FIN Ir al final
h Mostrar ayuda
* Menu:
Los elementos bajo el menú son hipervínculos que pueden llevarte a los nodos que describen
más del comando ls. Por ejemplo, si colocas tu cursor en la línea «* Sorting the
output::» (o «clasificando la salida» en español) y presionas la tecla Entrar , pasarás al
nodo que describe la clasificación de la salida del comando ls:
`-c'
`--time=ctime'
`--time=status'
If the long listing format (e.g., `-l', `-o') is being used, print
the status change time (the `ctime' in the inode) instead of the
modification time. When explicitly sorting by time (`--sort=time'
or `-t') or when not using a long listing format, sort according
to the status change time.
`-f'
Primarily, like `-U'--do not sort; list the files in whatever
order they are stored in the directory. But also enable `-a' (lis
--zz-Info: (coreutils.info.gz)Sorting the output, 68 lines --Top--------
Ten en cuenta que entrando al nodo de clasificación, prácticamente entras a un subnodo del
nodo del que originalmente partiste. Para regresar a tu nodo anterior, puedes utilizar la tecla u.
Mientras que u te llevará un nivel arriba hasta el inicio del nodo, también puedes utilizar la
tecla l para volver exactamente a la ubicación anterior en la que te encontrabas antes de
entrar al nodo de clasificación.
File: dir, Node: Top This is the top of the INFO tree
This (the Directory node) gives a menu of major topics.
Typing "q" exits, "?" lists all Info commands, "d" returns here,
"h" gives a primer for first-timers,
"mEmacslt<Return>" visits the Emacs manual, etc.
In Emacs, you can click mouse button 2 on a menu item or cross referen
ce to select it.
* Menu:
Basics
* Common options: (coreutils)Common options.
* Coreutils: (coreutils). Core GNU (file, text, shell) utilities.
* Date input formats: (coreutils)Date input formats.
* File permissions: (coreutils)File permissions.
Access modes.
* Finding files: (find). Operating on files matching certain criteria.
C++ libraries
* autosprintf: (autosprintf). Support for printf format strings in C+
-----Info: (dir)Top, 211 lines --Top------------------------------------
Welcome to Info version 5.2. Type h for help, m for menu item.
File: dir, Node: Top This is the top of the INFO tree
This (the Directory node) gives a menu of major topics.
Typing "q" exits, "?" lists all Info commands, "d" returns here,
"h" gives a primer for first-timers,
"mEmacslt<Return>" visits the Emacs manual, etc.
In Emacs, you can click mouse button 2 on a menu item or cross referen
ce to select it.
* Menu:
Basics
* Common options: (coreutils)Common options.
* Coreutils: (coreutils). Core GNU (file, text, shell) utilities.
* Date input formats: (coreutils)Date input formats.
* File permissions: (coreutils)File permissions.
Access modes.
* Finding files: (find). Operating on files matching certain criteria.
C++ libraries
* autosprintf: (autosprintf). Support for printf format strings in C+
-----Info: (dir)Top, 211 lines --Top------------------------------------
Welcome to Info version 5.2. Type h for help, m for menu item.
5.4 Otras Fuentes de Ayuda
En muchos casos verás que las páginas man o documentación info te proporcionarán las
respuestas que necesitas. Sin embargo, en algunos casos, puede que necesites buscar en
otras ubicaciones.
sysadmin@localhost:~$ ps --help
********* simple selection ********* ********* selection by list
*********
-A all processes -C by command name
-N negate selection -G by real group ID (supports
names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group
name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports
names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options
***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-headi
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy
sysadmin@localhost:~$
sysadmin@localhost:~$ whatis ls
ls (1) - list directory contents
ls (lp) - list directory contents
sysadmin@localhost:~$
Según esta salida, hay dos comandos que listan el contenido del directorio. La respuesta
simple a la pregunta por qué hay dos comandos ls es que UNIX tuvo dos variantes
principales, lo que dio lugar a que algunos comandos fueran desarrollados «en paralelo». Por
lo tanto, algunos comandos se comportan diferentemente en diversas variantes de UNIX.
Muchas distribuciones modernas de Linux incluyen comandos de ambas variantes de UNIX.
Esto, sin embargo, conlleva un pequeño problema: Cuando corres el comando ls, ¿Cuál de
los comandos se ejecuta? Las próximas secciones se centrarán en responder esta pregunta,
así como proporcionarte las herramientas para encontrar donde residen estos archivos en el
sistema.
sysadmin@localhost:~$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
sysadmin@localhost:~$
Las páginas man se suelen distinguir fácilmente entre los comandos ya que normalmente
están comprimidos con un comando llamado gzip, dando por resultado un nombre de archivo
que termina en .gz.
Lo interesante es que verás que hay dos paginas man, pero sólo un comando (/bin/ls).
Esto es porque el comando ls puede utilizarse con las opciones/funciones que se describen
por cualquiera de las páginas man. Así que, cuando estás aprendiendo lo que puedes hacer
con el comando ls, puedes explorar ambas páginas man. Afortunadamente, esto más bien es
una excepción ya que la mayoría de los comandos sólo tienen una página man.
Los archivos que creaste hoy normalmente no los vas a poder buscar con el comando locate.
Si tienes acceso al sistema como usuario root (con la cuenta del administrador de sistema),
puede actualizar manualmente la base de datos locate ejecutando el comando updatedb.
Los usuarios regulares no pueden actualizar el archivo de base de datos.
También ten en cuenta que cuando utilizas el comando locate como un usuario normal, tu
salida puede ser limitada debido a los permisos. En general, si no tienes acceso a un archivo
o directorio en el sistema de ficheros debido a los permisos, el comando locate no devolverá
esos nombres. Esta es una característica de seguridad diseñada para evitar que los usuarios
«exploren» el sistema de ficheros utilizando el comando locate. El usuario root puede
buscar cualquier archivo en la base de datos con el comando locate.
Como puedes ver en la salida anterior, todavía habrá muchos resultados cuando utilices la
opción -b. Para limitar la salida aún más, coloca un carácter \ delante del término de
búsqueda. Este carácter limita la salida a los nombres de archivo que coincidan exactamente
con el término:
5.1 Introducción
Este es Lab 5: Obteniendo ayuda. Mediante la realización de esta práctica de laboratorio, los
estudiantes aprenderán cómo obtener ayuda acerca de los comandos y encontrar archivos.
En este laboratorio llevarás a cabo las siguientes tareas:
Utilizar varios sistemas de ayuda para obtener ayuda para los comandos.
Aprender a localizar los comandos.
5.2.1 Paso 1
Ejecuta comandos en el shell bash escribiendo el comando y luego presionando la
tecla Entrar. Por ejemplo, introduce el siguiente comando para mostrar la fecha de hoy:
date
sysadmin@localhost:~$ date
Tue Jan 19 17:27:20 UTC 2016
sysadmin@localhost:~$
5.2.2 Paso 2
Para obtener más información acerca de los comandos, accede a la página manual para el
comando con el comando man. Por ejemplo, ejecuta el siguiente comando para obtener más
información sobre el comando date:
man date
sysadmin@localhost:~$ man date
NAME
date - print or set the system date and time
SINOPSIS
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
DESCRIPTION
Display the current time in the given FORMAT, or set the system
date.
-d, --date=STRING
display time described by STRING, not `now'
-f, --file=DATEFILE
like --date once for each line of DATEFILE
-r, --reference=FILE
display the last modification time of FILE
-R, --rfc-2822
output date and time in RFC 2822 format. Example: Mon, 07 Aug
Manual page date(1) line 1 (press h for help or q to quit)
5.2.3 Paso 3
Escriba la letra h para ver una lista de los comandos de movimiento. Después de leer los
comandos de movimiento, escribe la letra q para volver al documento.
MOVING
Ten en cuenta que las páginas del manual podrían ser un poco misteriosas para ti ahora, pero
a medida que vayas aprendiendo más sobre Linux, verás que son un recurso muy valioso.
5.2.4 Paso 4
Las búsquedas no distinguen entre mayúsculas y minúsculas y no se "envuelven" alrededor
de la parte inferior a la superior, o viceversa. Inicia una búsqueda hacia adelante de la palabra
"file" escribiendo:
/file
Ten en cuenta que lo que estás escribiendo aparecerá en la parte inferior izquierda de la
pantalla.
-r, --reference=FILE
display the last modification time of FILE
-R, --rfc-2822
output date and time in RFC 2822 format. Example: Mon,
07 Aug
/file
5.2.5 Paso 5
Observa que el texto que coincida con el de la búsqueda será resaltado. Puedes avanzar a la
siguiente coincidencia presionando n. Intenta también moverte hacia atrás a través de los las
coincidencias presionando N:
-f, --file=DATEFILE
like --date once for each line of DATEFILE
-r, --reference=FILE
display the last modification time of FILE
-R, --rfc-2822
output date and time in RFC 2822 format. Example: Mon, 07 Aug
2006 12:34:56 -0600
--rfc-3339=TIMESPEC
output date and time in RFC 3339 format. TIMESPEC=`date', `sec-
onds', or `ns' for date and time to the indicated precision.
Date and time components are separated by a single space:
2006-08-07 12:34:56-06:00
-s, --set=STRING
set time described by STRING
5.2.6 Paso 6
Utiliza el los comandos de movimiento descritos anteriormente (como el uso de la barra
espaciadora para avanzar una pantalla) para leer la página del manual para el
comando date. Cuando hayas terminado la lectura, introduce q para salir de la página del
manual.
5.2.7 Paso 7
En algunos casos es posible que no recuerdes el nombre exacto del comando. En estos casos
puedes utilizar la opción -k del comando man y proporcionar un argumento de palabra clave.
Por ejemplo, ejecuta el siguiente comando para mostrar un resumen de todas las páginas del
manual que tienen la palabra clave "password" ("contraseña" en español) en la descripción:
man -k password
sysadmin@localhost:~$ man -k password
chage (1) - change user password expiry information
chgpasswd (8) - update group passwords in batch mode
chpasswd (8) - update passwords in batch mode
cpgr (8) - copy with locking the given file to the password
or gr...
cppw (8) - copy with locking the given file to the password
or gr...
expiry (1) - check and enforce password expiration policy
login.defs (5) - shadow password suite configuration
pam_pwhistory (8) - PAM module to remember last passwords
pam_unix (8) - Module for traditional password authentication
passwd (1) - change user password
passwd (1ssl) - compute password hashes
passwd (5) - the password file
pwck (8) - verify integrity of password files
pwconv (8) - convert to and from shadow passwords and groups
shadow (5) - shadowed password file
shadowconfig (8) - toggle shadow passwords on and off
unix_chkpwd (8) - Helper binary that verifies the password of the
curren...
unix_update (8) - Helper binary that updates the password of a given
user
vipw (8) - edit the password, group, shadow-password or
shadow-gr...
sysadmin@localhost:~$
apropos password
sysadmin@localhost:~$ apropos password
chage (1) - change user password expiry information
chgpasswd (8) - update group passwords in batch mode
chpasswd (8) - update passwords in batch mode
cpgr (8) - copy with locking the given file to the password
or gr...
cppw (8) - copy with locking the given file to the password
or gr...
expiry (1) - check and enforce password expiration policy
login.defs (5) - shadow password suite configuration
pam_pwhistory (8) - PAM module to remember last passwords
pam_unix (8) - Module for traditional password authentication
passwd (1) - change user password
passwd (1ssl) - compute password hashes
passwd (5) - the password file
pwck (8) - verify integrity of password files
pwconv (8) - convert to and from shadow passwords and groups
shadow (5) - shadowed password file
shadowconfig (8) - toggle shadow passwords on and off
unix_chkpwd (8) - Helper binary that verifies the password of the
curren...
unix_update (8) - Helper binary that updates the password of a given
user
vipw (8) - edit the password, group, shadow-password or
shadow-gr...
sysadmin@localhost:~$
5.2.9 Paso 9
A menudo hay múltiples páginas de manual con el mismo nombre. Por ejemplo, el comando
anterior mostró tres páginas para passwd. Ejecuta el siguiente comando para acceder a las
páginas del manual para la palabra passwd:
man -f passwd
sysadmin@localhost:~$ man -f passwd
passwd (5) - the password file
passwd (1) - change user password
passwd (1ssl) - compute password hashes
sysadmin@localhost:~$
El hecho de que haya diferentes páginas del manual para el mismo "nombre" es confuso para
muchos usuarios novatos de Linux. Las páginas manual no son sólo para los comandos de
Linux, sino también para los archivos del sistema y otras "características" del sistema
operativo. Además, en algunos casos habrá dos comandos con el mismo nombre, como en el
ejemplo proporcionado anteriormente.
Las diferentes páginas man se distinguen por "secciones". Por defecto, hay nueve secciones
de las páginas man:
5.2.10 Paso 10
Para visualizar una sección diferente de la página man, proporciona el número de la sección
como el primer argumento del comando man. Por ejemplo, ejecuta el siguiente comando:
man 5 passwd
PASSWD(5) File Formats and Conversions
PASSWD(5)
NAME
passwd - the password file
DESCRIPTION
/etc/passwd contains one line for each user account, with seven
fields
delimited by colons (":"). These fields are:
o login name
o numerical user ID
o numerical group ID
5.2.11 Paso 11
En lugar de usar man -f para mostrar todas las secciones de la página manual para el
nombre, también puedes utilizar el comando whatis:
whatis passwd
sysadmin@localhost:~$ whatis passwd
passwd (5) - the password file
passwd (1) - change user password
passwd (1ssl) - compute password hashes
sysadmin@localhost:~$
5.2.12 Paso 12
Casi todas las funciones del sistema (comandos, archivos de sistema, etc.) tienen páginas
man. Algunas de estas características también tienen una característica más avanzada
llamada páginas info. Por ejemplo, ejecuta el siguiente comando:
info date
File: coreutils.info, Node: date invocation, Next: arch invocation,
Up: Syst\
em context
Synopses:
Normally, `date' uses the time zone rules indicated by the `TZ'
environment variable, or the system default rules if `TZ' is not set.
*Note Specifying the Time Zone with `TZ': (libc)TZ Variable.
Para muchos usuarios novatos de Linux las páginas info son más fáciles de leer. A menudo
se escriben más bien como "lecciones" mientras que las páginas man se escriben simplemente
como documentación.
5.2.13 Paso 13
Mientras vas observando la página info del paso anterior, escribe la letra h para ver una lista
de los comandos de movimiento. Ten en cuenta que son diferentes de los comandos de
movimiento utilizados en las páginas man. Después de leer los comandos de movimiento,
escribe la letra l (L minúscula) para volver a la visualización del documento.
5.2.14 Paso 14
Utiliza los comandos de movimiento para leer la página de información para el comando date.
Cuando hayas terminado, coloca tu cursor en cualquier lugar de la línea *Examples of
date:: y presiona la tecla Entrar . Verás un nuevo documento que muestra los ejemplos
de date.
5.2.15 Paso 15
Introduce la tecla l para volver a la pantalla anterior. Cuando haya terminado la lectura,
introduce q para salir de la página de información.
5.2.16 Paso 16
Otra forma de obtener ayuda es mediante el uso de la opción --help de un comando. La
mayoría de los comandos te permiten pasar un argumento de --help para visualizar el uso
del comando básico:
date --help
sysadmin@localhost:~$ date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.
5.2.17 Paso 17
Algunas características del sistema también tienen documentos de ayuda más detallados
ubicados en la estructura del directorio /usr/share/doc. Ejecuta el siguiente comando para
ver el contenido de este documento:
ls /usr/share/doc
sysadmin@localhost:~$ ls /usr/share/doc
adduser libdrm2 libx11-data
apt libedit2 libxau6
ascii libelf1 libxcb1
base-files libffi6 libxdmcp6
base-passwd libgcc1 libxext6
bash libgcrypt11 libxml2
bind9 libgdbm3 libxmuu1
bind9-host libgeoip1 locales
bind9utils libgettextpo0 login
bsdmainutils libglib2.0-0 logrotate
bsdutils libgnutls26 lsb-base
busybox-initramfs libgomp1 makedev
bzip2 libgpg-error0 man-db
ca-certificates libgpm2 mawk
coreutils libgssapi-krb5-2 mc
cpio libgssapi3-heimdal mc-data
cron libhcrypto4-heimdal mime-support
curl libheimbase1-heimdal mlocate
dash libheimntlm0-heimdal module-init-tools
Cabe destacar que en casi todos los casos, las páginas man y páginas de información te
proporcionarán la información que necesites. Sin embargo, si necesitas una información más
en profundidad (algo que los administradores de sistemas a veces necesitan), entonces
puedes encontrar esta información en los archivos que se encuentran en el
directorio /usr/share/doc.
5.3.1 Paso 1
Una manera fácil de buscar un archivo es utilizar el comando locate. Por ejemplo, se puede
encontrar la ubicación del archivo crontab ejecutando el siguiente comando:
locate crontab
sysadmin@localhost:~$ locate crontab
/etc/crontab
/usr/bin/crontab
/usr/share/doc/cron/examples/crontab2english.pl
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
sysadmin@localhost:~$
5.3.2 Paso 2
Ten en cuenta que la salida del ejemplo anterior incluye los archivos que
tienen crontab como parte de su nombre. Para buscar los archivos que simplemente se
nombran crontab, utiliza el siguiente comando:
locate -b "\crontab"
sysadmin@localhost:~$ locate -b "\crontab"
/etc/crontab
/usr/bin/crontab
sysadmin@localhost:~$
5.3.3 Paso 3
Es posible que sólo quieras encontrar donde se encuentra un comando (o sus páginas man).
Esto se puede lograr con el comando whereis:
whereis passwd
sysadmin@localhost:~$ whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
/usr/share/man/man1/passwd.1ssl.gz /usr/share/man/man5/passwd.5.gz
sysadmin@localhost:~$
6.1 Introducción
Cuando trabajes en un sistema operativo Linux, necesitarás saber cómo manipular los
archivos y los directorios. Algunas distribuciones de Linux tienen aplicaciones basadas en GUI
que permiten gestionar los archivos, pero es importante saber cómo realizar estas
operaciones a través de la línea de comandos.
La línea de comandos dispone de una amplia colección de comandos que permiten
administrar los archivos. En este capítulo aprenderás cómo listar los archivos en un directorio,
así como, cómo copiar, mover y eliminar los archivos.
Los conceptos básicos enseñados en este capítulo se ampliarán en los capítulos posteriores
al ir cubriendo más comandos de manipulación de archivos, tales como los comandos para
ver archivos, comprimir archivos y establecer permisos de archivo.
Igual que Windows, la estructura de directorios de Linux tiene un nivel superior, sin embargo
no se llama Este Equipo, sino directorio raíz y su símbolo es el carácter / . También, en Linux
no hay unidades; cada dispositivo físico es accesible bajo un directorio, no una letra de
unidad. Una representación visual de una estructura de directorios típica de Linux:
sysadmin@localhost:~$ ls /
bin dev home lib media opt root sbin selinux sys usr
boot etc init lib64 mnt proc run sbin??? srv tmp var
Observa que hay muchos directorios descriptivos incluyendo /boot, que contiene los archivos
para arrancar la computadora.
sysadmin@localhost:~$ cd ~
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
Videos
sysadmin@localhost:~$
Ten en cuenta que una lista revela los subdirectorios contenidos en el directorio home.
Cambiar directorios requiere atención al detalle:
sysadmin@localhost:~$ cd downloads
-bash: cd: downloads: No such file or directory
sysadmin@localhost:~$
¿Por qué el anterior comando resultó en un error? Eso es porque los entornos de Linux son
sensibles a mayúsculas y minúsculas. Cambiarnos al directorio Downloads requiere que la
ortografía sea correcta - incluyendo la letra D mayúscula:
sysadmin@localhost:~$ cd Downloads
sysadmin@localhost:~/Downloads$
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$
Adicionalmente, la mayoría de los sistemas tiene el prompt que visualiza el directorio actual
del usuario por defecto:
[sysadmin@localhost ~]$
En el gráfico anterior, el carácter ~ indica el directorio actual. Como se mencionó
anteriormente, el carácter ~ representa el directorio home.
Normalmente el sistema sólo muestra el nombre del directorio actual, no la ruta completa del
directorio raíz hacia abajo. En otras palabras, si estuvieras en el directorio /usr/share/doc ,
tu prompt probablemente te proporcionará solamente el nombre doc el directorio actual. Si
quieres la ruta completa, utiliza el comando pwd.
sysadmin@localhost:~$ cd /etc/sound/events
sysadmin@localhost:/etc/sound/events$
Ten en cuenta que no vas a obtener salida si el comando cd tiene éxito. Este caso es uno de
los de "ninguna noticia es buena noticia". Si tratas de cambiar a un directorio que no existe,
recibirás un mensaje de error:
sysadmin@localhost:/etc/sound/events$ cd /etc/junk
-bash: cd: /etc/junk: No such file or directory
sysadmin@localhost:/etc/sound/events$
sysadmin@localhost:/etc/sound/events$ cd
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$ cd /etc
sysadmin@localhost:/etc$ cd ~
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$
sysadmin@localhost:~$ cd /etc/perl/Net
sysadmin@localhost:/etc/perl/Net$
sysadmin@localhost:/etc/perl$ cd Net
sysadmin@localhost:/etc/perl/Net$
sysadmin@localhost:/etc/perl/Net$ pwd
/etc/perl/Net
sysadmin@localhost:/etc/perl/Net$ cd ..
sysadmin@localhost:/etc/perl$ pwd
/etc/perl
sysadmin@localhost:/etc/perl$
A veces usar las rutas de acceso relativas es una mejor opción que rutas de acceso
absolutas, sin embargo esto no siempre es el caso. ¿Qué pasa si estás en el
directorio /etc/perl/Net y quieres ir al directorio /usr/share/doc? Utilizando una ruta
absoluta, se ejecutaría el comando cd /usr/share/doc. Utilizando una ruta relativa, se
ejecutaría el comando cd ../../../usr/share/doc:
sysadmin@localhost:/etc/perl/Net$ cd
sysadmin@localhost:~$ cd /etc/perl/Net
sysadmin@localhost:/etc/perl/Net$ cd /../../../usr/share/doc
sysadmin@localhost:/usr/share/doc$ pwd
/usr/share/doc
sysadmin@localhost:/usr/share/doc$
Nota: Las rutas relativas y absolutas no sólo sirven para el comando cd. Siempre cuando
especificas un archivo o un directorio, puedes utilizar las rutas de acceso relativas o absolutas.
Mientras que el doble punto (..) se utiliza para referirse al directorio arriba del directorio
actual, el punto solo (.) se usa para referirse al directorio actual. No tendría sentido para un
administrador moverse al directorio actual introduciendo cd . (aunque en realidad funciona).
Es más útil referirse a un elemento en el directorio actual usando la notación ./. Por ejemplo:
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$ cd ./Downloads/
sysadmin@localhost:~/Downloads$ pwd
/home/sysadmin/Downloads
sysadmin@localhost:~/Downloads$ cd ..
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$
Nota: Este uso del punto solo (.), como punto de referencia, no se debe confundir con su uso
al principio de un nombre de archivo. Leer más sobre los archivos ocultos en la sección 6.4.2.
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
Videos
sysadmin@localhost:~$
plain file (o «archivo simple» Un archivo que no es un tipo de archivo especial; también
en español) se llama un archivo normal
En muchas distribuciones de Linux, las cuentas de usuario regulares son modificadas de tal
manera que el comando ls muestre los nombres de archivo, codificados por colores según el
tipo de archivo. Por ejemplo, los directorios pueden aparecer en azul, archivos ejecutables
pueden verse en verde, y enlaces simbólicos pueden ser visualizados en cian (azul claro).
Esto no es un comportamiento normal para el comando ls, sino algo que sucede cuando se
utiliza la opción --color para el comando ls. La razón por la que el comando ls parece
realizar automáticamente estos colores, es que hay un alias para el comando ls para que se
ejecute con la opción --color:
sysadmin@localhost:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
sysadmin@localhost:~$
sysadmin@localhost:~$ ls -a
. .bashrc .selected_editor Downloads Public
.. .cache Desktop Music Templates
.bash_logout .profile Documents Pictures Videos
¿Por qué los archivos están ocultos en primer lugar? La mayoría de los archivos ocultos
son archivos de personalización, diseñados para personalizar la forma en la que Linux, el shell
o los programas funcionan. Por ejemplo, el archivo .bashrc en tu directorio home personaliza
las características del shell, tales como la creación o modificación de las variables y los alias.
Estos archivos de personalización no son con los que regularmente trabajas. Hay muchos de
ellos, como puedes ver, y visualizarlos hará más difícil encontrar los archivos con los que
regularmente trabajas. Así que, el hecho de que están ocultos es para tu beneficio.
sysadmin@localhost:~$ ls -l
total 0
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Desktop
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Documents
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Downloads
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Music
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Pictures
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Public
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Templates
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 2015 Videos
sysadmin@localhost:~$
En la salida anterior, cada línea describe metadatos sobre un solo archivo. A continuación se
describe cada uno de los campos de datos que verás en la salida del comando ls -l:
«Tipo de archivo. El primer carácter de cada línea de salida indica el tipo de archivo. Tipos de
archivo comunes incluyen: d= directorio, -= archivo simple, l= enlace simbólico»
«Permisos. Los próximos diez caracteres demostrarán los permisos del archivo. Los permisos
se utilizan para determinar quién tiene acceso al archivo. Esto será cubierto a detalle en un
capítulo posterior.»
«Conteo de enlaces físicos. El conteo de enlaces físicos de un archivo se usa para demostrar
cuantos enlaces físicos hacia este archivo existen. Los enlaces son más que nada un tema de
administrador por lo que no son cubiertos en este curso.»
«Usuario propietario. Cada archivo es propiedad de una cuenta de usuario. Esto es importante
porque el propietario tiene los derechos para establecer permisos en un archivo y el
propietario tiene sus propios permisos en el archivo. Los permisos se cubrirán a detalle en un
capítulo posterior.»
«Tamaño de archivo. Este campo describe el tamaño de un archivo en bytes. Nota: En el caso
de los directorios, este valor no describe el tamaño total del directorio, más bien, cuántos
bytes están reservados para mantenerse al corriente con los nombres de archivo en el
directorio (en otras palabras, ignora este campo en los directorios).»
«Hora de modificación. Este campo indica la última hora en la que el contenido del archivo fue
modificado. En el caso de los directorios, indica la última vez que se agregó o eliminó un
archivo dentro del directorio.»
sysadmin@localhost:~$ ls -l /usr/bin/omshell
-rwxr-xr-c 1 root root 1561400 Oct 9 2012 /usr/bin/omshell
sysadmin@localhost:~$
Como puedes ver, es difícil de determinar el tamaño del archivo en bytes. ¿Un archivo
1561400 es grande o pequeño? Parece bastante grande, pero es difícil de determinar su
tamaño utilizando los bytes.
Piénsalo de esta manera: si alguien diera la distancia entre Boston y Nueva York utilizando
centímetros, ese valor esencialmente no tendría sentido porque una distancia como ésta la
piensas en términos de kilómetros.
Sería mejor si el tamaño del archivo fuese presentado en un tamaño más fácilmente legible,
tal como megabytes o gigabytes. Para lograr esto, añade la opción -h al comando ls:
Para utilizar el comando ls -d de una manera significativa tienes que añadir la opción -l. En
este caso, ten en cuenta que el primer comando muestra los detalles de los contenidos en el
directorio /home/sysadmin, mientras que el segundo lista el directorio /home/sysadmin.
sysadmin@localhost:~$ ls -l
total 0
drwxr-xr-x 1 sysadmin sysadmin 0 Apr 15 2015 Desktop
drwxr-xr-x 1 sysadmin sysadmin 0 Apr 15 2015 Documents
drwxr-xr-x 1 sysadmin sysadmin 0 Apr 15 2015 Downloads
drwxr-xr-x 1 sysadmin sysadmin 0 Apr 15 2015 Music
drwxr-xr-x 1 sysadmin sysadmin 0 Apr 15 2015 Pictures
drwxr-xr-x 1 sysadmin sysadmin 0 Apr 15 2015 Public
drwxr-xr-x 1 sysadmin sysadmin 0 Apr 15 2015 Templates
drwxr-xr-x 1 sysadmin sysadmin 0 Apr 15 2015 Videos
drwxr-xr-x 1 sysadmin sysadmin 420 Apr 15 2015 test
sysadmin@localhost:~$ ls -ld
drwxr-xr-x 1 sysadmin sysadmin 224 Nov 7 17:07 .
sysadmin@localhost:~$
Observa el punto solo al final de la segunda lista larga. Esto indica que el directorio actual está
en la lista y no el contenido.
sysadmin@localhost:~$ ls -R /etc/ppp
/etc/ppp:
chap-secrets ip-down.ipv6to4 ip-up.ipv6to4 ipv6-up pap-secrets
ip-down ip-up ipv6-down options peers
/etc/ppp/peers:
sysadmin@localhost:~$
sysadmin@localhost:~$ ls /etc/ssh
moduli ssh_host_dsa_key.pub ssh_host_rsa_key sshd_confi
ssh_config ssh_host_ecdsa_key ssh_host_rsa_key.pub
ssh_host_dsa_key ssh_host_ecdsa_key.pub ssh_import_id
sysadmin@localhost:~$ ls -S /etc/ssh
moduli ssh_host_dsa_key ssh_host_ecdsa_key
sshd_config ssh_host_dsa_key.pub ssh_host_ecdsa_key.pub
ssh_host_rsa_key ssh_host_rsa_key.pub
ssh_config ssh_import_id
sysadmin@localhost:~$
Aparecen los mismos archivos y directorios, pero en un orden diferente. Mientras que la
opción -S trabaja por sí misma, realmente no puedes decir que la salida está ordenada por
tamaño, por lo que es más útil cuando se utiliza con la opción -l. El siguiente comando listará
los archivos del mayor al menor y mostrará el tamaño real del archivo.
También puede ser útil usar la opción -h para mostrar los tamaños de los archivos de una
manera legible:
También es posible ordenar los archivos según el momento en que se modificaron. Puedes
hacer esto mediante la opción -t.
La opción -t listará los archivos modificados más recientemente en primer lugar. Esta opción
puede utilizarse sola, pero otra vez, es generalmente más útil cuando se combina con la
opción -l:
Es importante recordar que la fecha de modificación de los directorios representa la última vez
que un archivo se agrega o se elimina del directorio.
Si los archivos en un directorio se modificaron hace muchos días o meses, puede ser más
difícil de decir exactamente cuándo fueron modificados, ya que para los archivos más antiguos
sólamente se proporciona la fecha. Para una información más detallada de la hora de
modificación puedes utilizar la opción --full time que visualiza la fecha y la hora completas
(incluyendo horas, segundos, minutos...):
El siguiente comando listará los archivos por fecha de modificación, de la más antigua a la
más reciente:
Ahora que sabes que el comando ls se utiliza normalmente para listar los archivos en un
directorio, el uso del comando echo puede parecer una elección extraña. Sin embargo, hay
algo sobre el comando ls que pudo haber causado confusión mientras hablamos sobre los
globs. Esta «función» también puede causar problemas cuando intentas listar los archivos
utilizando los patrones glob.
Ten en cuenta que es el shell, no los comandos echo o ls, el que expande el patrón glob a los
nombres de archivo correspondientes. En otras palabras, cuando introduces el comando echo
/etc/e*, lo que el shell hizo antes de ejecutar el comando echo fue reemplazar el e* por
todos los archivos y directorios dentro del directorio /etc que coinciden con el patrón.
Por lo tanto, si ejecutaras el comando ls /etc/e*, lo que el shell realmente haría, sería lo
siguiente:
sysadmin@localhost:~$ ls /etc/enscript.cfg
/etc/enscript.cfg
sysadmin@localhost:~$
Como puedes ver, ejecutando el comando ls en un solo archivo se imprime el nombre del
archivo. Generalmente esto es útil si quieres ver los detalles acerca de un archivo mediante la
opción -l del comando ls:
sysadmin@localhost:~$ ls -l /etc/enscript.cfg
-r--r--r--. 1 root root 4843 Nov 11 2010 /etc/enscript.cfg
sysadmin@localhost:~$
sysadmin@localhost:~$ ls /etc/event.d
ck-log-system-restart ck-log-system-start ck-log-system-stop
sysadmin@localhost:~$
sysadmin@localhost:~$ ls /etc/e*
/etc/encript.cfg /etc/environment /etc/ethers /etc/event.d /etc/exports
/etc/event.d:
ck-log-system-restart ck-log-system-start ck-log-system-stop
sysadmin@localhost:~$
Como puedes ver, cuando el comando ls ve un nombre de archivo como argumento, sólo
muestra el nombre del archivo. Sin embargo, para cualquier directorio, mostrará el contenido
del directorio, y no sólo el nombre del directorio.
Esto se vuelve aún más confuso en una situación como la siguiente:
sysadmin@localhost:~$ ls /etc/ev*
ck-log-system-restart ck-log-system-start ck-log-system-stop
sysadmin@localhost:~$
sysadmin@localhost:~$ ls -d /etc/e*
/etc/encript.cfg /etc/environment /etc/ethers /etc/event.d /etc/exports
sysadmin@localhost:~$
cp [fuente] [destino]
La fuente («source» en inglés) es el archivo que quieres copiar. El destino («destination» en
inglés) es la ubicación en donde quieres poner la copia. Cuando el comando es exitoso, el
comando cp no tendrá ninguna salida (ninguna noticia es buena noticia). El siguiente comando
copiará el archivo /etc/hosts a tu directorio home:
sysadmin@localhost:~$ cp /etc/hosts ~
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates hosts
Documents Music Public Videos
sysadmin@localhost:~$
sysadmin@localhost:~$ cp -v /etc/hosts ~
`/etc/hosts' -> `/home/sysadmin/hosts'
sysadmin@localhost:~$
Cuando el destino es un directorio, el nuevo archivo resultante tendrá el mismo nombre que el
archivo original. Si quieres que el nuevo archivo tenga un nombre diferente, debes
proporcionar el nuevo nombre como parte del destino:
sysadmin@localhost:~$
Hay dos opciones que pueden utilizarse para asegurarnos contra sobreescrituras accidentales
de los archivos. Con la opción -i (interactivo), el comando cp emitirá un prompt antes de
sobrescribir un archivo. En el siguiente ejemplo demostrará esta opción, primero restaurando
el contenido del archivo original:
sysadmin@localhost:~$
Observa que puesto que el valor de n (no) se dió al emitir un prompt de sobrescritura del
archivo, no se hicieron cambios en el archivo. Si se da un valor de y (sí), entonces resultará
en un proceso de copiado.
La opción -i requiere respuesta y o n para cada copia que podría sobrescribir el contenido de
un archivo existente. Esto puede ser tedioso cuando se sobrescribe un grupo, como se
muestra en el siguiente ejemplo:
sysadmin@localhost:~$ cp -i /etc/skel/.* ~
cp: omitting directory `/etc/skel/.'
cp: omitting directory `/etc/skel/..'
cp: overwrite `/home/sysadmin/.bash_logout'? n
cp: overwrite `/home/sysadmin/.bashrc'? n
cp: overwrite `/home/sysadmin/.profile'? n
cp: overwrite `/home/sysadmin/.selected_editor'? n
sysadmin@localhost:~$
sysadmin@localhost:~$ cp -i /etc/skel/.* ~
cp: omitting directory `/etc/skel/.'
cp: omitting directory `/etc/skel/..'
cp: overwrite `/home/sysadmin/.bash_logout'? n
cp: overwrite `/home/sysadmin/.bashrc'? n
cp: overwrite `/home/sysadmin/.profile'? n
cp: overwrite `/home/sysadmin/.selected_editor'? n
sysadmin@localhost:~$
mv [fuente] [destino]
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates example.txt hosts.copy
Documents Music Public Videos hosts
sysadmin@localhost:~$ mv hosts Videos
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates example.txt
Documents Music Public Videos hosts.copy
sysadmin@localhost:~$ ls Videos
hosts
sysadmin@localhost:~$
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates example.txt
Documents Music Public Videos
sysadmin@localhost:~$ mv example.txt Videos/newexample.txt
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates
Documents Music Public Videos
sysadmin@localhost:~$ ls Videos
hosts newexample.txt
sysadmin@localhost:~$
sysadmin@localhost:~$ cd Videos
sysadmin@localhost:~/Videos$ ls
hosts newexample.txt
sysadmin@localhost:~/Videos$ mv newexample.txt myexample.txt
sysadmin@localhost:~/Videos$ ls
hosts myexample.txt
sysadmin@localhost:~/Videos$
Opción Significado
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
Videos
sysadmin@localhost:~$ touch sample
sysadmin@localhost:~$ ls -l sample
-rw-rw-r-- 1 sysadmin sysadmin 0 Nov 9 16:48 sample
sysadmin@localhost:~$
Fíjate que el tamaño del archivo nuevo es 0 bytes. Como ya se mencionó anteriormente, el
comando touch no añade ningún dato en al archivo nuevo.
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates sample
Documents Music Public Videos
sysadmin@localhost:~$ rm sample
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
Videos
sysadmin@localhost:~$
Ten en cuenta que el archivo fue borrado sin hacer preguntas. Esto podría causar problemas
al borrar varios archivos usando los caracteres glob, por ejemplo: rm *.txt. Ya que estos
archivos son borrados sin proporcionar una pregunta, un usuario podría llegar a borrar
archivos que no quería eliminar.
Además, los archivos se eliminan permanentemente. No hay ningún comando para recuperar
un archivo y no hay «papelera de reciclaje» («trash can» en inglés) desde la que puedas
recuperar los archivos eliminados. Como precaución, los usuarios deben utilizar la opción -
i al eliminar varios archivos:
sysadmin@localhost:~$ rm Videos
rm: cannot remove `Videos': Is a directory
sysadmin@localhost:~$
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates sample.txt
Documents Music Public Videos
sysadmin@localhost:~$ rm -r Videos
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
sample.txt
sysadmin@localhost:~$
También puedes borrar un directorio con el comando rmdir, pero sólo si el directorio está
vacío.
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
sample.txt
sysadmin@localhost:~$ mkdir test
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates test
Documents Music Public sample.txt
sysadmin@localhost:~$
6.1 Introducción
Este es Lab 6: El listado de los Archivos y Directorios. Mediante la realización de esta práctica
de laboratorio, los estudiantes aprenderán a navegar en y gestionar los archivos y los
directorios.
En este laboratorio llevarás a cabo las siguientes tareas:
6.2.1 Paso 1
Escribe el siguiente comando para imprimir el directorio de trabajo:
pwd
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$
echo $HOME
sysadmin@localhost:~$ echo $HOME
/home/sysadmin
sysadmin@localhost:~$
6.2.2 Paso 2
Puedes utilizar el comando cd con el path a un directorio para cambiar el directorio actual.
Escribe el siguiente comando para que el directorio raíz sea tu directorio de trabajo actual y
verificarlo con el comando pwd:
cd /
pwd
sysadmin@localhost:~$ cd /
sysadmin@localhost:/$ pwd
/
sysadmin@localhost:/$
6.2.3 Paso 3
Para regresar a tu directorio home, el comando cd se puede ejecutar sin una ruta. Regresa a
tu directorio home y verifica escribiendo los siguientes comandos:
cd
pwd
sysadmin@localhost:/$ cd
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$
Observa el cambio en el prompt. El tilde ~ representa el directorio home. Esta parte del prompt
te dirá en qué directorio te encuentras actualmente.
6.2.4 Paso 4
El comando cd puede ser introducido con una ruta de acceso a un directorio especificado
como un argumento. Ejecuta el comando cd con el directorio /home como argumento
escribiendo lo siguiente:
cd /home
pwd
sysadmin@localhost:~$ cd /home
sysadmin@localhost:/home$ pwd
/home
sysadmin@localhost:/home$
6.2.5 Paso 5
Regresa a tu directorio home utilizando el comando cd con el tilde ~ como argumento:
cd ~
pwd
sysadmin@localhost:/home$ cd ~
sysadmin@localhost:~$ pwd
/home/sysadmin
sysadmin@localhost:~$
6.2.6 Paso 6
Utiliza el siguiente comando echo para visualizar algunos otros ejemplos del uso del tilde
como parte de la ruta:
6.2.7 Paso 7
Intenta cambiar al directorio home del usuario root escribiendo el siguiente comando:
cd ~root
sysadmin@localhost:~$ cd ~root
-bash: cd: /root: Permission denied
sysadmin@localhost:~$
6.2.8 Paso 8
Usando una ruta absoluta, pasa al directorio /usr/bin y visualiza el directorio de trabajo
mediante el uso de los siguientes comandos:
cd /usr/bin
pwd
sysadmin@localhost:~$ cd /usr/bin
sysadmin@localhost:/usr/bin$ pwd
/usr/bin
sysadmin@localhost:/usr/bin$
6.2.9 Paso 9
Utiliza una ruta absoluta para cambiar al directorio /usr y visualiza el directorio de trabajo
utilizando de los siguientes comandos:
cd /usr
pwd
sysadmin@localhost:/usr/bin$ cd /usr
sysadmin@localhost:/usr$ pwd
/usr
sysadmin@localhost:/usr$
6.2.10 Paso 10
Utiliza una ruta absoluta para cambiar al directorio /usr/share/doc y visualiza el directorio
de trabajo utilizando de los siguientes comandos:
cd /usr/share/doc
pwd
sysadmin@localhost:/usr$ cd /usr/share/doc
sysadmin@localhost:/usr/share/doc$ pwd
/usr/share/doc
sysadmin@localhost:/usr/share/doc$
6.2.11 Paso 11
Utiliza una ruta relativa para cambiar al directorio /usr/share/doc/bash y visualiza el
directorio de trabajo utilizando de los siguientes comandos:
cd bash
pwd
sysadmin@localhost:/usr/share/doc$ cd bash
sysadmin@localhost:/usr/share/doc/bash$ pwd
/usr/share/doc/bash
sysadmin@localhost:/usr/share/doc/bash$
6.2.12 Paso 12
Utiliza una ruta relativa para cambiar al directorio por encima del directorio actual:
cd ..
pwd
sysadmin@localhost:/usr/share/doc/bash$ cd ..
sysadmin@localhost:/usr/share/doc$ pwd
/usr/share/doc
sysadmin@localhost:/usr/share/doc$
6.2.13 Paso 13
Utiliza una ruta relativa para cambiar a un nivel hacia arriba desde el directorio actual y luego
hacia abajo al directorio dict :
cd ../dict
pwd
sysadmin@localhost:/usr/share/doc$ cd ../dict
sysadmin@localhost:/usr/share/dict$ pwd
/usr/share/dict
sysadmin@localhost:/usr/share/dict$
6.3.1 Paso 1
Para listar los contenidos del directorio actual, utiliza el comando ls:
cd
ls
sysadmin@localhost:/usr/share/dict$ cd
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$
En la salida del comando ls anterior, los nombres de los archivo se colocaron en un color azul
claro. Esta es una característica que muchas distribuciones de Linux proporcionan de forma
automática a través de una característica llamada alias (más sobre esta característica en un
laboratorio posterior).
El color indica el tipo de elemento. En la siguiente tabla se describen algunos de los colores
más comunes:
Cian Archivo de enlace simbólico (un archivo que apunta a otro archivo)
6.3.2 Paso 2
No todos los archivos se muestran por defecto. Hay archivos, llamados archivos ocultos, que
no se muestran de forma predeterminada. Para mostrar todos los archivos, incluyendo los
archivos ocultos, utiliza la opción -a para el comando ls:
ls -a
sysadmin@localhost:~$ ls -a
. .bashrc .selected_editor Downloads Public
.. .cache Desktop Music Templates
.bash_logout .profile Documents Pictures Videos
sysadmin@localhost:~$
Los archivos ocultos comienzan con un punto (un carácter de punto). Normalmente, estos
archivos y directorios a menudo están ocultos porque no son archivos que normalmente
quieres ver.
Por ejemplo, el archivo .bashrc que se muestra en el ejemplo anterior contiene la
información de configuración para el bash shell. Es un archivo que normalmente no necesitas
ver.
En todos los directorios existen dos «dot files» ( «archivos de punto» en español)
importantes: . (representa el directorio actual) y .. (representa el directorio por encima del
directorio actual).
6.3.3 Paso 3
Por sí mismo, el comando ls solamente proporcionó los nombres de los archivos y directorios
dentro del directorio especificado (o actual). Ejecuta el siguiente comando para ver cómo la
opción -l proporciona más información acerca de un archivo:
ls -l /etc/hosts
sysadmin@localhost:~$ ls -l /etc/hosts
-rw-r--r-- 1 root root 150 Jan 22 15:18 /etc/hosts
sysadmin@localhost:~$
Por lo tanto, ¿qué significa todo esto acerca de la salida adicional? La siguiente tabla ofrece
un desglose breve de lo que cada parte de la salida de ls -l significa:
6.3.4 Paso 4
A veces no sólo quiere ver el contenido de un directorio, sino también el contenido de los
subdirectorios. Para este fin puedes utilizar la opción -R:
ls -R /etc/udev
sysadmin@localhost:~$ ls -R /etc/udev
/etc/udev:
rules.d udev.conf
/etc/udev/rules.d:
70-persistent-cd.rules README
sysadmin@localhost:~$
6.3.5 Paso 5
Puedes utilizar globbing en archivos (comodines) para limitar los archivos o directorios que
veas. Por ejemplo, el carácter * puede igualar "cero o más caracteres" en un nombre de
archivo. Ejecuta el siguiente comando para mostrar sólo los archivos que comienzan con la
letra s en el directorio /etc :
ls -d /etc/s*
sysadmin@localhost:~$ ls -d /etc/s*
/etc/securetty /etc/sgml /etc/shells /etc/ssl
/etc/sysctl.conf
/etc/security /etc/shadow /etc/skel /etc/sudoers /etc/sysctl.d
/etc/services /etc/shadow- /etc/ssh /etc/sudoers.d /etc/systemd
sysadmin@localhost:~$
Ten en cuenta que la opción -d evita que los archivos de los subdirectorios se muestren.
Siempre se debe utilizar con el comando ls cuando utilizas el globbing en archivos.
6.3.6 Paso 6
El carácter ? se puede utilizar para coincidir exactamente con 1 carácter en un nombre de
archivo. Ejecuta el siguiente comando para mostrar todos los archivos del directorio /etc que
tienen exactamente cuatro caracteres:
ls -d /etc/????
sysadmin@localhost:~$ ls -d /etc/????
/etc/bind /etc/init /etc/motd /etc/perl /etc/skel
/etc/dpkg /etc/ldap /etc/mtab /etc/sgml /etc/udev
sysadmin@localhost:~$
6.3.7 Paso 7
Utilizando los corchetes [ ] puedes especificar un solo carácter para coincidir a partir de un
conjunto de caracteres. Ejecuta el siguiente comando para mostrar todos los archivos en el
directorio /etc que comienzan con las letras a, b, c o d:
ls –d /etc/[abcd]*
sysadmin@localhost:~$ ls -d /etc/[abcd]*
/etc/adduser.conf /etc/blkid.conf /etc/cron.weekly
/etc/adjtime /etc/blkid.tab /etc/crontab
/etc/alternatives /etc/ca-certificates /etc/dbus-1
/etc/apparmor.d /etc/ca-certificates.conf /etc/debconf.conf
/etc/apt /etc/calendar
/etc/debian_version
/etc/bash.bashrc /etc/cron.d /etc/default
/etc/bash_completion.d /etc/cron.daily /etc/deluser.conf
/etc/bind /etc/cron.hourly /etc/depmod.d
/etc/bindresvport.blacklist /etc/cron.monthly /etc/dpkg
sysadmin@localhost:~$
6.4.1 Paso 1
Haz una copia del archivo /etc/hosts y colócalo en el directorio actual. Ahora lista los
contenidos del directorio actual antes y después de realizar la copia:
ls
cp /etc/hosts hosts
ls
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ cp /etc/hosts hosts
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates hosts
Documents Music Public Videos
sysadmin@localhost:~$
6.4.2 Paso 2
A continuación vas a eliminar el archivo, y luego copiarlo de nuevo, pero haz que el sistema te
diga lo que se está haciendo. Lo puedes lograr usando la opción -v o --verbose . Introduce
los siguientes comandos:
rm hosts
ls
cp –v /etc/hosts hosts
ls
Ten en cuenta que el comando rm se utiliza para borrar un archivo. Más información sobre
este comando se proporciona más adelante en este laboratorio.
Tu resultado debe ser similar al siguiente:
sysadmin@localhost:~$ rm hosts
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ cp -v /etc/hosts hosts
`/etc/hosts' -> `hosts'
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates hosts
Documents Music Public Videos
sysadmin@localhost:~$
6.4.3 Paso 3
Introduce los siguientes comandos para copiar el archivo /etc/hosts utilizando el punto .
para indicar el directorio actual como destino:
rm hosts
ls
cp –v /etc/hosts .
ls
sysadmin@localhost:~$ rm hosts
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ cp -v /etc/hosts .
`/etc/hosts' -> `hosts'
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates hosts
Documents Music Public Videos
sysadmin@localhost:~$
El punto . es un carácter útil para decir "el directorio actual". Se puede utilizar con todos los
comandos de Linux, no sólo el comando cp .
6.4.4 Paso 4
Introduce los siguientes comandos para copiar desde el directorio de origen y preservar los
atributos del archivo utilizando la opción -p:
rm hosts
ls
cd /etc
ls -l hosts
cp –p hosts /home/sysadmin
cd
ls –l hosts
sysadmin@localhost:~$ rm hosts
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ cd /etc
sysadmin@localhost:/etc$ ls -l hosts
-rw-r--r-- 1 root root 150 Jan 22 15:18 hosts
sysadmin@localhost:/etc$ cp -p hosts /home/sysadmin
sysadmin@localhost:/etc$ cd
sysadmin@localhost:~$ ls -l hosts
-rw-r--r-- 1 sysadmin sysadmin 150 Jan 22 15:18 hosts
sysadmin@localhost:~$
Observa que los modos de fecha y permisos quedaron preservados. Ten en cuenta que la
fecha y hora en la salida anterior son las mismas tanto para el archivo original y como la
copia (Jan 22 15:18) en el ejemplo proporcionado anteriormente. Tu resultado puede ser
distinto.
6.4.5 Paso 5
Introduce los siguientes comandos para copiar utilizando un nombre de destino diferente:
rm hosts
cp -p /etc/hosts ~
cp hosts newname
ls –l hosts newname
rm hosts newname
sysadmin@localhost:~$ rm hosts
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ cp -p /etc/hosts ~
sysadmin@localhost:~$ cp hosts newname
sysadmin@localhost:~$ ls -l hosts newname
-rw-r--r-- 1 sysadmin sysadmin 150 Jan 22 15:18 hosts
-rw-r--r-- 1 sysadmin sysadmin 150 Jan 22 16:29 newname
sysadmin@localhost:~$ rm hosts newname
sysadmin@localhost:~$
6.4.6 Paso 6
Para copiar todos los archivos en un directorio utiliza la opción -R. Para esta tarea, copiarás el
directorio /etc/udev y mostrarás el contenido del directorio copiado:
mkdir Myetc
cp –R /etc/udev Myetc
ls –l Myetc
ls –lR Myetc
sysadmin@localhost:~$ mkdir Myetc
sysadmin@localhost:~$ cp -R /etc/udev Myetc
sysadmin@localhost:~$ ls -l Myetc
total 0
drwxr-xr-x 1 sysadmin sysadmin 32 Jan 22 16:35 udev
sysadmin@localhost:~$ ls -lR Myetc
Myetc:
total 0
drwxr-xr-x 1 sysadmin sysadmin 32 Jan 22 16:35 udev
Myetc/udev:
total 4
drwxr-xr-x 1 sysadmin sysadmin 56 Jan 22 16:35 rules.d
-rw-r--r-- 1 sysadmin sysadmin 218 Jan 22 16:35 udev.conf
Myetc/udev/rules.d:
total 8
-rw-r--r-- 1 sysadmin sysadmin 306 Jan 22 16:35 70-persistent-cd.rules
-rw-r--r-- 1 sysadmin sysadmin 1157 Jan 22 16:35 README
sysadmin@localhost:~$
6.4.7 Paso 7
Para eliminar un directorio utiliza la opción -r con el comando rm:
ls
rm -r Myetc
ls
sysadmin@localhost:~$ ls
Desktop Downloads Myetc Public Videos
Documents Music Pictures Templates
sysadmin@localhost:~$ rm -r Myetc
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$
Ten en cuenta que el comando rmdir también se puede utilizar para eliminar los directorios,
pero sólo si el directorio está vacío (si no contiene archivos).
También ten en cuenta la opción -r. Esta opción elimina los directorios y sus contenidos de
forma recursiva.
6.4.8 Paso 8
Mover un archivo es análogo a un «cortar y pegar». El archivo se «corta» (retira) de la
ubicación original y «pega» al destino especificado. Mueve un archivo en el directorio local
mediante la ejecución de los siguientes comandos:
touch premove
ls
mv premove postmove
ls
rm postmove
7.1 Introducción
En este capítulo vamos a hablar de cómo gestionar los archivos en la línea de comandos.
El Empaquetamiento de Archivos se utiliza cuando uno o más archivos se tienen que
transmitir o almacenar lo más eficientemente posible. Hay dos aspectos:
bob:tmp $ ls -l access_log*
-rw-r--r-- 1 sean sean 372063 Oct 11 21:24 access_log
bob:tmp $ gzip access_log
bob:tmp $ ls -l access_log*
-rw-r--r-- 1 sean sean 26080 Oct 11 21:24 access_log.gz
Aquí puedes ver que se da el porcentaje de compresión de 93%, lo inverso de la relación 14:1,
es decir, 13/14. Además, cuando el archivo se descomprime, se llamará access_log.
Recordar los modos es clave para averiguar las opciones de la línea de comandos necesarias
para hacer lo que quieres. Además del modo, querrás asegurarte de que recuerdas dónde
especificar el nombre del archivo, ya que podrías estar introduciendo varios nombres de
archivo en una línea de comandos.
Aquí, mostramos un archivo tar, también llamado un tarball, siendo creado a partir de múltiples
registros de acceso.
El ejemplo anterior muestra el mismo comando como en el ejemplo anterior, pero con la
adición del parámetro z. La salida es mucho menor que el tarball en sí mismo, y el archivo
resultante es compatible con gzip. Se puede ver en el último comando que el archivo
descomprimido es del mismo tamaño, como si hubieras utilizado el tar en un paso separado.
Mientras que UNIX no trata las extensiones de archivo especialmente, la convención es
usar .tar para los archivos tar y .tar.gz o .tgz para los archivos tar comprimidos.
Puedes utilizar bzip2 en vez de gzip sustituyendo la letra z con j y usando .tar.bz2,.tbz,
o .tbz2 para una extensión de archivo (por ejemplo tar –cjf file.tbz access_log*).
En el archivo tar, comprimido o no, puedes ver lo que hay dentro utilizando el comando t:
El contenido del archivo comprimido entonces es desplegado. Puedes ver que un directorio
fue prefijado a los archivos. Tar se efectuará de manera recursiva hacia los subdirectorios
automáticamente cuando comprime y almacenará la información de la ruta de acceso dentro
del archivo.
Sólo para mostrar que este archivo aún no es nada especial, vamos a listar el contenido del
archivo en dos pasos mediante una barra vertical.
El ejemplo anterior utiliza un patrón similar como antes, especificando la operación (eXtract),
compresión ( (la opción j, que significa bzip2) y un nombre de archivo -
f access_logs.tbz). El archivo original está intacto y se crea el nuevo directorio logs. Los
archivos están dentro del directorio.
Añade la opción –v y obtendrás una salida detallada de los archivos procesados. Esto es útil
para que puedas ver lo que está sucediendo:
Si sólo quieres algunos documentos del archivo empaquetado puedes agregar sus nombres al
final del comando, pero por defecto deben coincidir exactamente con el nombre del archivo o
puedes utilizar un patrón:
El ejemplo anterior muestra el mismo archivo que antes, pero extrayendo solamente el
archivo logs/access_log. La salida del comando (ya se solicitó el modo detallado con la
bandera v) muestra que sólo un archivo se ha extraído.
El tar tiene muchas más funciones, como la capacidad de utilizar los patrones al extraer los
archivos, excluir ciertos archivos o mostrar los archivos extraídos en la pantalla en lugar de un
disco. La documentación para el tar contiene información a profundidad.
El primer argumento en el ejemplo anterior es el nombre del archivo sobre el cual se trabajará,
en este caso es el logs.zip. Después de eso, hay que añadir una lista de archivos a ser
agregados. La salida muestra los archivos y la relación de compresión. Debes notar que
el tar requiere la opción –f para indicar que se está pasando un nombre de archivo, mientras
que el zip y unzip requiere un nombre de archivo, por lo tanto no tienes que decir
explícitamente que se está pasando un nombre de archivo.
Zip no se efectuará de manera recursiva hacia los subdirectorios por defecto, lo que es un
comportamiento diferente del tar. Es decir, simplemente añadiendo logs en vez
de logs/* sólo añadirá un directorio vacío y no los archivos dentro de él. Si quieres
que zip se comporte de manera parecida, debes utilizar el comando –r para indicar que se
debe usar la recursividad:
Extraer los archivos es como crear el archivo, ya que la operación predeterminada es extraer:
Aquí, extraemos todos los documentos del archivo empaquetado al directorio actual. Al igual
que el tar, puedes pasar los nombres de archivos a la línea de comandos:
El ejemplo anterior muestra tres diferentes intentos para extraer un archivo. En primer lugar,
se pasa sólo el nombre del archivo sin el componente del directorio. Al igual que con el tar, el
archivo no coincide.
El segundo intento pasa el componente del directorio junto con el nombre del archivo, que
extrae solo ese archivo.
La tercera versión utiliza un comodín, que extrae los 4 archivos que coinciden con el patrón, al
igual que el tar.
Las páginas man del zip y unzip describen las otras cosas que puedes hacer con estas
herramientas, tales como reemplazar los archivos dentro del archivo empaquetado, utilizar los
diferentes niveles de compresión o incluso el cifrado.
7.1 Introducción
Este es Lab 7: Empaquetamiento y desempaquetamiento de los archivos. Mediante la
realización de esta práctica de laboratorio, los estudiantes aprenderán cómo trabajar con los
archivos empaquetados.
En este laboratorio llevarás a cabo las siguientes tareas:
a. Los archivos grandes pueden ser difíciles de transferir. Haciendo estos archivos más
pequeños ayuda a hacer la transferencia más rápida.
b. La transferencia de múltiples archivos de un sistema a otro puede llegar a ser tedioso
cuando hay muchos archivos. Su fusión en un único archivo para la transferencia hace
que este proceso sea más fácil.
c. Los archivos pueden ocupar rápidamente una gran cantidad de espacio,
especialmente en un medio extraíble como memorias USB más pequeñas. El
empaquetamiento reduce este problema.
7.2.1 Paso 1
Utiliza el siguiente comando tar para crear un archivo empaquetado del
directorio /etc/udev. Guardar la copia de seguridad en el directorio ~/mybackups :
cd
mkdir mybackups
tar –cvf mybackups/udev.tar /etc/udev
ls mybackups
sysadmin@localhost:~$ cd
sysadmin@localhost:~$ mkdir mybackups
sysadmin@localhost:~$ tar -cvf mybackups/udev.tar /etc/udev
tar: Removing leading `/' from member names
/etc/udev/
/etc/udev/rules.d/
/etc/udev/rules.d/70-persistent-cd.rules
/etc/udev/rules.d/README
/etc/udev/udev.conf
sysadmin@localhost:~$ ls mybackups/
udev.tar
sysadmin@localhost:~$
El comando tar se utiliza para combinar varios archivos en un solo archivo. Por defecto no
comprime los datos.
La opción -c le indica al comando tar que cree un archivo tar. La opción -v significa
"verbose", que le indica al comando tar para muestre lo que está haciendo. La opción -f se
utiliza para especificar el nombre del archivo tar.
Para tu información: tar significa Tape ARchive (archivo de cinta). Este comando se utilizó
originalmente para crear copias de seguridad de cintas, pero hoy en día es más comúnmente
utilizado para crear los archivo empaquetados.
Importante: No tienes que utilizar la extensión .tar con nombre de archivo empaquetado,
sin embargo, es muy útil para determinar el tipo de archivo. Se considera de «buen estilo»
cuando envias un archivo a otra persona.
7.2.2 Paso 2
Muestra el contenido del archivo tar (t = lista el contenido, v = verbose, f =nombre del
archivo):
Ten en cuenta que los archivos fueron copiados de forma recursiva utilizando los nombres de
ruta relativa . Esto es importante porque al extraer los archivos, que serán colocados en el
directorio actual, no se reemplazan los archivos actuales.
7.2.3 Paso 3
Para crear un archivo tar comprimido, utiliza la opción -z:
Observa la diferencia de tamaño; la primera copia de seguridad (10 Kbytes) es mayor que la
segunda copia de seguridad (1.2 Kbytes).
La opción -z hace uso de la utilidad gzip para realizar la compresión.
7.2.4 Paso 4
Extraer el contenido de un archivo. Los datos se restauran en el directorio actual por defecto:
cd mybackups
tar –xvf udev.tar.gz
ls
ls etc
ls etc/udev
ls etc/udev/rules.d
sysadmin@localhost:~$ cd mybackups
sysadmin@localhost:~/mybackups$ ls
udev.tar udev.tar.gz
sysadmin@localhost:~/mybackups$ tar -xvf udev.tar.gz
etc/udev/
etc/udev/rules.d/
etc/udev/rules.d/70-persistent-cd.rules
etc/udev/rules.d/README
etc/udev/udev.conf
sysadmin@localhost:~/mybackups$ ls
etc udev.tar udev.tar.gz
sysadmin@localhost:~/mybackups$ ls etc
udev
sysadmin@localhost:~/mybackups$ ls etc/udev
rules.d udev.conf
sysadmin@localhost:~/mybackups$ ls etc/udev/rules.d
70-persistent-cd.rules README
sysadmin@localhost:~/mybackups$
7.2.5 Paso 5
Para añadir un archivo a un archivo empaquetado existente, utiliza la opción -r con el
comando tar. Ejecuta los siguientes comandos para realizar esta acción y comprobar la
existencia del archivo nuevo en el archivo empaquetado tar:
cp /usr/share/dict/words .
ls -l words
gzip words
ls -l words.gz
sysadmin@localhost:~/mybackups$ cp /usr/share/dict/words .
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
sysadmin@localhost:~/mybackups$ gzip words
sysadmin@localhost:~/mybackups$ ls -l words.gz
-rw-r--r-- 1 sysadmin sysadmin 255996 Jan 25 07:39 words.gz
sysadmin@localhost:~/mybackups$
7.2.7 Paso 7
Ejecuta los siguientes comandos para descomprimir el archivo words.gz :
ls -l words.gz
gunzip words.gz
ls -l words
7.2.8 Paso 8
El uso de los comandos bzip2 y bunzip2 para comprimir y descomprimir un archivo es muy
similar al de los comandos gzip y gunzip. El archivo comprimido se crea con
una extensión .bz2. La extensión se retira una vez descomprimido. Ejecuta los siguientes
comandos para comprimir una copia del archivo words :
ls -l words
bzip2 words
ls -l words.bz2
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
sysadmin@localhost:~/mybackups$ bzip2 words
sysadmin@localhost:~/mybackups$ ls -l words.bz2
-rw-r--r-- 1 sysadmin sysadmin 335405 Jan 25 07:39 words.bz2
sysadmin@localhost:~/mybackups$
Si se compara el resultado tamaño del archivo .bz2 resultante (335405) con el tamaño del
archivo .gz (255996) en el paso no. 7, se puede observar que gzip hizo un mejor trabajo al
comprimir ese archivo en particular.
7.2.9 Paso 9
Ejecuta los siguientes comandos para descomprimir el archivo words.bz2 :
ls -l words.bz2
bunzip2 words.bz2
ls -l words
sysadmin@localhost:~/mybackups$ ls -l words.bz2
-rw-r--r-- 1 sysadmin sysadmin 335405 Jan 25 07:39 words.bz2
sysadmin@localhost:~/mybackups$ bunzip2 words.bz2
sysadmin@localhost:~/mybackups$ ls -l words
-rw-r--r-- 1 sysadmin sysadmin 938848 Jan 25 07:39 words
7.2.10 Paso 10
Utiliza el comando zip para comprimir el archivo words:
7.2.11 Paso 11
Comprime el directorio /etc/udev y su contenido con el comando de compresión zip:
7.2.12 Paso 12
Para ver el contenido de un archivo zip, utiliza la opción -l con el comando unzip:
unzip -l udev.zip
7.2.13 Paso 13
Para extraer el archivo zip, utiliza el comando unzip sin ninguna opción. En este ejemplo,
primero tenemos que eliminar los archivos que se crearon en el ejemplo tar más arriba:
rm -r etc
unzip udev.zip
sysadmin@localhost:~/mybackups$ rm -r etc
sysadmin@localhost:~/mybackups$ unzip udev.zip
Archive: udev.zip
creating: etc/udev/
creating: etc/udev/rules.d/
inflating: etc/udev/rules.d/70-persistent-cd.rules
inflating: etc/udev/rules.d/README
inflating: etc/udev/udev.conf
sysadmin@localhost:~/mybackups$
8.1 Introducción
Un gran número de los archivos en un típico sistema de archivos son archivos de texto. Los
archivos de texto contienen sólo texto, sin características de formato que puedes ver en un
archivo de procesamiento de texto.
Ya que hay muchos de estos archivos en un sistema Linux típico, existe un gran número de
comandos para ayudar a los usuarios manipular los archivos de texto. Hay comandos para ver
y modificar estos archivos de varias maneras.
Además, existen características disponibles para el shell para controlar la salida de los
comandos, así que en lugar de tener la salida en la ventana de la terminal, la salida se
puede redirigir a otro archivo u otro comando. Estas características de la redirección ofrecen a
los usuarios un entorno más flexible y potente para trabajar.
#kernel.domainname = example.com
El carácter de la barra vertical permite a los usuarios utilizar estos comandos no sólo en los
archivos, sino también en la salida de otros comandos. Esto puede ser útil al listar un
directorio grande, por ejemplo el directorio /etc:
Si te fijas en la salida del comando anterior, notarás que ese primer nombre del archivo
es ca-certificates. Pero hay otros archivos listados "arriba" que sólo pueden verse si el
usuario utiliza la barra de desplazamiento. ¿Qué pasa si sólo quieres listas algunos de los
primeros archivos del directorio /etc?
En lugar de mostrar la salida del comando anterior, poner la barra vertical junto al
comando head muestra sólo las primeras diez líneas:
sysadmin@localhost:~$ ls -l /etc/ppp | nl
1 total 44
2 -rw------- 1 root root 78 Aug 22 2010 chap-secrets
3 -rwxr-xr-x 1 root root 386 Apr 27 2012 ip-down
4 -rwxr-xr-x 1 root root 3262 Apr 27 2012 ip-down.ipv6to4
5 -rwxr-xr-x 1 root root 430 Apr 27 2012 ip-up
6 -rwxr-xr-x 1 root root 6517 Apr 27 2012 ip-up.ipv6to4
7 -rwxr-xr-x 1 root root 1687 Apr 27 2012 ipv6-down
8 -rwxr-xr-x 1 root root 3196 Apr 27 2012 ipv6-up
9 -rw-r--r-- 1 root root 5 Aug 22 2010 options
10 -rw------- 1 root root 77 Aug 22 2010 pap-secrets
11 drwxr-xr-x 2 root root 4096 Jun 22 2012 peers
sysadmin@localhost:~$
8.3.2 STDOUT
Salida estándar o STDOUT es la salida normal de los comandos. Cuando un comando
funciona correctamente (sin errores), la salida que produce se llama STDOUT. De forma
predeterminada, STDOUT se muestra en la ventana de la terminal (pantalla) donde se ejecuta
el comando.
8.3.3 STDERR
Error estándar o STDERR son mensajes de error generados por los comandos. De forma
predeterminada, STDERR se muestra en la ventana de la terminal (pantalla) donde se ejecuta
el comando.
La redirección de E/S permite al usuario redirigir STDIN para que los datos provengan de un
archivo y la salida de STDOUT/STDERR vaya a un archivo. La redirección se logra mediante
el uso de los caracteres de la flecha: < y >.
El contenido original del archivo ha desaparecido y fue reemplazado por la salida del
comando echo nuevo.
También es posible preservar el contenido de un archivo existente anexando al mismo. Utiliza
la «doble flecha» >> para anexar a un archivo en vez de sobreescribirlo:
sysadmin@localhost:~$ ls /fake
ls: cannot access /fake: No such file or directory
sysadmin@localhost:~$
Ten en cuenta que no hay nada en el ejemplo anterior lo que implica que la salida es
STDERR. La salida es claramente un mensaje de error, pero ¿cómo podrías saber que se
envía al STDERR? Una manera fácil de determinar esto es redirigir al STDOUT:
Las salidas STDOUT y STDERR pueden enviarse a un archivo mediante el uso de &> un
conjunto de caracteres que significan «ambos 1> y 2>»:
Ten en cuenta que cuando se utiliza &>, la salida aparece en el archivo con todos los
mensajes STDERR en la parte superior y todos los mensaje STDOUT debajo de todos los
mensajes de STDERR:
/etc/sound:
events
sysadmin@localhost:~$
Si no quieres que las salidas STDERR y STDOUT vayan al mismo archivo, puede redirigirlas a
diferentes archivos utilizando > and 2>. Por ejemplo:
sysadmin@localhost:~$ cat
hello
hello
how are you?
how are you?
goodbye
goodbye
sysadmin@localhost:~$
El comando tr tomó la entrada STDIN desde el teclado (watch how this works) (a ver
cómo funciona esto) y convierte todas las letras en minúsculas antes de enviar la salida
STDOUT a la pantalla (WATCH HOW THIS WORKS).
Parecería que el comando tr sirviera más para realizar la traducción en un archivo, no la
entrada del teclado. Sin embargo, el comando tr no admite argumentos del nombre de
archivo:
Sin embargo, puedes decirle al shell que obtenga la STDIN de un archivo en vez de desde el
teclado mediante el uso del carácter <:
Component Description
[opción de Aquí el usuario especifica una opción para determinar qué tipo de
búsqueda] metadatos hay que buscar; hay opciones para el nombre de archivo,
tamaño de archivo y muchos otros atributos de archivo.
[opción de Esta opción se utiliza para especificar qué acción se debe tomar al
resultado] encontrar el archivo. Si no se proporciona ninguna opción, se imprimirá el
nombre del archivo a STDOUT.
Mientras que la salida es más fácil de leer, realmente no hay ningún propósito para almacenar
los mensajes de error en el archivo error.txt. Los desarrolladores de Linux se dieron
cuenta de que sería bueno tener un archivo de «basura» (o «junk» en inglés) para enviar los
datos innecesarios; se descarta cualquier archivo que envíes al archivo /dev/null:
Nota: Las dos primeras columnas de la salida anterior son el número inodo del archivo y el
número de bloques que el archivo utiliza para el almacenamiento. Ambos están más allá del
alcance del tema en cuestión. El resto de las columnas son la salida típica del comando ls -
l: tipo de archivo, permisos, cuenta de enlaces físico, usuario propietario, grupo propietario,
tamaño del archivo, hora de modificación del archivo y el nombre de archivo.
Si quieres buscar los archivos que son más grandes que un tamaño especificado, puedes usar
el carácter + antes que el tamaño. Por ejemplo, el siguiente ejemplo buscará todos los
archivos en la estructura de directorio /usr que su tamaño sea mayor a 100 megabytes:
Si quieres buscar los archivos que son más pequeños que un tamaño especificado, puedes
usar el carácter - antes que el tamaño.
Opción Significado
-group Devuelve los archivos que son propiedad de un grupo especificado. Por
ejemplo, -group payrolldevolvería los archivos que son propiedad del
grupo payroll (o «nómina» en español).
-iname Devuelve los archivos especificados que coinciden con el nombre de archivo,
pero a diferencia del -name, -iname no es sensible a las mayúsculas y
minúsculas. Por ejemplo, -iname hosts coincidiría con los archivos
llamados hosts, Hosts, HOSTS, etc.
-mmin Devuelve los archivos que fueron modificados según el tiempo de modificación
en minutos. Por ejemplo, -mmin 10 coincidirá con los archivos que fueron
Opción Significado
-type Devuelve los archivos que coinciden con el tipo de archivo. Por ejemplo, -type
f devuelve los archivos que son archivos regulares.
-user Devuelve los archivos que son propiedad de un usuario especificado. Por
ejemplo, -user bob devuelve los archivos que son propiedad del usuario bob.
Movimiento Tecla
Salir q
Ayuda h
Cuando se utiliza el comando less para moverse entre las páginas, la forma más fácil de
avanzar una página hacia adelante es presionando la barra espaciadora.
bullfrog
bullfrog's
bullfrogs
bullheaded
bullhorn
bullhorn's
bullhorns
bullied
bullies
bulling
bullion
bullion's
bullish
bullock
bullock's
bullocks
bullpen
bullpen's
bullpens
bullring
bullring's
bullrings
bulls
:
Observa que «frog» no tiene que ser una palabra por sí misma. Observa también, que
mientras el comando less te llevó a la primera coincidencia desde tu posición actual, todas
las coincidencias se resaltaron.
Si no se encuentra ninguna coincidencia hacia adelante desde tu posición actual, la última
línea de la pantalla reportará «Pattern not found» (o «Patrón no encontrado» en
español):
Como puedes observar en los ejemplos anteriores, ambos comandos darán salida al texto de
un archivo regular o de la salida de cualquier comando enviado mediante la barra vertical.
Ambos utilizan la opción -n para indicar cuántas líneas debe contener la salida.
8.6.1 El Valor Negativo de la Opción -n
Tradicionalmente en UNIX, se especifica el número de líneas a mostrar como una opción con
cualquiera de los comandos, así pues -3 significa mostrar tres líneas. Para el comando tail,
la opción -3 o -n -3 siempre significará mostrar tres líneas. Sin embargo, la versión GNU del
comando head reconoce -n -3 como mostrar todo menos las tres últimas líneas, y sin
embargo el comando head siempre reconoce la opción -3 como muestra las tres primeras
líneas.
Ten en cuenta que la opción -r se podía haber utilizado para invertir el sort, causando que
los números más altos en el tercer campo aparecieran en la parte superior de la salida:
Por último, puede que quieras ordenarlo de una forma más compleja, como un sort por un
campo primario y luego por un campo secundario. Por ejemplo, considera los siguientes
datos:
bob:smith:23
nick:jones:56
sue:smith:67
Puede que quieras ordenar primero por el apellido (campo #2), luego el nombre (campo #1) y
luego por edad (campo #3). Esto se puede hacer con el siguiente comando:
sysadmin@localhost:~$ ls /etc/ | wc -l
136
sysadmin@localhost:~$
Para que sea más fácil ver exactamente lo que coincide, utiliza la opción de --color. Esta
opción resaltará los elementos coincidentes en rojo:
En algunos casos no te interesan las líneas específicas que coinciden con el patrón, sino más
bien cuántas líneas coinciden con el patrón. Con la opción -c puedes obtener un conteo del
número de líneas que coinciden:
Cuando estás viendo la salida del comando grep, puede ser difícil determinar el número
original de las líneas. Esta información puede ser útil cuando regreses al archivo (tal vez para
editar el archivo), ya que puedes utilizar esta información para encontrar rápidamente una de
las líneas coincidentes.
La opción -n del comando grep muestra los números de la línea originales:
Ejemplos Salida
/etc/*
Expresión
Regular Coincidencias
El comando grep es sólo uno de los muchos comandos que admiten expresiones regulares.
Algunos otros comandos son los comandos more y less. Mientras que a algunas de las
expresiones regulares se les ponen innecesariamente con comillas simples, es una buena
práctica utilizar comillas simples con tus expresiones regulares para evitar que el shell trate a
interpretar su significado especial.
041 33 21 ! 141 97 61 a
042 34 22 “ 142 98 62 b
043 35 23 # 143 99 63 c
044 36 24 $ 144 100 64 d
045 37 25 % 145 101 65 e
046 38 26 & 146 102 66 f
Puesto que la a tiene un valor numérico más pequeño (141) que la d (144), el rango a-
d incluye todos los caracteres de la a a la d.
¿Qué pasa si quieres un carácter que puede ser cualquier cosa menos una x, y o z? No
querrías proporcionar un conjunto de [ ] con todos los caracteres excepto x, y o z.
Para indicar que quieres que coincida un carácter que no es uno de lo listados, inicia tu
conjunto de [ ] con el símbolo ^. El siguiente ejemplo muestra la coincidencia de un patrón
que incluye un carácter que no es un a, b o c seguida de un d:
Ten en cuenta que en la primera salida del grep, ambas líneas coinciden debido a que ambas
contienen la letra a. En la segunda salida grep, solo coincide con la línea que comienza con la
letra a.
Para especificar que coincida al final de la línea, termina el patrón con el carácter $. Por
ejemplo, para encontrar sólo las líneas que terminan con la letra c:
En la salida del comando grep anterior, ves que cada línea corresponde porque estás
buscando el carácter c seguido de cero o más caracteres d. Si quieres buscar un carácter *,
coloca el carácter \ antes del carácter *:
RE Significado
? Coincide con el carácter anterior cero o una vez más, así que es un carácter opcional
sysadmin@localhost:~/many$ rm *
bash: /bin/rm: Argument list too long
sysadmin@localhost:~/many$ ls | xargs rm
sysadmin@localhost:~/many$
8.1 Introducción
Este es Lab 8: Barras verticales, Redirección y REGEX Mediante la realización de esta
práctica de laboratorio, los estudiantes aprenderán cómo redirigir los flujos de texto, utilizar
expresiones regulares, y los comandos para filtrar los archivos de texto.
En este laboratorio llevarás a cabo las siguientes tareas:
1. Aprender cómo redirigir y canalizar la entradas, salidas y errores estándar con las
barras verticales.
2. Utilizar las expresiones regulares para filtrar la salida de comandos o el contenido del
archivo.
3. Visualizar archivos de gran tamaño o salida de comandos con programas paginación y
visualizar partes seleccionadas.
8.2 Las Barras Verticales y le Redirección
Normalmente, cuando ejecutas un comando, se muestra la salida en la ventana de la terminal.
Esta salida (también llamada un canal) se llama salida estándar, simbolizada por el
término stdout. El número descriptor del archivo para este canal es 1.
El error estándar (stderr) se produce cuando se produce un error durante la ejecución de un
comando; tiene un descriptor de archivo de 2. Los mensajes de error también se envían a la
ventana de la terminal de forma predeterminada.
En esta práctica, vas a utilizar los caracteres que redirigen la salida de la salida estándar
(stdout) y el error estándar (stderr) a un archivo u otro comando en lugar de la pantalla de
la terminal.
La entrada estándar, stdin, por lo general la proporcionas tú a un comando escribiendo en el
teclado; número descriptor de archivo es 0. Sin embargo, mediante la redirección de la
entrada estándar, los archivos pueden también ser utilizados como stdin.
8.2.1 Paso 1
Utiliza el símbolo de redirección > para redirigir la salida desde la salida normal
de stdout (terminal) a un archivo. Escribe lo siguiente:
8.2.2 Paso 2
Cuando utilizas el símbolo > para redirigir la stdout, los contenidos del archivo se destruyen
primero. Escribe los siguientes comandos para ver una demostración:
cat mymessage
echo Greetings > mymessage
cat mymessage
8.2.3 Paso 3
Puedes evitar sobrescribir accidentalmente un archivo mediante el uso de >> en lugar de >.
Mediante el uso de >> anexas a un archivo. Ejecuta los siguientes comandos para ver una
demostración:
cat mymessage
echo "How are you?" >> mymessage
cat mymessage
Recuerda que mediante el uso de >> todos los datos existentes se conservan y los nuevos
datos se añaden al final del archivo.
8.2.4 Paso 4
El comando find comando es un buen comando para demostrar cómo el stderr funciona.
Este comando busca en el sistema de archivos los archivos basándose en los criterios tales
como el nombre de archivo. Ejecuta el siguiente comando y observa los resultados:
Observa el mensaje de error que indica que no tienes permiso para acceder a ciertos
archivos/directorios. Esto se debe a que como un usuario normal no tiene derecho a "mirar
dentro" de algunos directorios. Estos tipos de mensajes de error se envían al stderr, no a
la stdout.
8.2.5 Paso 5
Para redirigir el stderr (mensajes de error) a un archivo, emite el siguiente comando:
Recuerda que el descriptor de archivo para el stderr es el número 2, por lo que se utiliza
junto con el símbolo > para redirigir la salida sdterr a un archivo llamado err.txt. Ten en
cuenta que 1> es lo mismo que >.
Nota: El ejemplo anterior demuestra la importancia de conocer la redirección. Si queires
"ignorar" los errores que muestra el comando find, puedes redirigir los mensajes a un archivo
y verlos más tarde, haciendo más fácil centrarse en el resto de la salida del comando.
8.2.6 Paso 6
También puedes redirigir stdout y stderr en dos archivos separados.
Observa que se permite poner un espacio después del símbolo de redirección >, pero no es
obligatorio.
8.2.7 Paso 7
Para redirigir tanto la salida estándar (stdout) como el error estándar (stderr) a un archivo,
primero redirige la stdout a un archivo y luego redirige el stderr a ese mismo archivo
mediante el uso de la notación 2>&1.
tr a-z A-Z
this is interesting
how do I stop this?
^D
Nota: ^D simboliza Control+D
8.2.9 Paso 9
El comando tr acepta la entrada del teclado (stdin), traduce los caracteres y luego envía la
salida a stdout. Para crear un archivo de todos los caracteres en minúscula, ejecuta lo
siguiente:
cat myfile
8.2.10 Paso 10
Ejecuta los siguientes comandos para utilizar el comando tr mediante la redirección de
la stdin desde un archivo:
cat myfile
tr a-z A-Z < myfile
8.2.11 Paso 11
Otra forma popular de redirección es tomar la salida de un comando y enviarlo a otro comando
como entrada. Por ejemplo, la salida de algunos comandos puede ser masiva, lo que resulta
en el desplazamiento de la salida en la pantalla demasiado rápido para leer. Ejecuta el
siguiente comando para tomar la salida del comando ls y enviarlo al comando more que
muestra una página de datos a la vez:
ls -l /etc | more
8.2.12 Paso 12
En el siguiente ejemplo, se utiliza un comando llamado cut para extraer todos los nombres de
usuario de una base de datos denominada /etc/passwd (un archivo que contiene
información sobre la cuenta de usuario). Primero, intenta ejecutar el comando cut por sí
mismo:
8.2.13 Paso 13
La salida en el ejemplo anterior estaba desordenada y desplazada fuera de la pantalla. En el
siguiente paso vas a tomar la salida del comando cut y los vas a enviar al comando sort para
ordenar la salida:
8.2.14 Paso 14
Ahora la salida está ordenada, pero todavía se desplaza fuera de la pantalla. Envía la salida
del comando sort al comando more para resolver este problema:
8.3.1 Paso 1
Busca los archivos comenzando por tu directorio home que contienen el nombre bash.
8.3.2 Paso 2
Encuentra los archivos que fueron modificados (o creados) hace menos de 5 minutos en el
directorio especificado mediante el uso de los comandos siguientes:
El primer comando find no encuentra los archivos que fueron modificados dentro del tiempo
especificado. A continuación, crea un archivo mediante el uso del comando touch y ejecuta el
comando find de nuevo, lo que resultará en que el comando find descubrirá el archivo
nuevo.
El directorio Music se visualizó con el segundo comando find porque el directorio se
modificó, el resultado de un archivo que fue añadido al directorio.
8.3.3 Paso 3
Ejecuta el siguiente comando para buscar los archivos en el directorio /usr con tamaño
mayor a 2 MB:
8.3.4 Paso 4
Encuentra los archivos de tipo "directorio" en la ubicación especificada.
8.3.5 Paso 5
Para verificar que la salida muestra los directorios, usa la opción -ls. El comando find utiliza
la opción -print por defecto que muestra sólo los nombres de archivo. La opción -
ls proporciona detalles de los archivos:
8.4.1 Paso 1
El /etc/passwd es probablemente demasiado grande para ser visualizado en la pantalla sin
tener que desplazarse en la misma. Para ver una demostración utiliza el comando cat para
mostrar todo el contenido del archivo /etc/passwd:
cat /etc/passwd
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
bind:x:102:105::/var/cache/bind:/bin/false
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
operator:x:1000:37::/root:/bin/sh
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash
sysadmin@localhost:~$
8.4.2 Paso 2
Utiliza el comando more para mostrar todo el contenido del archivo /etc/passwd:
more /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
bind:x:102:105::/var/cache/bind:/bin/false
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
operator:x:1000:37::/root:/bin/sh
--More--(92%)
Nota: --More--(92%) indica que se estás «en» el comando more y a 92% a través de los
datos actuales.
8.4.3 Paso 3
Mientras que te encuentras en el comando more, puedes ver la pantalla de ayuda presionando
la tecla h :
8.4.4 Paso 4
Presiona la Barra Espaciadora para ver el resto del documento:
<SPACE>
8.4.5 Paso 5
Utiliza el comando less para mostrar todo el contenido del archivo /etc/passwd: A
continuación, busca la palabra bin, utiliza n para moverte adelante, y N para moverte hacia
atrás. Por último, sal del paginador less introduciendo la letra q:
less /etc/passwd
/bin
nnnNNNq
8.4.6 Paso 6
Puedes utilizar el comando head para visualizar la parte superior de un archivo. Por defecto, el
comando head mostrará las primeras diez líneas del archivo:
head /etc/passwd
8.4.9 Paso 9
Ejecuta la línea de comandos para canalizar la salida del comando ls al
comando tail mostrando los últimos cinco nombres de archivos del directorio /etc :
ls /etc | tail -5
8.4.10 Paso 10
Otra forma de especificar el número de líneas en la salida con el comando head es utilizar la
opción -n -#, dónde # es el número de líneas contadas a partir de la parte inferior de la salida
que quieres excluir. Observa el símbolo menos - delante del símbolo #. Por ejemplo, si
el /etc/passwd contiene 24 líneas y el siguiente comando mostrará las líneas 1-4,
excluyendo las últimas veinte líneas:
8.5.1 Paso 1
El uso del grep en su forma más simple es la búsqueda de una determinada cadena de
caracteres, tales como sshd en el archivo /etc/passwd . El comando grep imprimirá toda la
línea que contiene la coincidencia:
cd /etc
grep sshd passwd
sysadmin@localhost:~$ cd /etc
sysadmin@localhost:/etc$ grep sshd passwd
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
sysadmin@localhost:/etc$
8.5.2 Paso 2
Las expresiones regulares son «codiciosos» en el sentido de que van a coincidir con cada
instancia del patrón especificado:
Ten en cuenta los aspectos destacados en rojo indicando exactamente lo que coincidió.
También puedes ver que todas las apariciones de root fueron agrupadas en cada línea.
8.5.3 Paso 3
Para limitar la salida puedes utilizar las expresiones regulares para especificar un patrón más
preciso. Por ejemplo, el símbolo de intercalación (^ ) se puede utilizar para coincidir con un
patrón al principio de una línea; por lo que cuando se ejecuta la siguiente línea de comandos,
sólo las líneas que comienzan con root deben coincidir y se deben mostrar:
Ten en cuenta que hay dos instancias adicionales de la palabra root pero sólo la que
aparece al comienzo de la línea coincidirá (se muestra en rojo).
Procedimiento recomendado: Usa comillas simples (no comillas dobles) en torno a las
expresiones regulares para evitar que el programa de shell trate de interpretarlas.
8.5.4 Paso 4
Encuentra la coincidencia con el patrón sync en cualquier parte de una línea:
grep 'sync' passwd
8.5.5 Paso 5
Utiliza el símbolo $ para que coincida con el patrón sync al final de una línea:
El primer comando coincide con todos los casos; el segundo sólo coincide con la instancia al
final de la línea.
8.5.6 Paso 6
Utiliza el carácter de punto . para que coincida con cualquier carácter individual. Por ejemplo,
ejecuta el siguiente comando para que coincida con cualquier carácter seguido de una 'y':
8.5.8 Paso 8
Utiliza la opción -E para permitir que el grep opere en el modo extendido con el fin de
reconocer al operador de alternancia:
8.5.9 Paso 9
Utiliza otra expresión regular extendida, esta vez con egrep con alternancia en un grupo para
que coincida con un patrón. Las cadenas nob y non coincidirán:
8.5.10 Paso 10
Los corchetes [ ] también se pueden utilizar para que la búsqueda coincida con un solo
carácter, sin embargo a diferencia del punto ., los corchetes [ ] se utilizan para especificar
exactamente qué carácter debe coincidir. Por ejemplo, si quieres que coincida con un carácter
numérico, puedes especificar [0-9]. Ejecuta el siguiente comando para una demostración:
8.5.11 Paso 11
Supón que quieres buscar un patrón que contiene una secuencia de tres dígitos. Puedes
usar { } con un número para expresar que quieres repetir un patrón un número específico de
veces; por ejemplo: {3} El uso del calificador numérico requiere un modo extendido de grep:
9.1 Introducción
En este capítulo, vamos a hablar sobre cómo las herramientas que has aprendido hasta ahora
pueden transformarse en scripts reutilizables.
sysadmin@localhost:~$ sh test.sh
Hello, World!
sysadmin@localhost:~$ ./test.sh
-bash: ./test.sh: Permission denied
sysadmin@localhost:~$ chmod +x ./test.sh
sysadmin@localhost:~$ ./test.sh
Hello, World!
En el ejemplo anterior, en primer lugar, el script se ejecuta como un argumento del shell. A
continuación, se ejecuta el script directamente desde el shell. Es raro tener el directorio actual
en la ruta de búsqueda binaria $PATH, por lo que el nombre viene con el prefijo ./ para
indicar que se debe ejecutar en el directorio actual.
El error Permission denied (o «Permiso denegado» en español) significa que el script no
ha sido marcado como ejecutable. Un comando chmod rápido después y el script funciona. El
comando chmod se utiliza para cambiar los permisos de un archivo, que se explica en detalle
en un capítulo posterior.
Hay varios shells con su propia sintaxis de lenguaje. Por lo tanto, los scripts más complicados
indicarán un shell determinado, especificando la ruta absoluta al intérprete como la primera
línea, con el prefijo #!, tal como lo muestra el siguiente ejemplo:
#!/bin/sh
echo “Hello, World!”
#!/bin/bash
echo “Hello, World!”
#!/bin/sh
echo "Hello, World!"
echo -n "the time is "
date
^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Text ^C Cur
Po
^X Exit ^J Justify ^W Where Is ^V Next Page ^U UnCut Text^T To
Spell
#!/bin/sh
Ten en cuenta que la opción de la parte inferior izquierda es ^X Exit que significa
«presiona control y X para salir». Presione Ctrl con X y la parte inferior cambiará:
En este punto, puedes salir del programa sin guardar los cambios pulsando la tecla N o
guardar primero pulsando Y para guardar. El valor predeterminado es guardar el archivo con
el nombre de archivo actual. Puedes presionar la tecla Entrar para guardar y salir.
Después de guardar regresarás al shell prompt. Regresa al editor. Esta vez
pulsa Ctrl y O para guardar tu trabajo sin salir del editor. Los prompts son iguales en gran
parte, salvo que estás de nuevo en el editor.
Esta vez utiliza las teclas de la flecha para mover el cursor a la línea que contiene el texto
«The time is» (o «La hora es» en español). Presiona Control y K dos veces para cortar las
dos últimas líneas al búfer de copia. Mueve el cursor a la línea restante y
presiona Control y U una vez para pegar el búfer de copia a la posición actual. Esto hace que
el script muestre la hora actual antes de saludarte y te ahorra tener que volver a escribir las
líneas.
Otros comandos útiles que puedas necesitar son:
Comando Descripción
#!/bin/bash
ANIMAL="penguin"
echo "My favorite animal is a $ANIMAL"
Después de la línea shebang está una directiva para asignar un texto a una variable. El
nombre de la variable es ANIMAL y el signo de igual asigna la cadena penguin (o «pingüino»
en español). Piensa en una variable como una caja en la que puedes almacenar cosas.
Después de ejecutar esta línea, la caja llamada ANIMAL contiene la palabra penguin.
Es importante que no haya ningún espacio entre el nombre de la variable, el signo de igual y
el elemento que se asignará a la variable. Si le pones espacio, obtendrás un error como
«command not found». No es necesario poner la variable en mayúsculas pero es una
convención útil para separar las variables de los comandos que se ejecutarán.
A continuación, el script despliega una cadena en la consola. La cadena contiene el nombre
de la variable precedido por un signo de dólar. Cuando el intérprete ve el signo de dólar
reconoce que va a sustituir el contenido de la variable, lo que se llama interpolación. La salida
del script es My favorite animal is a penguin (o «My animal favorito es un pingüino»
en español.)
Así que recuerda esto: Para asignar una variable, usa el nombre de la variable. Para acceder
al contenido de la variable, pon el prefijo del signo de dólar. ¡A continuación, vamos a mostrar
una variable a la que se asigna el contenido de otra variable!
#!/bin/bash
ANIMAL=penguin
SOMETHING=$ANIMAL
echo "My favorite animal is a $SOMETHING"
ANIMAL contiene la cadena penguin (como no hay espacios, se muestra la sintaxis
alternativa sin usar las comillas). A SOMETHING se le asigna el contenido de ANIMAL (porque
a la variable ANIMAL le procede el signo de dólar).
Si quieres, puedes asignar una cadena interpolada a una variable. Esto es bastante común en
las grandes secuencias de comandos, ya que puedes construir un comando más grande y
ejecutarlo!
Otra forma de asignar una variable es utilizar la salida de otro comando como el contenido de
la variable incluyendo el comando entre los comillas invertidas:
#!/bin/bash
CURRENT_DIRECTORY=`pwd`
echo "You are in $CURRENT_DIRECTORY"
Este patrón a menudo se utiliza para procesar texto. Puedes tomar el texto de una variable o
un archivo de entrada y pasarlo por otro comando como sed o awk para extraer ciertas partes
y guardar el resultado en una variable.
Es posible obtener entradas del usuario de su script y asignarlo a una variable mediante el
comando read (o «leer» en español):
#!/bin/bash
#!/bin/bash
echo "Hello $1"
#!/bin/bash
# Something bad happened!
exit 1
El ejemplo anterior muestra un comentario #. Todo lo que viene después de la etiqueta hash
se ignora, se puede utilizar para ayudar al programador a dejar notas. El comando exit
1 devuelve el código de salida 1 al invocador. Esto funciona incluso en el shell. Si ejecutas
este script desde la línea de comandos y luego introduces echo $?, verás que devolverá 1.
Por convención, un código de salida de 0 significa «todo está bien». Cualquier código de
salida mayor que 0 significa que ocurrió algún tipo de error, que es específico para el
programa. Viste que grep utiliza 1 lo que significa que la cadena no se encontró.
9.4.2 Condicionales
Ahora que puedes ver y definir las variables, es hora de hacer que tus propios scripts tengan
diferentes funciones basadas en pruebas, llamado branching (o «ramificación» español). La
instrucción if (o «si» en español) es el operador básico para implementar un branching.
La instrucción if se ve así:
if somecommand; then
# do this if somecommand has an exit code of 0
fi
El siguiente ejemplo ejecutará «somecommand» (en realidad, todo hasta el punto y coma) y si
el código de salida es 0, entonces se ejecutará el contenido hasta el cierre fi. Usando lo que
sabes acerca del grep, ahora puedes escribir un script que hace cosas diferentes, basadas en
la presencia de una cadena en el archivo de contraseñas:
#!/bin/bash
if grep -q root /etc/passwd; then
echo root is in the password file
else
echo root is missing from the password file
fi
Comando Descripción
test 1 –eq 1 –o 2 – -o es OR: cualquiera de las opciones pueden ser igual
eq 2
Mientras que la última forma es de uso más frecuente, es importante entender que el corchete
es un comando en sí que funciona de manera semejante al test excepto que requiere el
corchete cuadrado de cierre.
La instrucción if tiene una forma final que te permite hacer varias comparaciones al mismo
tiempo usando elif (abreviatura de elseif).
#!/bin/bash
#!/bin/bash
case "$1" in
hello|hi)
echo "hello yourself"
;;
goodbye)
echo "nice to have met you"
echo "I hope to see you again"
;;
*)
echo "I didn't understand that"
esac
#!/bin/bash
Primero, el script establece una variable que contiene una lista de nombres de servidor
separada por espacios. La instrucción for entonces cicla (realiza «loops») sobre la lista de los
servidores, cada vez que establece la variable S con el nombre del servidor actual. La elección
de la S es arbitraria, pero ten en cuenta que la S no tiene un signo de dólar, pero en
el $SERVERS sí lo tiene, lo que muestra que se $SERVERS se extenderá a la lista de
servidores. La lista no tiene que ser una variable. Este ejemplo muestra dos formas más para
pasar una lista.
#!/bin/bash
for S in *; do
echo "Doing something to $S"
done
El primer loop es funcionalmente el mismo que en el ejemplo anterior, excepto que la lista se
pasa directamente al loop for en lugar de usar una variable. Usar una variable ayuda a que el
script sea más claro, ya que una persona fácilmente puede realizar cambios en la variable en
lugar de ver el loop.
El segundo loop utiliza comodín * que es un file glob. El shell expande eso a todos los
archivos en el directorio actual.
El otro tipo de loop, un loop while, opera en una lista de tamaño desconocido. Su trabajo es
seguir ejecutándose y en cada iteración realizar un test para ver si se tiene que ejecutar otra
vez. Lo puedes ver como «mientras que una condición es verdadera, haz cosas».
#!/bin/bash
i=0
while [ $i -lt 10 ]; do
echo $i
i=$(( $i + 1))
done
echo "Done counting"
9.1 Introducción
Este es Lab 9: Los comandos de script Linux Essentials. Mediante la realización de esta
práctica de laboratorio, los estudiantes aprenderán cómo utilizar el editor vi para crear los
scripts básicos del shell utilizando los comandos, variables e instrucciones de control
esenciales del shell.
En este laboratorio llevarás a cabo las siguientes tareas:
9.2.1 Paso 1
Para crear un nuevo archivo ejecuta el siguiente comando:
vi myfile
Escribe una i para entrar al modo de «inserción» del vi (más sobre esto más adelante). A
continuación, introduce el siguiente texto:
9.2.2 Paso 2
Invoca el editor vi para modificar el archivo creado. Cuando invocas el vi, te colocas en el
modo comando por defecto:
vi myfile
Observa que en la parte inferior izquierda se muestran el nombre del archivo, el número de
líneas y el número de caracteres en el archivo.
9.2.3 Paso 3
Presiona cada una de las siguientes teclas dos veces y observa cómo se mueve el cursor.
Recuerda que estás en el modo de comando:
Teclas Función
j Mueve el cursor una línea hacia abajo (igual que la flecha hacia abajo)
k Mueve el cursor una línea hacia arriba (igual que la flecha hacia arriba)
Advertencia: Si introduces cualquier otra clave que no sean las de arriba, puedes terminar en
el modo de inserción. No te asustes! Presiona la tecla Esc , luego :q! + la tecla Entrar . Con
esto debes salir del vi sin guardar los cambios. ¡A continuación, ejecuta vi myfile y
regresas al editor vi!
9.2.4 Paso 4
Más navegación con el cursor de vi: Presiona las siguientes teclas y observa cómo se mueve
el cursor:
Teclas Función
9.2.5 Paso 5
Mueve el cursor al principio de la palabra «very» presionando las teclas siguientes:
G
k
8l (es el número ocho seguido de la letra "l")
9.2.6 Paso 6
Elimina la palabra very emitiendo el comando dw (delete word):
dw
9.2.7 Paso 7
Deshacer la última operación:
9.2.8 Paso 8
Eliminar dos palabras:
2dw
9.2.9 Paso 9
Deshacer la última operación:
9.2.10 Paso 10
Eliminar cuatro caracteres, uno a la vez:
xxxx
9.2.11 Paso 11
Deshacer las últimas 4 operaciones y recuperar los caracteres eliminados:
4u
Tu pantalla debe ser similar a la siguiente:
9.2.12 Paso 12
Eliminar 14 caracteres:
14x
9.2.13 Paso 13
Deshacer la última operación:
9.2.14 Paso 14
Eliminar los cinco caracteres a la izquierda del cursor (introduce 5 y después Shift+x):
5X
9.2.15 Paso 15
Deshacer la última operación:
9.2.16 Paso 16
Eliminar la línea actual
dd
9.2.17 Paso 17
Lo que se prolongó, borró o extrajo, puede ser «pegado». Pega las líneas eliminadas por
debajo de la línea actual:
p
9.2.18 Paso 18
Deshacer las dos últimas operaciones:
2u
9.2.19 Paso 19
Eliminar dos líneas, la actual y la siguiente:
2dd
9.2.20 Paso 20
Deshacer la última operación:
u
Tu pantalla debe ser similar a la siguiente:
9.2.21 Paso 21
Moverse a la cuarta palabra, y después eliminar desde la posición actual hasta el final de la
línea Shift+D:
4w
D
9.2.22 Paso 22
Deshacer la última operación:
9.2.24 Paso 24
Deshacer la última operación:
9.2.25 Paso 25
Copia (o «jala») la palabra actual:
yw
9.2.26 Paso 26
Pega (o «pon») la palabra copiada antes del cursor actual:
9.2.28 Paso 28
Mover a la primera línea, y luego unir tres líneas:
1G
3J
9.2.29 Paso 29
Deshacer la última operación:
9.2.30 Paso 30
Busca y elimina la palabra text (añade espacio después de la palabra text):
:%s/text //g
9.2.31 Paso 31
Navega hasta el inicio del archivo, y luego presiona i para entrar en el modo de inserción para
añadir el texto:
Teclas Función
9.2.32 Paso 32
Salir del modo de inserción y regresar al modo comando presionando la tecla Esc:
ESC
9.2.33 Paso 33
Avanzar un espacio presionando la letra l minúscula para colocar el cursor en la W y cambiarla
a minúscula presionando el tilde (~):
Teclas Función
9.2.34 Paso 34
Guarda el archivo. Presiona la tecla Esc para asegurarte de que estás en el modo comando.
A continuación, escribe :w y presiona la tecla Entrar:
:w
9.2.35 Paso 35
Cuando presionas la tecla Entrar para confirmar el cambio, observa el mensaje en la parte
inferior izquierda indicando que el archivo fue escrito:
~
~
"myfile" 3 lines, 102 characters written
9.2.36 Paso 36
Navega hasta el espacio entre la palabra «powerful» y «editor» en la segunda línea,
como se muestra en la siguiente imagen. Puedes presionar la letra j seguida por 10l o utiliza
las teclas de flecha:
Comando Función/Teclas
Comando Función/Teclas
9.2.38 Paso 38
Salir del modo de inserción presionando la tecla Esc.
9.2.39 Paso 39
Abre una línea en blanco debajo de la línea actual escribiendo la letra o minúscula:
9.2.40 Paso 40
Introduce el texto siguiente:
9.2.41 Paso 41
Salir del modo de inserción presionando la tecla Esc.
9.2.42 Paso 42
Abre una línea en blanco encima de la línea actual presionando la O mayúscula:
9.2.43 Paso 43
Introduce el texto siguiente:
9.2.44 Paso 44
Salir del modo de inserción presionando la tecla Esc.
9.2.45 Paso 45
Guarda el archivo y cierra el editor vi utilizando cualquiera de los siguientes métodos para
guardar los cambios:
Comando Función/Teclas
9.2.46 Paso 46
Vuelve a abrir el myfile utilizando el editor vi:
vi myfile
9.2.47 Paso 47
Navega hasta la tercer línea, borra la tercer y la cuarta línea:
3G
2dd
9.2.48 Paso 48
Presiona la tecla Esc para confirmar que estás en el modo comando.
9.2.49 Paso 49
Cierra el editor vi sin guardar los cambios:
:q!
9.2.50 Paso 50
Abre myfile con el editor vi:
vi myfile
9.2.51 Paso 51
Buscar hacia adelante la palabra line. Verás que el cursor se mueve al inicio de la primera
instancia de la palabra line tal como se muestra en la siguiente imagen:
/line
9.2.52 Paso 52
Busca la siguiente instancia de la palabra line presionando la letra n:
9.2.53 Paso 53
Busca la palabra line hacia atrás. Verás que el cursor se mueve al inicio de la instancia
anterior de la palabra line tal como se muestra en la siguiente imagen:
?line
9.2.54 Paso 54
Busca la instancia anterior de la palabra line presionando la letra n. Puesto que no hay
ninguna palabra line en esta dirección, vi ira alrededor del documento:
9.2.55 Paso 55
Sustituirás la palabra line con la palabra entry. Cuando presionas cw la palabra line
desaparecerá y estarás en el modo de inserción:
cw
entry
9.2.56 Paso 56
Presiona la tecla Esc para salir del modo de inserción.
9.2.57 Paso 57
Añade texto al inicio de una línea. Entra al modo de inserción de nuevo y añade una línea
presionando la i mayúscula:
9.2.58 Paso 58
Para volver al modo de comandos presiona la tecla Esc.
9.2.59 Paso 59
Añade texto al final de una línea (la A mayúscula). Primero pasa a la segunda línea y añade la
frase Indeed!:
2G
A
[Space]Indeed!
9.2.60 Paso 60
Guarda los cambios y cierra vi:
:x
9.3.1 Paso 1
Para crear un script sencillo, sólo tienes que crear un archivo de texto y añadir los comandos.
Crea un archivo llamado sample.sh y añade las siguientes líneas:
9.3.2 Paso 2
Para que quede claro que se trata de un script de shell bash, necesitas incluir una línea
especial en la parte superior del archivo llamado «shebang». Esta línea comienza con #! y, a
continuación contiene la ruta de acceso al archivo ejecutable shell BASH. Agrega la siguiente
línea a la parte superior del archivo sample.sh:
#!/bin/bash
#!/bin/bash
echo "Hello there! Here is the calendar for this month:"
cal
~
~
9.3.3 Paso 3
Puedes ejecutar este programa introduciendo bash antes del nombre de archivo. Ejecuta lo
siguiente:
bash sample.sh
sysadmin@localhost:~$ bash sample.sh
Hello there! Here is the calendar for this month:
April 2016
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
sysadmin@localhost:~$
9.3.4 Paso 4
Puedes evitar tener que escribir bash delante del nombre de archivo, haciendo que el archivo
sea «ejecutable» para todos los usuarios. Ejecuta los siguientes comandos:
ls -l sample.sh
chmod a+x sample.sh
ls -l sample.sh
./sample.sh
sysadmin@localhost:~$ ls -l sample.sh
-rw-rw-r-- 1 sysadmin sysadmin 73 Apr 9 22:44 sample.sh
sysadmin@localhost:~$ chmod a+x sample.sh
sysadmin@localhost:~$ ./sample.sh
Hello there! Here is the calendar for this month:
April 2016
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
sysadmin@localhost:~$
El comando chmod se usa para cambiar los permisos en el archivo para que el archivo se
pueda ejecutar.
9.3.5 Paso 5
Una característica común que se utiliza en el scripting es «backquoting». Con esta técnica
puedes ejecutar un comando shell «dentro» de otro comando shell. El resultado del comando
interno será devuelto como un argumento para el comando externo. Añade lo siguiente a la
parte inferior del archivo sample.sh:
cat sample.sh
./sample.sh
sysadmin@localhost:~$ cat sample.sh
#!/bin/bash
echo "Hello there! Here is the calendar for this month:"
cal
echo "Today is" `date +%A`
sysadmin@localhost:~$ ./sample.sh
Hello there! Here is the calendar for this month:
April 2016
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Today is Friday
sysadmin@localhost:~$
9.3.6 Paso 6
Estuviste utilizando ./ en frente del nombre de archivo sample.sh para indicar que el
archivo está en el directorio actual. Ejecuta lo siguiente para ver cómo el shell fracasaría en la
búsqueda del archivo si no se utiliza el ./:
sample.sh
sysadmin@localhost:~$ sample.sh
-bash: sample.sh: command not found
sysadmin@localhost:~$
9.3.7 Paso 7
Recuerda que la variable $PATH se utiliza para buscar los comandos que introduces. Ejecuta
lo siguiente para ver la variable $PATH para la cuenta del administrador de sistemas:
echo $PATH
sysadmin@localhost:~$ echo $PATH
/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/
sbin:/bin:/usr/games
sysadmin@localhost:~$
9.3.8 Paso 8
Ten en cuenta que home/sysadmin/bin es uno de los directorios de la variable $PATH. Este
es un buen lugar para colocar tus scripts del shell:
mkdir bin
mv sample.sh bin
sample.sh
sysadmin@localhost:~$ mkdir bin
sysadmin@localhost:~$ mv sample.sh bin
sysadmin@localhost:~$ sample.sh
Hello there! Here is the calendar for this month:
April 2016
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Today is Friday
sysadmin@localhost:~$
Introduce esta columna al drive.sh Esta columna describe el código (no introducir al archivo)
9.4.1 Paso 1
Scipts («Secuencias de comandos») que son más complejas pueden hacer uso de la
ejecución condicional. Una expresión condicional, como la instrucción if puede hacer uso de
los resultados de un comando llamado test. La instrucción test compara dos números (o dos
cadenas) para cosas como «igual a», «menor que», etc.
Crea el siguiente archivo (drive.sh) y hazlo ejecutable para ver cómo las
instrucciones if y test funcionan. Comienza por colocar lo siguiente en drive.sh:
Introduce esta columna al drive.sh Esta columna describe el código (no introducir al archivo)
#!/bin/bash
then
else
cat drive.sh
chmod a+x drive.sh
./drive.sh
Verbalmente, podrías leer la instrucción if como "If $age is less than 16, then echo 'You are
not old enough to drive', else echo 'You can drive!'" o «Si $ age es menor de 16, entonces
echo 'No tienes edad suficiente para conducir', else echo 'Puedes conducir'» en español.
El fi termina la instrucción if.
Nota: $age debe ser un valor entero. Si no es así, el programa se bloqueará.
9.4.2 Paso 2
La instrucción de prueba se invoca automáticamente cuando colocas sus argumentos entre
corchetes [] rodeados de espacios. Modifica la línea if de drive.sh para que se vea así:
if [ $age -lt 16 ]
cat drive.sh
./drive.sh
Para ver una lista completa de las condiciones de prueba, ejecuta el comando man test.
Importante: Alrededor de los corchetes tiene que haber espacios. [$age -lt 16] no
funcionaría, pero [ $age -lt 16 ] sí.
9.4.3 Paso 3
También puedes utilizar el resultado de otros comandos, ya que todos regresan «éxito» o
«fracaso». Por ejemplo, crea y ejecuta el programa siguiente, que se puede utilizar para
determinar si una cuenta de usuario se encuentra en este sistema. Agrega lo siguiente
a check.sh:
#!/bin/bash
echo "Enter a username to check: "
read name
if grep $name /etc/passwd > /dev/null
then
echo "$name is on this system"
else
echo "$name does not exist"
fi
Introduce esta columna al drive.sh Esta columna describe el código (no introducir al archivo)
#!/bin/bash
echo "Please enter a number echo "Ingrese un número mayor que 100"
greater than 100"
while [ $num -le 100 ] # ejecutar el código desde «do» hasta "hecho si la condición
de prueba es verdadera
do
Si la prueba condicional para la instrucción while ( [ $num -le 100 ] ) devuelve valor
verdadero, entonces las instrucciones entre do y done serán ejecutadas.
Una vez que esas instrucciones se acaben de ejecutar, la prueba condicional para la
instrucción while se comprueba de nuevo. Si el valor es verdaderos otra vez, entonces las
instrucciones entre do y done se vuelven a ejecutar.
Esto seguirá repitiéndose hasta que la instrucción while devuelva valor falso, o cuando el
valor sea superior a 100.
9.4.5 Paso 5
El código de scripting es parte del shell BASH, lo que significa que puedes utilizar estas
instrucciones en la línea de comandos al igual que los utilizas en un script de shell. Esto
puede ser útil para una instrucción como la instrucción for, una instrucción que asignará una
lista de valores de uno en uno a una variable. Esto te permite realizar un conjunto de
operaciones para cada valor. Por ejemplo, ejecuta lo siguiente en la línea de comandos:
Ten en cuenta que el comando wc se ha ejecutado tres veces: una vez para /etc/passwd,
una vez para /etc/hosts a una para /etc/group.
9.4.6 Paso 6
A menudo, el comando seq se utiliza en combinación con la instrucción for. El
comando seq puede generar una lista de valores enteros, por ejemplo de 1 a 10. Por ejemplo,
ejecuta lo siguiente en la línea de comandos para crear los archivos con el
nombre test1, test2, test3, etc. (hasta test12):
ls
for num in `seq 1 12`
do
touch test$num
done
ls
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates check.sh num.sh
Documents Music Public Videos drive.sh
sysadmin@localhost:~$ for num in `seq 1 12`
> do
> touch test$num
> done
sysadmin@localhost:~$ ls
Desktop Music Templates drive.sh test10 test2 test5 test8
Documents Pictures Videos num.sh test11 test3 test6 test9
Downloads Public check.sh test1 test12 test4 test7
sysadmin@localhost:~$
10.1 Introducción
Una de las muchas ventajas de tener tantas distribuciones distintas de Linux es que algunos
de ellas están diseñados para funcionar en plataformas de hardware específicas. De hecho,
hay una distribución de Linux diseñada para casi todas las plataformas de hardware
modernas.
Cada una de estas plataformas de hardware tiene una gran cantidad de variedad en los
componentes de hardware que están disponibles. Además de diferentes tipos de unidades de
disco duros, hay muchos diferentes monitores e impresoras. Con la popularidad de los
dispositivos USB, tales como dispositivos de almacenamiento USB, cámaras y teléfonos
celulares, el número de dispositivos disponibles llega a calcularse en miles.
En algunos casos, esto plantea problemas, ya que estos dispositivos típicamente necesitan
algún tipo de software (llamados controladores («drivers» en inglés) o módulos) que les
permite comunicarse con el sistema operativo instalado. Los fabricantes de hardware a
menudo proporcionan este software, pero típicamente para Microsoft Windows, no para Linux.
La mascota de Linux, Tux, sin embargo está empezando a aparecer más a menudo en los
productos de hardware, indicando el soporte de Linux.
Además del apoyo de los proveedores, hay una gran cantidad de apoyo de la comunidad que
se esfuerza por proporcionar controladores para los sistemas Linux. Aunque no todo el
hardware tiene los controladores necesarios, hay una buena cantidad que sí los tiene, lo que
supone un reto para los usuarios y administradores Linux para encontrar los controladores
correctos o elegir el hardware que tiene cierto nivel de soporte en Linux.
En este capítulo aprenderás acerca de los dispositivos de core hardware, incluyendo la
manera de utilizar los comandos de Linux para mostrar la información vital de hardware del
dispositivo.
sysadmin@localhost:~$ arch
x86_64
sysadmin@localhost:~$
Otro comando que puedes utilizar para identificar el tipo de CPU en el sistema es el
comando lscpu:
sysadmin@localhost:~$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 44
Stepping: 2
CPU MHz: 2394.000
BogoMIPS: 4788.00
Virtualization: VT-x
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 12288K
NUMA node0 CPU(s): 0-3
sysadmin@localhost:~$
La primera línea de esta salida muestra que se está utilizando la CPU en modo de 64 bits, ya
que la arquitectura reportada es x86_64. La segunda línea de la salida muestra que la CPU es
capaz de operar en modo ya sea de 32 o 64 bits, por lo tanto realmente es un CPU de 64 bits.
La manera más detallada de obtener la información acerca de tu CPU es visualizando el
archivo /proc/cpuinfo con el comando cat:
Mientras que la gran parte de la salida del comando lscpu y del contenido del
archivo /proc/cpuinfo parece ser la misma, una de las ventajas de visualizar el
archivo /proc/cpuinfo es que aparecen flags (o «indicadores» en español) de la CPU.
Los flags de una CPU son un componentes muy importantes, ya que señalan qué
características soporta la CPU y las capacidades de la CPU.
Por ejemplo, la salida del ejemplo anterior contiene el flag lm (long mode, o «modo largo» en
español), indicando que esta CPU es de 64-bit. También hay flags que indican si la CPU es
capaz de soportar máquinas virtuales (la capacidad de tener varios sistemas operativos en un
único equipo).
10.3.1 dmidecode
La tarjeta madre de muchas computadoras contiene lo que se conoce como Basic Input and
Output System (BIOS) (o «BIOS de Administración del Sistema» en español). System
Management BIOS (SMBIOS) (o «El Sistema de Gestión o Administración de BIOS» en
español) es el estándar que define las estructuras de datos y cómo se comunica la
información acerca del hardware de la computadora. El comando dmidecode es capaz de leer
y mostrar la información del SMBIOS.
Un administrador puede utilizar el comando dmidecode para ver los dispositivos conectados
directamente a la tarjeta madre. Hay una gran cantidad de información proporcionada por la
salida de este comando.
Los ejemplos siguientes te proporcionan algunas ideas de lo que se puede saber de la salida
del comando dmidecode. Este comando no está disponible dentro del entorno de la máquina
virtual de este curso.
En el primer ejemplo, se puede ver que el BIOS soporta el arranque directamente desde el
CD-ROM. Esto es importante ya que los sistemas operativos a menudo se instalan arrancando
directamente desde el CD de instalación:
# dmidecode 2.11
SMBIOS 2.4 present.
364 structures occupying 16040 bytes.
Table at 0x000E0010
En el siguiente ejemplo puedes ver que un total de 2048 (aproximadamente 2GB) de RAM
está instalado en el sistema:
sysadmin@localhost:~$ free -m
total used free shared buffers
cached
Mem: 1894 356 1537 0 25 177
-/+ buffers/cache: 153 1741
Swap: 4063 0 4063
sysadmin@localhost:~$
sysadmin@localhost:~$ lspci
00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host
bridge (rev 01)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP
bridge (rev 01)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
00:07.7 System peripheral: VMware Virtual Machine Communication Interface
(rev 10)
00:0f.0 VGA compatible controller: VMware SVGA II Adapter
03:00.0 Serial Attached SCSI controller: VMware PVSCSI SCSI Controller
(rev 02
0b:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)
Para mostrar los dispositivos conectados al sistema vía USB, ejecuta el comando lsusb:
sysadmin@localhost:~$ lsusb
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
sysadmin@localhost:~$
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Couldn’t open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 0 Full speed (or root) hub
bMaxPacketSize0 64
idVendor 0x1d6b Linux Foundation
idProduct 0x0001 1.1 Linux Foundation
bcDevice 2.06
iManufacturer 3
iProduct 2
iSerial 1
…
El comando lshal te permite ver los dispositivos detectados por HAL. Este comando produce
una gran cantidad de salidas; a continuación se ofrece una pequeña muestra:
10.5 Los Dispositivos de Disco
Los Dispositivos de Disco (también conocidos como discos duros) se pueden conectar al
sistema de varias maneras; el controlador puede integrarse a la tarjeta madre, a una tarjeta
PCI (Interconexión de Componente Periférico) o a un dispositivo USB.
Los discos duros se dividen en particiones. Una partición es una división lógica de un disco
duro, diseñada para tomar una gran cantidad de espacio de almacenamiento disponible y
dividirlo en «trozos» más pequeños. Si bien en Microsoft Windows es común tener una única
partición para cada disco duro, en las distribuciones de Linux lo común es tener varias
particiones por disco duro.
Algunos discos duros hacen uso de una partición llamada Registro de Arranque
Maestro (MBR o «Master Boot Record» en inglés), mientras que otros hacen uso de un tipo
de partición llamada Tabla de Particiones GUID (GPT o «GUID Partitioning Table» en inglés).
El tipo MBR de la partición se ha utilizado desde los días tempranos de la computadora
personal (PC o Personal Computer) y el tipo GPT ha estado disponible desde el año 2000.
Un viejo término usado para describir un disco duro interno es «disco fijo», ya que el disco es
fijo (no extraíble). Este término dio lugar a varios nombres de comando: los
comandos fdisk, cfdisk y sfdisk son herramientas para trabajar con las particiones discos
MBR.
Los discos GPT usan un tipo de particionado más nuevo, que permite al usuario dividir el
disco en más particiones de lo que soporta una MBR. La GPT también permite tener
particiones que pueden ser más grandes que dos terabytes (MBR no lo permite). Las
herramientas para gestionar los discos GPT se llaman de manera similar a las contrapartes
de fdisk: gdisk, cgdisk y sgdisk.
También existe una familia de herramientas que intenta apoyar ambos tipos de disco MBR y
GPT. Este conjunto de herramientas incluye al comando parted y la herramienta
gráfica gparted.
Las unidades de disco duro están asociadas a los nombres de archivos (llamados archivos de
dispositivo) que se almacenan en el directorio /dev. Diferentes tipos de unidades de disco
duros reciben nombres ligeramente diferentes: hd para los discos duros IDE (Intelligent Drive
Electronics o «Unidad Electrónica Inteligente» en español) y sd para USB, SATA (Serial
Advanced Technology Attachment o «Aditamento de Tecnología Serial Avanzada» en
español) y los discos duros SCSI (Small Computer System Interface o «Interfaz Estándar de
Equipos Pequeños» en español).
A cada disco se le asigna una letra, por ejemplo, el primer disco duro IDE tendría un nombre
de archivo de dispositivo /dev/hda y el segundo disco duro IDE se asociaría al archivo de
dispositivo /dev/hdb.
Las particiones reciben números únicos para cada dispositivo. Por ejemplo, si un disco duro
USB tenía dos particiones, éstas pueden asociarse a los archivos de
dispositivo /dev/sda1 y /dev/sda2.
En la salida siguiente puedes ver que este sistema tiene tres
dispositivos sd: /dev/sda, /dev/sdb y /dev/sdc. También puedes ver que hay dos
particiones en el primer dispositivo (como lo demuestran los
archivos /dev/sda1 y /dev/sda2) y una partición en el segundo dispositivo (según lo
visualiza el archivo /dev/sdb1):
root@localhost:~$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/sdc
root@localhost:~$
10.1 Introducción
Este es Lab 10: Comprendiendo el hardware de la computadora. Mediante la realización de
esta práctica de laboratorio, los estudiantes aprenderán acerca de los comandos para mostrar
la información sobre el hardware del equipo.
En este laboratorio llevarás a cabo las siguientes tareas:
10.2.1 Paso 1
Con el fin de determinar el tipo de CPU ejecuta el comando lscpu:
lscpu
10.2.2 Paso 2
Visualiza el archivo /proc/cpuinfo:
cat /proc/cpuinfo
10.2.3 Paso 3
Para conocer el tamaño de RAM y el espacio de intercambio que está ocupado, utiliza el
comando free:
free -m
free -g
10.2.4 Paso 4
Para ver qué dispositivos están conectados al bus PCI, utiliza el comando lspci:
lspci
10.2.5 Paso 5
Utiliza el comando lspci con la opción -k para mostrar los dispositivos junto con el
controlador del kernel y los módulos utilizados:
10.2.6 Paso 6
Trata de enumerar los dispositivos USB conectados:
lsusb
sysadmin@localhost:~$ lsusb
unable to initialize libusb: -99
sysadmin@localhost:~$
Debido a que este sistema es virtualizado, los dispositivos USB no aparecen como lo harían
normalmente cuando se ejecuta el comando lsusb. Normalmente, si los dispositivos USB
están presentes, se habría mostrado algo como esto:
sysadmin@localhost:~$ lsusb
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
sysadmin@localhost:~$
10.2.7 Paso 7
Para que el hardware funcione, el kernel de Linux normalmente carga un controlador o
módulo. Utiliza el comando lsmod para ver los módulos cargados actualmente:
lsmod
10.2.8 Paso 8
La tarjeta madre de muchas computadoras contiene lo que se conoce como Basic Input and
Output System (BIOS). System Management BIOS (SMBIOS) es el estándar que define las
estructuras de datos y cómo se comunica la información acerca del hardware de la
computadora. El comando dmidecode puede leer e imprimir la información del SMBIOS de
muchos sistemas. No vamos a demostrar este comando aquí, ya que no funciona
correctamente en un entorno virtual.
El comando fdisk se puede utilizar de dos maneras: de forma interactiva y no interactiva.
Cuando se utiliza la opción -l con fdisk, entonces el comando listará de manera no
interactiva los dispositivos de bloque, que incluyen los discos (discos físicos) y los volúmenes
lógicos.
Sin la opción -l el comando fdisk entra en un modo interactivo que normalmente se utiliza
para modificar las particiones en un dispositivo de disco.
10.2.9 Paso 9
Ejecuta el comando fdisk para listar los dispositivos de disco de forma no interactiva, en
sectores, y sin advertencias de compatibilidad DOS:
fdisk -cul
11.1 Introducción
Un sistema típico de Linux tiene miles de archivos. El Filesystem Hierarchy Standard (o
«estándar jerárquico del sistema de archivos» en español) (explicado en detalle en un capítulo
posterior) proporciona una guía para las distribuciones en cómo organizar estos archivos. En
este capítulo verás cómo los sistemas de administración de paquetes de software pueden
proporcionar información sobre la ubicación de los archivos pertenecientes a un paquete.
El kernel de Linux es el núcleo del sistema operativo GNU/Linux. Este capítulo explica el papel
del kernel de Linux y cómo proporciona información acerca del sistema bajo los pseudo-
sistemas de archivo /proc y /sys.
Verás cómo cada comando que se ejecuta causa que se ejecute un proceso y podrás ver los
procesos ejecutándose con el comando ps. También verás discusión sobre cómo el sistema
graba o registra mensajes desde los procesos en segundo plano llamados demonios (o
«daemons» en inglés).
Finalmente, verás cómo visualizar el ring buffer del kernel con el comando dmesg para ver los
mensajes que contiene.
Cuando hayas encontrado el paquete que quieres instalar, puedes instalarlo con el
comando sudo apt-get install package.
Importante: Para ejecutar estos comandos tu sistema necesitará acceso a Internet. El
comando apt-cache busca repositorios de estos programas de software en Internet.
Los usuarios que inicien sesión con una interfaz gráfica pueden ver en el área de las
notificaciones un mensaje del update-manager («administrador de actualizaciones» en
español) que indica que las actualizaciones están disponibles tal como se muestra a
continuación:
11.2.1.3 Debian - Eliminación de Paquetes
Ten cuidado cuando elimines una paquete de software puede resultar en la eliminación de
otros paquetes. Debido a las dependencias entre paquetes, si eliminas un paquete, entonces
todos los paquetes que necesitan o dependen de ese paquete se eliminarán también.
Si quieres eliminar todos los archivos de un paquete de software, excepto los archivos de
configuración, puedes ejecutar el comando sudo apt-get remove package.
Si quieres eliminar todos los archivos de un paquete de software, incluyendo los archivos de
configuración, puedes ejecutar el comando sudo apt-get --purge remove package.
Puede que quieras guardar los archivos de configuración en caso de que vuelvas a instalar el
paquete de software en un momento posterior.
11.2.1.4 Debian - Consultar Paquetes
Hay varios tipos de consultas que los administradores necesitan utilizar. Para obtener una lista
de todos los paquetes que están instalados actualmente en el sistema ejecuta el
comando dpkg -l.
Para listar los archivos que componen un paquete especial, puedes ejecutar el comando
de dpkg -L package.
Para consultar un paquete y obtener información o su estado usa el comando de dpkg -
s package.
Al igual que el sistema Debian, los sistemas de administración de paquetes RPM rastrean
dependencias entre paquetes. Las dependencias rastreadas aseguran que cuando se instala
un paquete, el sistema también instalará los paquetes que el paquete necesita para funcionar
correctamente. Las dependencias también garantizan que las actualizaciones de software y
las eliminaciones se realicen correctamente.
La herramienta de back-end más comúnmente utilizada para la administración de paquetes
RPM es el comando rpm. Mientras que el comando rpm puede instalar, actualizar, consultar y
eliminar paquetes, las herramientas front-end de línea de comandos
como yum y up2date automatizan el proceso de resolución de los problemas con las
dependencias.
Además, existen herramientas de front-end basadas en GUI tales como yumex y gpk-
application (ver abajo) que también facilitan la administración de paquetes RPM.
Debes tener en cuenta que muchos de los comandos siguientes requieren privilegios de root.
La regla es que si un comando afecta el estado de un paquete, necesitarás tener acceso
administrativo. En otras palabras, un usuario normal puede realizar una consulta o una
búsqueda, pero agregar, actualizar o eliminar un paquete requiere que el comando lo ejecute
un usuario root.
Los comandos RPM no están disponibles dentro del entorno de la máquina virtual de este
curso.
Para obtener una lista de todos los paquetes que están instalados actualmente en el sistema
ejecuta el comando rpm -qa.
Para listar los archivos que componen un paquete especial, puedes ejecutar el comando
de rpm -ql package.
El carácter después de q en la opción -ql es la letra l y no el número 1.
De nuevo, raramente es necesario ver estos archivos directamente, ya que otros comandos
ofrecen una salida más amigable para el usuario y una manera alternativa de ver esta
información.
Mientras que la mayoría de los “archivos” bajo el directorio /proc no se pueden modificar,
incluso por el usuario root, los “archivos” bajo el directorio /proc/sys pueden modificarse por
el usuario root. Modificar estos archivos cambiarán el comportamiento del kernel de Linux.
Una modificación directa a estos archivos solo causa cambios temporales al kernel. Para
hacer cambios permanentes, se le pueden agregar entradas al archivo /etc/sysctl.conf.
Por ejemplo, el directorio /proc/sys/net/ipv4 contiene un archivo
llamado icmp_echo_ignore_all. Si ese archivo contiene un cero 0 , como lo hace
normalmente, entonces el sistema responderá a solicitudes icmp. Si ese archivo contiene un
uno 1 , entonces el sistema no responderá a solicitudes icmp: ”
[user@localhost ~]$ su -
Password:
[root@localhost ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[root@localhost ~]# ping -c1 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=64
time=0.026 ms
Puedes acomodar los procesos en un árbol familiar de las parejas de padre e hijo. Si quieres
ver este árbol, el comando pstree lo mostrará:
Si quieres examinar la relación de procesos padre e hijo, usando la salida del comando
anterior, podrías considerar que es como:
11.5 El Comando ps (proceso)
Otra forma de visualizar los procesos es con el comando ps. De forma predeterminada, el
comando ps sólo mostrará los procesos actuales en el shell actual. Irónicamente, verás
el ps ejecutándose cuando quieras ver qué otra cosa se está ejecutando en el shell:
sysadmin@localhost:~$ ps
PID TTY TIME CMD
6054 ? 00:00:00 bash
6070 ? 00:00:01 xeyes
6090 ? 00:00:01 firefox
6146 ? 00:00:00 ps
sysadmin@localhost:~$
De manera similar al comando pstree, si ejecutas ps con la opción --forest, verás las líneas
indicando la relación de padre e hijo:
sysadmin@localhost:~$ ps --forest
PID TTY TIME CMD
6054 ? 00:00:00 bash
6090 ? 00:00:02 \_ firefox
6180 ? 00:00:00 \_ dash
6181 ? 00:00:00 \_ xeyes
6188 ? 00:00:00 \_ ps
sysadmin@localhost:~$
Para poder ver todos los procesos del sistema, puedes ejecutar el comando ps aux o ps -ef:
La salida de todos los procesos ejecutándose en un sistema sin duda puede ser abrumador.
En el ejemplo la salida del comando ps se filtró por el comando head, por lo que se ven sólo
los diez primeros procesos. Si no filtras la salida del comando ps, es probable que tengas que
recorrer cientos de procesos para encontrar lo que te interesa.
Una forma común de ejecutar el comando ps es utilizando el comando grep para filtrar la
salida que muestre las líneas que coincidan con una palabra clave, como el nombre del
proceso. Por ejemplo, si quieres ver la información sobre el proceso de firefox, puede
ejecutar un comando como:
Como usuario root te pueden interesar más los procesos de otro usuario que tus propios
procesos. Debido a los varios estilos de opciones que soporta el comando ps, hay diferentes
formas de ver los procesos de un usuario individual. Utilizando la opción tradicional de UNIX,
para ver los procesos del sysadmin (o «administrador del sistema» en español), ejecuta el
siguiente comando:
sysadmin@localhost:~$ top
De forma predeterminada, la salida del comando top se ordena por el % del tiempo de CPU
que cada proceso está utilizando actualmente, con los valores más altos en primer lugar. Esto
significa los procesos que son los «CPU hogs» aparecen primero:
top - 16:58:13 up 26 days, 19:15, 1 user, load average: 0.60, 0.74,
0.60
Tasks: 8 total, 1 running, 7 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.0%us, 2.5%sy, 0.0%ni, 90.2%id, 0.0%wa, 1.1%hi, 0.2%si,
0.0%st
Mem: 32953528k total, 28126272k used, 4827256k free, 4136k buffers
Swap: 0k total, 0k used, 0k free, 22941192k cached
Hay una extensa lista de comandos que se pueden ejecutar dentro del top:
Teclas Significado
h o ? Ayuda
Una de las ventajas del comando top es que se puede dejar correr para permanecer al
«pendiente» de los procesos para propósitos de monitoreo. Si un proceso comienza a dominar
o «huye» con el sistema, entonces por defecto aparecerá en la parte superior de la lista
presentada por el comando top. Un administrador que está ejecutando el comando top puede
entonces tomar una de dos acciones:
Terminar el proceso «corrido»: Apretando la tecla k mientras se ejecuta el
comando top pedirá al usuario que proporcione el PID y un número señal. Enviar la
señal predeterminada le pedirá al proceso que termine, pero enviando el número 9 de
la señal, la señal KILL, forzará el cierre del proceso.
Ajustar la prioridad del proceso: Apretando la tecla r mientras se ejecuta el
comando top pedirá al usuario que ejecute el renice del proceso seguido por el valor
del discernimiento (o «niceness» en inglés). Los valores de niceness pueden ser del -
20 al 19 y afectan la prioridad. Sólo el usuario root puede utilizar un «niceness» menor
que el valor actual de niceness o un valor de niceness negativo, que hace que el
proceso se ejecute con una prioridad mayor. Cualquier usuario puede proporcionar un
valor de niceness que es mayor que el valor actual de niceness y hará que el proceso
se ejecute con una prioridad baja.
Otra ventaja del comando top es que puede darte una representación general de lo ocupado
que está el sistema actualmente y la tendencia en el tiempo. Los promedios de carga se
muestran en la primera línea de la salida del comando top e indican que tan ocupado ha
estado el sistema durante los últimos uno, cinco y quince minutos. Esta información también
puede verse ejecutando el comando uptime o directamente mostrando el contenido del
archivo /proc/loadavg:
sysadmin@localhost:~$ free
total used free shared buffers cached
Mem: 32953528 26171772 6781756 0 4136 22660364
-/+ buffers/cache: 3507272 29446256
Swap: 0 0 0
sysadmin@localhost:~$
Si la cantidad de memoria y swap que está disponible es muy baja, el sistema comenzará
automáticamente a cerrar los procesos. Esta es una razón por la que es importante supervisar
el uso de la memoria del sistema. Un administrador que se da cuenta que el sistema se va
quedando sin memoria libre, puede utilizar el comando top o kill para cerrar los procesos
que quiere, en lugar de dejar que el sistema elija por él.
Archivo Contenido
messages Mensajes del kernel y otros procesos que no pertenecen a ninguna otra
parte. A veces se denomina dsyslog en lugar de messages cuando el
demonio haya grabado este archivo.
Los archivos de registro se rotan, lo que significa que los archivos de registro antiguos
cambiaron de nombre y fueron reemplazados por nuevos archivos de registro. Los nombres
de archivo que aparecen en la tabla anterior pueden tener un sufijo numérico o fecha añadida
al nombre, por ejemplo: secure.0 o secure-20131103
La rotación de un archivo de registro por lo general se ocurre en forma programada, por
ejemplo, una vez por semana. Cuando se rota un archivo de registro, el sistema deja de
escribir en el archivo de registro y agrega un sufijo. Entonces se crea un nuevo archivo con el
nombre original y el proceso de registro sigue usando este nuevo archivo.
Con los demonios modernos normalmente se utiliza un sufijo de fecha. De esta manera, al
final de la semana que termina el 03 de noviembre de 2013, el demonio de registro podría
dejar de escribir en el archivo /var/log/messages, lo podría renombrar
a /var/log/messages-20131103 y comenzar a escribir en un nuevo
archivo /var/log/messages.
Aunque la mayoría de los archivos de registro contienen texto como su contenido, que puede
verse de forma segura con muchas herramientas, otros archivos
como /var/log/btmp y /var/log/wtmp contienen un binario. Mediante el
comando file (o «archivo» en español), puedes comprobar si el tipo de contenido del archivo
es seguro para ver.
Para los archivos que contienen datos binarios, normalmente hay comandos disponibles que
leen los archivos, interpretan su contenido y luego muestran texto. Por ejemplo, los
comandos lastb y last se pueden usar para ver los
archivos /var/log/btmp y /var/log/wtmp respectivamente.
Por razones de seguridad, la mayoría de los archivos encontrados no son legibles por los
usuarios normales, así que asegúrate de ejecutar los comandos que interactúan con estos
archivos teniendo los privilegios de root.
11.1 Introducción
Este es Lab 11: Ubicaciones de los Datos de Linux. Mediante la realización de esta práctica
de laboratorio, los estudiantes aprenderán acerca de la ubicación de la información del kernel,
información del proceso, las librerías, los archivos de registro, y los paquetes de software.
En este laboratorio llevarás a cabo las siguientes tareas:
11.2.1 Paso 1
En esta tarea explorarás algunos de los archivos ubicados en el directorio /proc:
ls /proc
sysadmin@localhost:~$ ls /proc
1 cpuinfo kallsyms mpt sysrq-trigger
19 crypto kcore mtrr sysvipc
23 devices key-users net thread-self
25 diskstats keys pagetypeinfo timer_list
41 dma kmsg partitions timer_stats
50 driver kpagecount sched_debug tty
62 execdomains kpageflags schedstat uptime
74 fb loadavg scsi version
acpi filesystems locks self version_signature
buddyinfo fs mdstat slabinfo vmallocinfo
bus interrupts meminfo softirqs vmstat
cgroups iomem misc stat zoneinfo
cmdline ioports modules swaps
consoles irq mounts sys
sysadmin@localhost:~$
Recuerda que los directorios que tienen los números para los nombres representan procesos
que se ejecutan en el sistema. El primer proceso es siempre /sbin/init, po lo que el
directorio /proc/1 contendrá los archivos con la información sobre el proceso init en
ejecución.
El archivo cmdline dentro del directorio del proceso (/proc/1/cmdline, por ejemplo)
mostrará el comando que se ejecuta. El orden en que se inician otros procesos varía mucho
de un sistema al otro. Dado que el contenido de este archivo no contiene un carácter de nueva
línea, un comando echo se ejecutará para hacer que el prompt vaya a una nueva línea.
11.2.2 Paso 2
Utiliza cat y después ps para ver la información sobre el proceso /sbin/init (identificador
de proceso (PID) de 1):
sysadmin@localhost:~$ ps -p 1
PID TTY TIME CMD
1 ? 00:00:00 init
11.2.3 Paso 3
Visualiza el archivo /proc/cmdline para ver qué argumentos pasan al kernel durante el
arranque:
cat /proc/cmdline
11.3.1 Paso 1
Desde la terminal, escribe el siguiente comando:
11.3.2 Paso 2
Terminado el proceso en el primer plano presionando Ctrl-C.
11.3.3 Paso 3
A continuación, para iniciar el mismo proceso en el segundo plano, introduce:
Al añadir el signo & al final del comando, el proceso se inicia en el segundo plano y permite al
usuario mantener el control de la terminal.
Una forma más fácil de entrar al comando anterior sería aprovechar el historial de comandos.
Podrías haber presionado la tecla de flecha arriba ↑ en el teclado, añadir un Espacio y & al
final del comando y luego presionar la tecla Entrar. Esto te ahorra tiempo al introducir
comandos similares.
Esto significa que este proceso tiene un número de trabajo 1 (como lo muestra la salida [1]) y
un identificador de proceso (PID) de 158. Cada terminal/shell tendrá sus números de trabajo
únicos. El PID vale para todo el sistema; cada proceso tiene un número de identificación
único.
Esta información es importante al realizar ciertas manipulaciones del proceso, tales como
parar los procesos o cambiar su valor de prioridad.
Nota: Tu ID de proceso probablemente será diferente de aquel en el ejemplo.
11.3.4 Paso 4
Para ver qué comandos se ejecutan en la terminal actual, escribe el siguiente comando:
jobs
sysadmin@localhost:~$ jobs
[1]+ Running ping localhost > /dev/null &
11.3.5 Paso 5
A continuación, inicia otro comando ping en segundo plano escribiendo lo siguiente:
11.3.6 Paso 6
Ahora, debe haber dos comandos ping ejecutándose en segundo plano. Para verificarlo,
emite el comando jobs de nuevo:
jobs
sysadmin@localhost:~$ jobs
[1]- Running ping localhost > /dev/null &
[2]+ Running ping localhost > /dev/null &
11.3.7 Paso 7
Una vez que hayas comprobado que dos comandos ping se ejecutan, lleva al primer
comando al primer plano escribiendo lo siguiente:
fg %1
sysadmin@localhost:~$ fg %1
ping localhost > /dev/null
11.3.8 Paso 8
Observa que, una vez más, el comando ping ha tomado el control de la terminal. Para
suspender (pausar) el proceso y recuperar el control de la terminal, escribe Ctrl-Z:
sysadmin@localhost:~$ fg %1
ping localhost > /dev/null
^Z
[1]+ Stopped ping localhost > /dev/null
11.3.9 Paso 9
Para que este proceso continúe ejecutándose en segundo plano, ejecuta el siguiente
comando:
bg %1
sysadmin@localhost:~$ bg %1
[1]+ ping localhost > /dev/null &
11.3.10 Paso 10
Emite el comando jobs de nuevo para verificar dos procesos en ejecución:
jobs
El resultado debe ser similar al siguiente:
sysadmin@localhost:~$ jobs
[1]- Running ping localhost > /dev/null &
[2]+ Running ping localhost > /dev/null &
11.3.11 Paso 11
A continuación, inicia el comando ping escribiendo lo siguiente:
11.3.12 Paso 12
Emite el comando jobs de nuevo para verificar tres procesos en ejecución:
jobs
sysadmin@localhost:~$ jobs
[1] Running ping localhost > /dev/null &
[2]- Running ping localhost > /dev/null &
[3]+ Running ping localhost > /dev/null &
11.3.13 Paso 13
Utilizando el número de trabajo, detenga el último comando ping con el comando kill y
verifica que se haya detenido la ejecución del comando jobs:
kill %3
jobs
sysadmin@localhost:~$ kill %3
sysadmin@localhost:~$ jobs
[1] Running ping localhost > /dev/null &
[2]- Running ping localhost > /dev/null &
[3]+ Terminated ping localhost > /dev/null
11.3.14 Paso 14
Por último, puedes detener todos los comandos ping con el comando killall. Después de
ejecutar el comando killall, espera unos instantes, y luego ejecuta el comando jobs para
comprobar que todos los procesos se hayan detenido:
killall ping
jobs
11.4.1 Paso 1
Desde la ventana de la terminal, escribe los siguientes comandos:
11.4.2 Paso 2
A continuación, inicia el comando top escribiendo lo siguiente en la terminal:
top
11.4.3 Paso 3
El comando top es un programa interactivo, lo que significa que puedes emitir comandos
dentro del programa. Vas a utilizar el comando top para terminar los procesos ping. Primero
introduce de la letra k. Observa que apareció un prompt debajo de Swap:
11.4.4 Paso 4
En el prompt PID to kill: escribe el PID del primer proceso ping en ejecución, y a
continuación, presiona Entrar. Observa que el prompt cambia como a continuación:
11.4.5 Paso 5
En el prompt Kill PID with signal [15]: introduce la señal para enviar a este proceso.
En este caso, solamente presiona la tecla Entrar para utilizar la señal por defecto. Ten en
cuenta que el primer comando ping se elimina y sólo un comando ping permanece en el
listado (es posible que tengas que esperar unos segundos mientras el
comando top actualiza):
Para considerar
Existen diferentes tipos de valores numéricos que se pueden enviar a un proceso. Estos son
los valores predefinidos, cada uno con un significado diferente. Si quieres obtener más
información sobre estos valores, teclea man kill en la ventana de la terminal.
El símbolo indica que la señal por defecto es la señal indicada por la terminar SIGTERM o el
número 15.
11.4.6 Paso 6
A continuación, termina los procesos restantes ping como antes, excepto que esta vez, en el
prompt de la señal Kill PID with signal [15]: utiliza el valor de 9 en lugar de aceptar
el valor predeterminado 15. Presiona Entrar para aceptar y entrar.
Para considerar
La señal de matar 9 o SIGKILL es una señal «contundente» que no puede ser ignorada, a
diferencia del valor por defecto de 15. Observa que todas las referencias al comando ping se
han eliminado del top.
11.4.7 Paso 7
Introduce q para salir del comando top. La siguiente pantalla refleja que ambos
comandos ping fueron terminados:
11.5.1 Paso 1
Para empezar, escribe los siguientes comandos en la terminal:
El comando sleep se utiliza normalmente para hacer una pausa en un programa (script shell)
por un período de tiempo específico. En este caso se utiliza sólo para proporcionar un
comando que se tarda mucho tiempo en ejecutarse.
Asegúrate de tener en cuenta los PID en el sistema de los procesos sleep para los siguientes
pasos! Tus PID serán diferentes a los demostrados en el laboratorio.
11.5.2 Paso 2
A continuación, determina qué trabajos se están ejecutando actualmente escribiendo:
jobs
sysadmin@localhost:~$ jobs
[1]- Running sleep 888888 &
[2]+ Running sleep 888888 &
sysadmin@localhost:~$
11.5.3 Paso 3
Ahora, utiliza el comando kill para detener la primera instancia del
comando sleep escribiendo lo siguiente (sustituye PID con el ID de proceso de tu primer
comando sleep). También, ejecuta el comando jobs para verificar que el proceso se haya
detenido:
kill PID
jobs
sysadmin@localhost:~$ ps
PID TTY TIME CMD
62 ? 00:00:00 bash
89 ? 00:00:00 sleep
90 ? 00:00:00 sleep
91 ? 00:00:00 ps
sysadmin@localhost:~$ kill 89
sysadmin@localhost:~$ jobs
[1]- Terminated sleep 888888
[2]+ Running sleep 888888 &
sysadmin@localhost:~$
Consejo útil: Si no recuerdas el PID del primer proceso, sólo tienes que introducir el
comando ps (proceso) tal como se muestra arriba.
11.5.4 Paso 4
A continuación, utiliza el comando pkill para terminar el comando sleep restante, utilizando
el nombre del programa en lugar del PID:
11.6.1 Paso 1
Inicia un proceso en segundo plano utilizando ping y visualiza los procesos actuales utilizando
el comando ps:
11.6.2 Paso 2
Ejecuta el comando ps usando la opción -e, para que se muestren todos los procesos.
ps -e
sysadmin@localhost:~$ ps -e
PID TTY TIME CMD
1 ? 00:00:00 init
19 ? 00:00:00 rsyslogd
23 ? 00:00:00 cron
25 ? 00:00:00 sshd
41 ? 00:00:00 named
50 ? 00:00:00 login
62 ? 00:00:00 bash
98 ? 00:00:00 ping
100 ? 00:00:00 ps
Debido a que este entorno es de un sistema operativo virtualizado, hay muchos menos
procesos que lo que normalmente se muestra con Linux corriendo directamente en el
hardware.
11.6.3 Paso 3
Utiliza el comando ps con la opción -o para especificar las columnas de salida.
ps -o pid,tty,time,%cpu,cmd
11.6.4 Paso 4
Utilizar la opción --sort para especificar el orden de la(s) columna(s). De manera
predeterminada, una columna especificada para la clasificación se ordenará de manera
ascendente, esto puede ser forzado colocando el símbolo plus + que aparece delante del
nombre de la columna. Para especificar un orden descendente, utiliza el signo
menos - delante del nombre de columna.
Ordena la salida del ps por %mem:
11.6.5 Paso 5
Mientras que el comando ps puede mostrar el porcentaje de memoria utilizado por el proceso,
el comando free mostrará el uso total de la memoria del sistema:
free
sysadmin@localhost:~$ free
total used free shared buffers cached
Mem: 65969788 6242744 59727044 0 300852 1062284
-/+ buffers/cache: 4879608 61090180
Swap: 2097148 0 2097148
11.6.6 Paso 6
Detén el comando ping con el siguiente comando kill y verifica con el comando jobs:
kill PID
jobs
sysadmin@localhost:~$ kill 98
sysadmin@localhost:~$ jobs
[1]+ Terminated ping localhost > /dev/null
11.7.1 Paso 1
Debido a que los próximos comandos que se ejecutarán en este laboratorio requieren
derechos de superusuario, utiliza el comando su para cambiar a la cuenta de root:
su - root
{Introduce la contraseña: netlab123}
sysadmin@localhost:~$ su - root
Password:
root@localhost:~#
11.7.2 Paso 2
Los registros del sistema se almacenan en el directorio /var/log. Lista los archivos en este
directorio:
ls /var/log
root@localhost:~# ls /var/log
alternatives.log boot cron.log faillog lastlog news
wtmp
apt bootstrap.log dmesg fsck mail.err syslog
auth.log btmp dpkg.log kern.log mail.log upstart
root@localhost:~#
11.7.3 Paso 3
Cada archivo de registro representa un servicio o función. Por ejemplo, el
archivo auth.log muestra información sobre la autorización o la autenticación, tal como los
intentos de inicio de sesión del usuario. Los nuevos datos se almacena en la parte inferior del
archivo. Ejecuta los siguientes comandos para ver un ejemplo:
ssh localhost
{En el primer prompt, introduce yes}
{En el segundo prompt, introduce abc}
{En el tercer prompt, introduce abc}
{En el cuarto prompt, introduce abc}
tail -5 /var/log/auth.log
root@localhost:~# ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is 5f:e2:43:0f:f9:26:e5:d5:77:ba:9e:95:72:9e:ee:64.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known
hosts.
root@localhost's password:
Permission denied, please try again.
root@localhost's password:
Permission denied, please try again.
root@localhost's password:
Permission denied (publickey,password).
root@localhost:~# tail -5 /var/log/auth.log
Apr 8 20:25:13 localhost sshd[117]: pam_unix(sshd:auth): authentication
failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost user=root
Apr 8 20:25:16 localhost sshd[117]: Failed password for root from ::1
port 58940 ssh2
Apr 8 20:25:28 sshd[117]: last message repeated 2 times
Apr 8 20:25:28 localhost sshd[117]: Connection closed by ::1 [preauth]
Apr 8 20:25:28 localhost sshd[117]: PAM 2 more authentication failures;
logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost user=root
root@localhost:~#
11.7.4 Paso 4
Para ver otro ejemplo de las entradas de registro, ejecuta los siguientes comandos:
crontab -e
crontab -l | tail -2
tail /var/log/cron.log
root@localhost:~# crontab -l | tail -2
# m h dom mon dow command
0 2 * * 0 who >> /tmp/whothere
root@localhost:~# tail /var/log/cron.log
Apr 8 17:33:32 localhost /usr/sbin/cron[22]: (CRON) INFO (pidfile fd =
3)
Apr 8 17:33:32 localhost /usr/sbin/cron[23]: (CRON) STARTUP (fork ok)
Apr 8 17:33:32 localhost /usr/sbin/cron[23]: (CRON) INFO (Running
@reboot jobs)
Apr 8 18:17:01 localhost /USR/SBIN/CRON[79]: (root) CMD ( cd / && run-
parts -
-report /etc/cron.hourly)
Apr 8 19:17:02 localhost /USR/SBIN/CRON[82]: (root) CMD ( cd / && run-
parts -
-report /etc/cron.hourly)
Apr 8 20:17:01 localhost /USR/SBIN/CRON[99]: (root) CMD ( cd / && run-
parts -
-report /etc/cron.hourly)
Apr 8 20:31:18 localhost crontab[121]: (root) BEGIN EDIT (root)
Apr 8 20:32:42 localhost crontab[121]: (root) REPLACE (root)
Apr 8 20:32:42 localhost crontab[121]: (root) END EDIT (root)
Apr 8 20:33:19 localhost crontab[132]: (root) LIST (root)
root@localhost:~#
11.7.5 Paso 5
Visualiza las últimas cinco líneas del archivo /var/log/dmesg para ver los mensajes del
kernel desde el momento del arranque y ejecuta el comando dmesg canalizado al
comando tail para ver los cinco últimos mensajes del kernel:
tail -5 /var/log/dmesg
dmesg | tail -5
root@localhost:~# tail -5 /var/log/dmesg
[ 2.922003] type=1400 audit(1386098331.347:10): apparmor="STATUS"
operation="profile_load" name="/usr/sbin/tcpdump" pid=848
comm="apparmor_parser"
[ 2.989112] Bridge firewalling registered
[ 3.007035] ip_tables: (C) 2000-2006 Netfilter Core Team
[ 3.010733] nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
[ 3.020096] input: ImPS/2 Generic Wheel Mouse as
/devices/platform/i8042/serio1/input/input2
root@localhost:~# dmesg | tail -5
[279447.718341] device veth0pl17180 left promiscuous mode
[279447.718408] br998ad950-b830: port 1(veth0pl17180) entered disabled
state
[279448.519497] bre2e72298-4b5e: port 1(veth0pl17664) entered disabled
state
[279448.525087] device veth0pl17664 left promiscuous mode
[279448.525091] bre2e72298-4b5e: port 1(veth0pl17664) entered disabled
state
root@localhost:~#
En este momento probablemente estarás pensando «¿Qué realmente significan todos estos
mensajes?». La respuesta a esa pregunta no es simple, sin embargo lo importante de esta
lección no es explicar el significado de todos los mensajes del registro, sino más enseñar
dónde encontrar los mensajes de registro.
A medida que adquieras más experiencia en Linux, comenzarás a solucionar los problemas.
En la mayoría de los casos primero buscarás es los archivos de registro.
Con el fin de proporcionar un ejemplo de solución de los problemas realistas, sigue el
siguiente conjunto de tareas.
11.7.6 Paso 6
Introduce el siguiente comando para deshabilitar la posibilidad de que el administrador pueda
crear las entradas crontab y regresa al usuario administrador del sistema:
11.7.7 Paso 7
Intenta a ejecutar el siguiente comando crontab:
crontab -e
sysadmin@localhost:~$ crontab -e
You (sysadmin) are not allowed to use this program (crontab)
See crontab(1) for more information
sysadmin@localhost:~$
Como puedes ver en la última línea de la salida del comando tail, el usuario administrador
del sistema no tiene permiso para utilizar el comando crontab.
11.8.1 Paso 1
Cuando se ejecuta como usuario root, el comando ldconfig se puede utilizar para actualizar
el caché y los enlaces simbólicos para las librerías compartidas en el sistema. Como un
usuario normal, vas a ejecutar el comando ldconfig para imprimir la lista de las librerías
compartidas:
ldconfig -p | less
ldd /bin/bash
12.1 Introducción
Tener acceso a la red es una característica clave de la mayoría de los sistemas Linux. Los
usuarios quieren navegar por la red, enviar e recibir correo electrónico y intercambiar archivos
con otros usuarios.
Normalmente los programas que realizan estas funciones (navegadores, clientes de correo
electrónico, etc.) son bastante fáciles de usar. Sin embargo, cuentan con una característica
importante: la capacidad de que tu computadora se comunique con otro equipo. Para tener
esta comunicación, necesitas saber cómo configurar la red de tu sistema.
Linux te proporciona varias herramientas tanto para configurar tu red, así como para
supervisar su rendimiento. En este capítulo aprenderás a utilizar ambas herramientas basadas
en GUI, así como las herramientas de línea de comandos.
Si haces clic en la pestaña IPv4 Settings (o «ajustes de IPv4» en español) vas a ver esto:
Recuerda que puedes asignar una dirección IP estática o utilizar un servidor DHCP (si está
disponible). Este cambio se puede hacer haciendo clic en la lista desplegable situada junto
a Method (o «método» en español):
Importante: Si cambias del automático (DHCP) a manual, todos los datos anteriores
«desaparecen». Haciendo clic en el botón Cancelar y editando de nuevo el dispositivo eth0,
volverán a aparecer los datos.
La mayoría de los cambios realizados con las herramientas basadas en GUI surten efecto
inmediatamente después de que se guardan. Sin embargo, en algunos casos, tendrás que
reiniciar el equipo o ejecutar un comando como administrador para que los cambios tomen
efecto. A continuación se muestra el comando que debe ejecutarse en un sistema CentOS:
12.5.2 Configurar la Red usando el Archivo
de Configuración
Habrá momentos cuando no haya herramienta gráfica disponible. En esos casos, es útil
conocer los archivos de configuración que se utilizan para almacenar y modificar los datos de
la red.
Estos archivos pueden variar según la distribución que estés utilizando. Los ejemplos
siguientes se proporcionan para sistemas CENTOS.
IPV6INIT=yes
IPV6ADDR=<IPv6 IP Address>
IPV6_DEFAULTGW=<IPv6 IP Gateway Address>
Si quieres que tu sistema sea un cliente DHCP IPv6, agrega la siguiente configuración:
DHCPV6C=yes
NETWORKING_IPV6=yes
Comando Explicación
/etc/hosts Este archivo contiene una tabla de nombres de host para las
direcciones IP. Puede utilizarse para complementar un
servidor DNS.
root@localhost:~# ifconfig
eth0 Link encap:Ethernet HWaddr b6:84:ab:e9:8f:0a
inet addr:192.168.1.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::b484:abff:fee9:8f0a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:95 errors:0 dropped:4 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:25306 (25.3 KB) TX bytes:690 (690.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:460 (460.0 B) TX bytes:460 (460.0 B)
root@localhost:~#
root@localhost:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface
192.168.1.0 * 255.255.255.0 U 0 0 0
eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0
eth0
root@localhost:~#
El primer cuadro amarillo en el ejemplo anterior indica que cualquier paquete de red enviado a
una máquina en la red 192.168.1 no se envía a una puerta de enlace (el * indica «no hay
puerta de enlace»). El segundo cuadro amarillo indica que todos los otros paquetes de red se
envían al host con la dirección IP de 192.168.1.1 (el router).
Algunos usuarios prefieren visualizar esta información con sólo datos numéricos, usando la
opción -n para el comando route. Por ejemplo, mira el siguiente ejemplo y enfócate en dónde
la salida mostraba default:
root@localhost:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0
eth0
root@localhost:~#
root@localhost:~# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt
Iface
192.168.1.0 * 255.255.255.0 U 0 0 0
eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0
eth0
root@localhost:~#
Como se puede ver en la salida anterior, el puerto #22 está "escuchando (LISTEN)", los que
significa que está abierto.
En el ejemplo anterior, la -t se refiere a TCP (recuerda que este protocolo lo vimos de
anteriormente en este capítulo), -l significa «listening» (o «escuchando» en español) (cuáles
de los puertos están escuchando) y -n significa «mostrar números, no nombres».
A veces, mostrar los nombres puede ser más útil. Sólo elimina la opción -n:
NOTE
This program is obsolete. Replacement for netstat is ss. Replacement
for
netstat -r is ip route. Replacement for netstat -i is ip -s link.
Replacement for netstat -g is ip maddr.
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 86400 IN A 192.168.1.2
;; AUTHORITY SECTION:
example.com. 86400 IN NS example.com.
El comando host se puede utilizar también en sentido inverso si se conoce una dirección IP,
pero no el nombre del dominio.
Existen otras opciones para consultar los diferentes aspectos de un DNS, así como
la CNAME (nombre canónico -alias):
Puesto que muchos servidores DNS guardan una copia de example.com, los
registros SOA (Start of Authority) indican el servidor principal para el dominio:
Puedes encontrar una lista completa de información sobre DNS en relación con
el example.com usando la opción -a («all» o «todo» en español):
;; QUESTION SECTION:
;example.com. IN ANY
;; ANSWER SECTION:
example.com. 86400 IN SOA example.com.
cserver.example.com. 2 604800 86400 2419200 604800
example.com. 86400 IN NS example.com.
example.com. 86400 IN A 192.168.1.2
;; ADDITIONAL SECTION:
example.com. 86400 IN A 192.168.1.2
bob@test:~$ exit
logout
Connection to test closed.
sysadmin@localhost:~#
12.1 Introducción
Este es Lab 12: Poking («Dar un toque») a la red. Mediante la realización de esta práctica de
laboratorio los estudiantes aprenderán acerca de la configuración de su equipo en la red.
En este laboratorio llevarás a cabo las siguientes tareas:
12.2.1 Paso 1
Con el fin de determinar tu dirección del protocolo de Internet (IP), ejecuta el
comando ifconfig:
sysadmin@localhost:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 3a:3b:65:10:f6:43
inet addr:192.168.1.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::383b:65ff:fe10:f643/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1206 (1.2 KB) TX bytes:690 (690.0 B)
12.2.2 Paso 2
Tener una dirección IP permitirá que el sistema se comunique con otros sistemas de la misma
red. Con los dispositivos de enrutamiento te puedes comunicar con los sistemas de otras
redes. Para ver la tabla de información de enrutamiento, utiliza el comando route:
route
route -n
sysadmin@localhost:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface
192.168.1.0 * 255.255.255.0 U 0 0 0
eth0
sysadmin@localhost:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use
Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0
sysadmin@localhost:~$
Observa que en la salida del primer comando de la ruta, se proporcionaron los nombres de
algunos elementos (como *). En la salida del segundo comando route, los números se
proporcionan en lugar de los nombres, el resultado de utilizar la opción -n del comando route.
Cuando te conectas a otros equipos, puedes utilizar ya sea una dirección IP o un nombre de
host. Los nombres de host se pueden utilizar si se introducen al archivo /etc/hosts junto
con su dirección IP asociada o si un nombre de dominio (DNS) proporciona la dirección IP con
la traslación del nombre de host.
Un par de nombres que están comúnmente en el
archivo /etc/hosts son localhost y localhost.localdomain, y ambos se utilizan para
referirse a la máquina actual.
12.2.3 Paso 3
Compruebe que la dirección IP 127.0.0.1 tiene una entrada en el archivo /etc/hosts:
El comando ping se puede utilizar para saber si un sistema está conectado actualmente a una
red.
A veces, un sistema puede estar configurado para no responder a peticiones del ping. Por lo
tanto, la falta de una respuesta a un comando ping no significa que un sistema no esté
conectado a una red. Una respuesta rápida a un comando ping no indica, sin embargo, que
un sistema está conectado a una red.
12.2.4 Paso 4
Haz una prueba para ver si la máquina localhost responderá a cuatro peticiones del ping:
12.2.5 Paso 5
Visualiza el archivo /etc/resolv.conf para ver si alguna de las entradas
del nameserver existe:
cat /etc/resolv.conf
12.2.6 Paso 6
Utiliza el comando dig para resolver el nombre localhost.localdomain a una dirección
IP:
dig localhost.localdomain
sysadmin@localhost:~$ dig localhost.localdomain
;; QUESTION SECTION:
;localhost.localdomain. IN A
;; ANSWER SECTION:
localhost.localdomain. 86400 IN A 127.0.0.1
;; AUTHORITY SECTION:
localdomain. 86400 IN NS localhost.localdomain.
;; Query time: 803 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Apr 11 13:33:03 2016
;; MSG SIZE rcvd: 69
sysadmin@localhost:~$
12.2.7 Paso 7
Puede utilizar el comando dig para resolver otros nombres de dominio completos. Utiliza el
comando dig para resolver el nombre de host cserver.example.com a una dirección IP:
dig cserver.example.com
sysadmin@localhost:~$ dig cserver.example.com
; <<>> DiG 9.8.1-P1 <<>> cserver.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57203
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;cserver.example.com. IN A
;; ANSWER SECTION:
cserver.example.com. 86400 IN A 192.168.1.2
;; AUTHORITY SECTION:
example.com. 86400 IN NS example.com.
;; ADDITIONAL SECTION:
example.com. 86400 IN A 192.168.1.2
;; Query time: 990 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Apr 11 13:45:38 2016
;; MSG SIZE rcvd: 83
sysadmin@localhost:~$
Un nombre de dominio completo (FQDN) incluye no sólo el nombre de host, sino también el
dominio «en» el que se encuentra el nombre de host . Para el
FQDN cserver.example.com, cserver es el nombre de host y el domino example.com.
12.2.8 Paso 8
Utiliza el comando dig para resolver la dirección IP 192.168.1.2 a un nombre de host:
dig -x 192.168.1.2
sysadmin@localhost:~$ dig -x 192.168.1.2
; <<>> DiG 9.8.1-P1 <<>> -x 192.168.1.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26791
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;2.1.168.192.in-addr.arpa. IN PTR
;; ANSWER SECTION:
2.1.168.192.in-addr.arpa. 86400 IN PTR cserver.example.com.
2.1.168.192.in-addr.arpa. 86400 IN PTR example.com.
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400 IN NS example.com.
;; ADDITIONAL SECTION:
example.com. 86400 IN A 192.168.1.2
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Apr 11 13:57:50 2016
;; MSG SIZE rcvd: 119
sysadmin@localhost:~$
12.2.9 Paso 9
El comando netstat realiza una gran variedad de tareas relacionadas con el funcionamiento
de la red. Para tener una idea de algunas de sus capacidades, ejecuta el comando con la
opción --help:
netstat --help
sysadmin@localhost:~$ netstat --help
usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--
help
netstat [-vWnNcaeol] [<Socket> ...]
netstat { [-vWeenNac] -i | [-cWnNe] -M | -s }
Uno de los usos comunes de netstat es determinar cuáles de los servicios están
escuchandoo están en espera de una conexión entrante. Por ejemplo, un servicio que se
utiliza para permitir a los usuarios realizar conexiones remotas o de red se denomina Secure
Shell o SSH. SSH normalmente escucha al puerto TCP 22.
Los puertos conocidos son los números de puerto en el rango de 0-1023, normalmente
utilizados por los procesos del sistema para proporcionar los servicios de red. Una lista de los
nombres de servicio y números de puerto asociados se puede encontrar en el
archivo /etc/services.
12.2.10 Paso 10
Utiliza el comando netstat para ver si el puerto TCP para ssh, 22, tiene un proceso
escuchando:
netstat -tl
netstat -tln
sysadmin@localhost:~$ netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 example.com:domain *:*
LISTEN
tcp 0 0 localhost:domain *:*
LISTEN
tcp 0 0 *:ssh *:*
LISTEN
tcp 0 0 localhost:953 *:*
LISTEN
tcp6 0 0 [::]:domain [::]:*
LISTEN
tcp6 0 0 [::]:ssh [::]:*
LISTEN
tcp6 0 0 localhost:953 [::]:*
LISTEN
sysadmin@localhost:~$
12.2.11 Paso 11
Al opción -t del comando netstat limita el proceso de escuchar a los puertos TCP; la
opción -l limita la salida a los puertos con los servicios de escucha; la -n muestra las
direcciones de red numéricamente:
13.1 Introducción
Las cuentas de usuario están diseñadas para proporcionar seguridad en un sistema operativo
Linux. Cada persona en el sistema debe iniciar la sesión utilizando una cuenta de usuario y la
cuenta de usuario permite a la persona ya sea acceder a un directorio de archivos específico o
niega dicho acceso. Esto se logra mediante los permisos de archivo, un tema del que
hablaremos en un capítulo posterior.
Las cuentas de usuario también pertenecen a los grupos que también pueden utilizarse para
proporcionar acceso a los archivos o directorios. Cada usuario pertenece al menos a un grupo
(a menudo muchos) para permitir más fácilmente que los usuarios compartan los datos
almacenados en los archivos con otros usuarios.
Los datos de la cuenta de usuario y de grupo se almacenan en archivos de base de datos.
Conocer el contenido de estos archivos es importante, ya que te permitirá entender mejor
cuáles de lo usuarios tienen acceso a los archivos y directorios en el sistema. Estos archivos
de base de datos también contienen información de seguridad vital que puede afectar la
capacidad de un usuario a acceder al sistema (login).
Hay varios comandos que te proporcionarán la capacidad de ver información de la cuenta de
grupo y usuario, así como te permiten cambiar de una cuenta de usuario a otra (siempre que
tengas la autorización para ello). Estos comandos son valiosos para revisar el uso del sistema,
solucionar los problemas de sistema y controlar el acceso no autorizado al sistema.
Cada línea está dividida en campos por dos puntos. Los campos de izquierda a derecha son
los siguientes:
La siguiente tabla describe cada uno de estos campos en detalle, usando la primera línea de
la salida en el ejemplo anterior (root:x:0:0:root:/root:/bin/bash):
user id 0 Cada cuenta tiene asignado un Id. de usuario (UID «User ID»
en inglés). El UID es lo que realmente define la cuenta, ya
que el nombre de usuario normalmente no es utilizado
directamente por el sistema. Por ejemplo, los archivos son
propiedad de los UID, no de los nombres de usuario.
Algunos UID son especiales. Por ejemplo, el UID 0 le da a la
cuenta de usuario privilegios administrativos.
Los UID por debajo de 500 (en algunas distribuciones de
Linux 1.000) están reservados para las cuentas del sistema.
Las cuentas del sistema se tratarán con más detalle más
adelante en este capítulo.
home /root Este campo define la ubicación del directorio home del
directory usuario. Para los usuarios regulares, esto sería
normalmente /home/username donde username se
reemplaza con el nombre de usuario del usuario. Por ejemplo,
un nombre de usuario bob tendría un directorio
home /home/bob.
El usuario root tiene normalmente una ubicación diferente
para el directorio home: /root.
Las cuentas del sistema raramente tienen directorios, ya que
normalmente no se utilizan para crear o guardar los archivos.
shell /bin/bash Aquí está ubicado el shell del inicio de la sesión del usuario.
De forma predeterminada, el usuario se "ubica en" este shell
siempre que el usuario inicia la sesión en un entorno de línea
de comandos o abre una ventana de terminal. El usuario
luego puede pasar a un shell diferente escribiendo el nombre
del shell, por ejemplo: /bin/tcsh.
El shell bash (/bin/bash) es el más común para los
usuarios de Linux.
Ten en cuenta que mientras que este capítulo describe el contenido de los archivos de grupo y
usuario, el siguiente capítulo describirá los comandos y herramientas que se utilizan para
modificar la información de la cuenta del usuario y de grupos.
name:password:last change:min:max:warn:inactive:expire:reserved
La siguiente tabla describe los campos del archivo /etc/shadow con más detalle, utilizando
la siguiente cuenta la cuál describe a una cuenta de usuario típica:
sysadmin:$6$lS6WJ9O/
fNmEzrIi$kO9NKRBjLJJTlZD.L1Dc2xwcuUYaYwCTS.gt4elijSQW8ZDp6GLYAx.TRNNpUdAg
UXUrzDuAPsYs5YHZNAorI1:15020:5:30:7:60:15050:
Otra técnica para recuperar la información del usuario que se encuentra normalmente en los
archivos /etc/passwd y /etc/shadow es utilizar el comando getent. Una ventaja de usar
el comando getent es que puede recuperar la información de la cuenta definida localmente
(/etc/passwd y /etc/shadow) o en un servidor de directorio en la red.
La sintaxis general de un comando getent es: getent database record «o getent registro
de base de datos» . Por ejemplo, el comando getent passwd sysadmin recuperaría la
información passwd de la cuenta para el usuario sysadmin:
sysadmin@localhost:~$ id
uid=1001(sysadmin) gid=1001(sysadmin)
groups=1001(sysadmin),4(adm),27(sudo)
context=unconfined_u:unconfined_r:unconfined t:s0-s0:c0.c1023
sysadmin@localhost:~$
sysadmin@localhost:~$ id root
uid=0(root) gid=0(root) groups=0(root)
sysadmin@localhost:~$
La salida incluye un contexto Linux mejorado de seguridad (SELinux), la parte context= de
la salida, un tema que está fuera del alcance de este curso.
bin:x:1:1:bin:/bin:/sbin:/sbin/nologin
bin:*:15513:0:99999:7:::
Hay algunas cosas importantes que debes recordar sobre las cuentas de sistema:
La mayoría son necesarias para que el sistema funcione correctamente.
No debes eliminar una cuenta del sistema a menos que estés absolutamente seguro
de que eliminando la cuenta no causará problemas.
Según vayas teniendo más experiencia, debes aprender lo que hace cada cuenta del
sistema. Los administradores del sistema tienen la tarea de garantizar la seguridad en
el sistema esto incluye correctamente asegurar las cuentas del sistema.
group_name:password_placeholder:GID:user_list
La siguiente tabla describe los campos del archivo /etc/group con más detalle, utilizando
una línea que describe a una cuenta de grupo típica:
mail:x:12:mail,postfix
sysadmin@localhost:~$ id -g
1001
Los usuarios también pueden acceder a los archivos y dispositivos si son miembros de los
grupos secundarios. El comando id se puede utilizar también para verificar la pertenencia a
los grupos secundarios del usuario:
sysadmin@localhost:~$ id -G
1001 4 27
Sin pasar opciones al comando, id listará tanto la pertenencia a los grupos primarios como a
los grupos secundarios:
sysadmin@localhost:~$ id
uid=1001(sysadmin) gid=1001(sysadmin)
groups=1001(sysadmin),4(adm),27(sudo)
Se puede agregar un nombre de usuario para determinar los grupos de un usuario específico:
sysadmin@localhost:~$ id sysadmin
uid=1001(sysadmin) gid=1001(sysadmin)
groups=1001(sysadmin),4(adm),27(sudo)
Esto se alinea con el contenido del archivo /etc/group, cuando se revela la búsqueda para
el sysadmin:
Para cambiar el grupo propietario de todos los archivos en una estructura de directorios, utiliza
la opción -R para el comando chgrp. Por ejemplo, el comando chgrp -R games
test_dir cambiaría la propiedad del grupo en el directorio test_dir y de todos los archivos
y subdirectorios del directorio test_dir.
También existe un comando chown que se puede utilizar para cambiar al usuario propietario
de un archivo o directorio. Sin embargo, este comando lo puede utilizar solamente el usuario
root. Los usuarios normales no pueden «dar» sus archivos a otro usuario.
su - root
su -
Una gran ventaja por usar sudo para ejecutar los comandos administrativos es que reduce el
riesgo de que un usuario accidentalmente ejecute un comando como root. La intención de
ejecutar un comando es clara; el comando se ejecuta como root si tiene como prefijo el
comando sudo. De lo contrario, se ejecuta el comando como un usuario normal.
...se puede leer como, «el usuario root puede actuar como TODOS los usuarios en TODAS las
máquina para ejecutar TODOS los comandos.» Para que un usuario como
el sysadmin ejecute todos los comandos como todos los usuarios utilizando el
comando sudo, podría añadirse una entrada similar a la siguiente:
sysadmin@localhost:~$ who
root tty2 2013-10-11 10:00
sysadmin tty1 2013-10-11 09:58 (:0)
sysadmin pts/0 2013-10-11 09:59 (:0.0)
sysadmin pts/1 2013-10-11 10:00 (example.com)
usernam root Esta columna indica el nombre del usuario que inició la
e sesión. Ten en cuenta que por "sesión" nos referimos a
«cualquier proceso de inicio de sesión y cualquier ventana
de la terminal abierta».
date 2013-10-11 l
10:00
Columna Ejemplo Descripción
sysadmin@localhost:~$ who -b -r
system boot 2013-10-11 09:54
run-level 5 2013-10-11 09:54
sysadmin@localhost:~$ w
10:44:03 up 50 min, 4 users, load average: 0.78, 0.44, 0.19
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty2 - 10:00 43:44 0.01s 0.01s -
bash
sysadmin tty1 :0 09:58 50:02 5.68s 0.16s pam:
gdm-password
sysadmin pts/0 :0.0 09:59 0.00s 0.14s
0.13s ssh 192.168.1.2
sysadmin pts/1 example.com 10:00 0.00s 0.03s 0.01s w
USER root Esta columna indica el nombre del usuario que inició la sesión.
TTY tty2 Esta columna indica en qué ventana de terminal el usuario está
trabajando.
JCPU 0.01s El tiempo total de cpu (s=segundos) utilizado por todos los
procesos (programas) ejecutados desde el inicio de sesión.
13.1 Introducción
Este es Lab 13: Ve Quién está en tu Sistema. Mediante la realización de esta práctica de
laboratorio, los estudiantes serán capaces de monitorear quién ha estado tratando de iniciar
sesión en el sistema, y ver cualquiera de sus procesos en ejecución.
En este laboratorio llevarás a cabo las siguientes tareas:
13.2.1 Paso 1
Las cuentas del usuario y del sistema se definen en los
archivos /etc/passwd y /etc/shadow. Ver las primeras diez líneas del
archivo /etc/passwd:
head /etc/passwd
Observa que este archivo contiene una base de datos delimitada por dos puntos de todas las
cuentas de usuario y de sistema disponibles en este sistema.
Las cuentas de usuario se asignan a los usuarios para permitirles el acceso al sistema
operativo. La cuenta sysadmin que utilizaste para iniciar la sesión en el sistema es una
cuenta de usuario normal.
La cuenta root es una cuenta de usuario especial que tiene acceso prácticamente ilimitado y
control sobre el sistema. A veces se denomina cuenta de «superusuario».
Las cuentas del sistema son utilizadas por el sistema operativo o los servicios de procesos
que se ejecutan en él. Al no tener estos archivos ejecutádose como usuario root , el sistema
se mantiene más seguro mediante la limitación del daño que una cuenta de servicio
compuesta podría causar. Las cuentas del sistema no son utilizadas directamente por los
usuarios regulares.
13.2.2 Paso 2
Utiliza el comando grep para ver el registro de tu cuenta sysadmin:
grep sysadmin /etc/passwd
sysadmin@localhost:~$ grep sysadmin /etc/passwd
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash
sysadmin@localhost:~$
Mediante el uso del comando grep, la salida sólo incluye información de la cuenta para ese
único nombre de usuario.
Otra forma de recuperar la información de la cuenta de un usuario es ejecutando el siguiente
comando: getent passwd username. El comando getent tiene la ventaja sobre el
comando grep, ya que también puede acceder a las cuentas de usuario que no están
definidas localmente. En otras palabras, el comando getent puede obtener información sobre
el usuario para los usuarios que se pueden definir en los servidores de directorio de red, tales
como LDAP, NIS, el dominio de Windows, o los servidores de dominio de Active Directory.
13.2.3 Paso 3
Utiliza el comando getent para recuperar la información acerca del administrador de
sistemas:
Nota: En este caso no tenemos ninguna cuenta de red, por lo que el resultado mostrado es
como ver el archivo /etc/passwd.
13.2.4 Paso 4
Puedes ver la documentación de los campos en el archivo /etc/passwd con el siguiente
comando:
man 5 passwd
Recuerda que mientras visualizas una página man, puedes presionar la tecla Entrar para
moverte hacia adelante línea por línea, Espacio página por página y q para salir.
El archivo /etc/passwd tiene los siguientes campos delimitados por los dos puntos:
account:password:UID:GID:GECOS:directory:shell
13.2.5 Paso 5
Puedes consultar la información de la cuenta para tu cuenta, o una cuenta de usuario
especificado, utilizando el comando id:
id
id root
sysadmin@localhost:~$ id
uid=1001(sysadmin) gid=1001(sysadmin)
groups=1001(sysadmin),4(adm),27(sudo
sysadmin@localhost:~$ id root
uid=0(root) gid=0(root) groups=0(root)
sysadmin@localhost:~$
group_name:password:GID:user_list
13.2.6 Paso 6
El comando getent puede recuperar información acerca de las entradas en el
archivo /etc/group. Utiliza el comando getent para recuperar la información acerca
de sysadmin y los grupos adm:
getent group sysadmin
getent group adm
sysadmin@localhost:~$ getent group sysadmin
sysadmin:x:1001:
sysadmin@localhost:~$ getent group adm
adm:x:4:sysadmin
sysadmin@localhost:~$
13.2.7 Paso 7
Dos comandos con salida sencilla para comprender de tu identidad son whoami y groups. El
comando groups también se puede utilizar para obtener la lista de grupos para otro usuario.
Utiliza el comando whoami y groups para tu cuenta y el comando groups para el
usuario root:
whoami
groups
groups root
sysadmin@localhost:~$ whoami
sysadmin
sysadmin@localhost:~$ groups
sysadmin adm sudo
sysadmin@localhost:~$ groups root
root : root
sysadmin@localhost:~$
13.3.1 Paso 1
Utiliza el comando who para obtener la lista actual de los usuarios en el sistema:
who
sysadmin@localhost:~$ who
sysadmin tty Apr 11 14:32
sysadmin@localhost:~$
13.3.2 Paso 2
Utiliza el comando w para obtener una visión más detallada de los usuarios que están
actualmente en tu sistema:
sysadmin@localhost:~$ w
15:17:08 up 6 days, 15 min, 1 user, load average: 0.39, 0.34, 0.37
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
sysadmin console 14:32 4.00s 0.16s 0.00s w
sysadmin@localhost:~$
13.4.1 Paso 1
Para configurar el comando sudo para los usuarios regulares, utiliza el comando visudo. Esto
requiere acceso root ya que el comando visudo falla si lo ejecutan los usuarios regulares.
Intenta configurar el acceso al comando sudo:
visudo
sysadmin@localhost:~$ visudo
visudo: /etc/sudoers: Permission denied
visudo: /etc/sudoers: Permission denied
sysadmin@localhost:~$
13.4.2 Paso 2
Cambia el usuario al usuario root y proporciona la contraseña root de netlab123 cuando se
te solicite:
su -
netlab123
sysadmin@localhost:~$ su -
Password:
root@localhost:~#
El guión después del comando su es una abreviatura de la opción -l, que hace que la entrada
realizada por su sea un inicio de sesión completo mediante la ejecución de los scripts de
entrada que pertenecen al usuario root.
Sin -, o -l, el comando su cambiará tu identidad de usuario, pero no va a ejecutar las
secuencias de comandos de inicio de sesión del nuevo usuario. Esto puede causar algunos
problemas, sobre todo cuando se cambia a la cuenta root. En la mayoría de los casos
cuando cambias de usuario, quieres llevar a cabo un inicio de sesión completo para que
puedas inicializar las variables de entorno, las funciones y los alias que normalmente se
inicializan para un usuario.
13.4.3 Paso 3
Ahora que ya estás en el sistema como usuario root, deberías poder ejecutar el comando para
configurar el acceso sudo:
visudo
root@localhost:~# visudo
13.4.4 Paso 4
Para habilitar el acceso básico a la utilización del comando sudo, debes añadir una entrda al
archivo /etc/sudoers que estás editando ahora. Ya que estás en el vi editor por defecto,
escribe lo siguiente para encontrar esta entrada:
#includedir /etc/sudoers.d
sysadmin ALL=(ALL) ALL
-- INSERT --
Si introduces los datos al archivo correctamente, debes regresar al prompt de shell. Sin
embargo, si al salir de la edición, se te presenta un mensaje que dice «What now»,
presiona Entrar para ver tus opciones. Se recomienda que escribas x para salir sin guardar
los cambios en el archivo sudoers y repitas este paso.
13.4.5 Paso 5
Vuelve a la cuenta sysadmin para verificar que sudo proporciona acceso root escribiendo lo
siguiente:
exit
root@localhost:~# exit
logout
sysadmin@localhost:~$
13.4.6 Paso 6
Trata de ver las primeras líneas del archivo /etc/shadow, un archivo que contiene las
contraseñas cifradas de los usuarios y la información sobre el su caducidad:
head -3 /etc/shadow
sysadmin@localhost:~$ head -3 /etc/shadow
head: cannot open `/etc/shadow' for reading: Permission denied
sysadmin@localhost:~$
ls -l /etc/shadow
Ten en cuenta que el usuario root puede ver cualquier archivo. Esto se debe a que la
cuanta root tiene privilegios especiales que trascienden los permisos de archivos regulares.
sysadmin@localhost:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 838 Mar 14 17:34 /etc/shadow
sysadmin@localhost:~$
13.4.8 Paso 8
Utiliza el comando sudo para ver las primeras líneas del archivo /etc/shadow:
14.1 Introducción
En el capítulo anterior viste que la información de la cuenta de usuario se almacena en el
archivo /etc/passwd y la información de autenticación de usuario (datos de la contraseña)
se almacena en el archivo /etc/shadow. La creación de un nuevo usuario puede lograrse
añadiendo una nueva línea manualmente a cada uno de estos archivos, pero generalmente no
es la técnica recomendada. Mediante el uso de un comando adecuado para agregar un nuevo
usuario, estos archivos pueden ser modificados automáticamente y de forma segura. Si fueras
a modificar manualmente estos archivos, corres el riesgo de cometer un error que podría
impedir el acceso normal de todos los usuarios.
En algunas distribuciones, creando una nueva cuenta de usuario automáticamente se crea
una cuenta de grupo para el usuario, llamado un Grupo Privado de Usuario (UPG «User
Private Group» en inglés). En estos sistemas, el grupo y nombre de usuario serían los mismos
y el único miembro de este nuevo grupo sería el nuevo usuario.
Para las distribuciones que no crean un UPG, los nuevos usuarios reciben el grupo de "users"
(«usuarios» en español) como su grupo primario. El administrador puede crear manualmente
cuentas de grupo que sean privadas para el usuario, pero es más común que el administrador
cree grupos para varios usuarios que deben colaborar. Las cuentas de usuario pueden ser
modificadas en cualquier momento para agregar o quitar membresías de cuenta de grupo,
pero los usuarios deben pertenecer por lo menos a un grupo para usarlo como su grupo
primario.
Antes de empezar a crear los usuarios, debes planear cómo vas a utilizar los grupos. Los
usuarios pueden crearse con membresías en grupos que ya existen o los usuarios existentes
pueden ser modificados para tener membresías en grupos existentes.
Si ya tienes previsto qué usuarios y grupos quieres crear, es más eficiente primero crear sus
grupos y después crear los usuarios con sus pertenencias a grupos. Por otra parte, si creas
primero tus usuarios, y luego sus grupos, necesitarás un paso extra para modificar los
usuarios para que sean miembros de sus grupos.
El comando groupadd puede ser ejecutado por el usuario root para crear un nuevo grupo. El
comando requiere solamente el nombre del grupo que se creará. La opción -g puede utilizarse
para especificar un id de grupo para el grupo nuevo:
El primer carácter del nombre debe ser un guión bajo _ o un carácter alfabético en
minúsculas a-z.
En la mayoría de las distribuciones de Linux se permite hasta 32 caracteres, pero usar
más de 16 puede ser problemático, ya que algunas distribuciones no pueden aceptar
más de 16.
Después del primer carácter, los caracteres restantes pueden ser alfanuméricos, un
guión - o un guión bajo _.
El último carácter no debe ser un guión -.
Lamentablemente estas pautas no se aplican siempre. El problema no es que el
comando groupadd fracase, sino que otros comandos o servicios del sistema no funcionen
correctamente.
root@localhost:~# ls -l index.html
-rw-r-----. 1 root sales 0 Aug 1 13:21 index.html
root@localhost:~# groupmod -n clerks sales
root@localhost:~# ls -l index.html
-rw-r-----. 1 root clerks 0 Aug 1 13:21 index.html
Estos archivos sin nombre de grupo se denominan archivos «huérfanos». Como usuario root,
probablemente quieras buscar todos los archivos que son propiedad de solamente un GID (no
asociado con un nombre de grupo). Esto puede lograrse con la opción -nogroup para el
comando find:
root@localhost:~# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
el campo de EXPIRE.
Esta configuración afecta a la configuración por
defecto del archivo /etc/shadow resaltado abajo:
bob:pw:15020:5:30:7:60:15050:
La opción -e para el comando useradd permite utilizar
un valor EXPIRE diferente al predeterminado, cuando
se crea una nueva cuenta de usuario.
SHELL /bin/bash El valor de SHELL indica el shell por defecto para los
usuarios cuando inician sesión en el sistema.
Esta configuración afecta a la configuración por
defecto del archivo /etc/passwd resaltado abajo:
bob:x:600:600:bob:/home/bob:/bin/bash
La opción -s para el comando useradd permite utilizar
un shell de inicio de sesión diferente al
predeterminado, cuando se crea una nueva cuenta de
usuario.
root@localhost:~# useradd -D -f 30
root@localhost:~# useradd -D
GROUP=100
HOME=/home
INACTIVE=30
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
grupo(s) suplementario(s): Si quieres que el usuario fuera miembro de uno o más grupos
suplementarios, la opción -G se puede utilizar para especificar una lista separada por comas
de nombres de grupos o números.
directorio home: Por defecto, la mayoría de las distribuciones crearán el directorio home del
usuario con el mismo nombre que la cuenta de usuario bajo /home. Por ejemplo, si creas una
cuenta de usuario llamada sam, el nuevo directorio home del usuario sería /home/sam. Hay
varias opciones para el comando useradd que pueden afectar la creación del directorio home
del usuario:
La opción -b te permite especificar un directorio diferente bajo el cual se creará el
directorio home del usuario. Por ejemplo: -b /test resultaría en /test/sam siendo el
directorio home para una cuenta de usuario llamada sam.
La opción -d te permite especificar un directorio existente o un nuevo directorio para el
usuario. Esto debe ser una ruta de acceso completa para el directorio home del
usuario. Por ejemplo: -d /home/sam.
La opción -m le dice a useradd que cree el directorio home; esto no es normalmente
necesario ya que es el comportamiento predeterminado del comando useradd. Sin
embargo, cuando utilices la opción -k (véase abajo) para especificar un esqueleto de
directorio diferente, entonces necesitarás la opción -m.
La opción -M se utiliza para especificarle al comando useradd que no debe crear el
directorio home.
esqueleto de directorio: De forma predeterminada, el contenido del directorio /etc/skel se
copia en el directorio home del usuario nuevo. Los archivos resultantes también son propiedad
del nuevo usuario. Usando la opción -k con el comando useradd, el contenido de un directorio
diferente se puede utilizar para rellenar el directorio home de un usuario nuevo. Cuando se
especifica el directorio esqueleto con la opción -k, debe utilizarse la opción -m, de lo contrario
el comando useradd fallará mostrando un error que dice: «-k flag is only allowed
with the -m flag» (o «La opción -k solo se permite con la opción -m» en español).
shell: Mientras el shell por defecto se especifica en el archivo /etc/default/useradd,
también puede ser cambaido con la opción de useradd -s en el momento de la creación de
cuentas. Más tarde, el administrador puede usar la opción usermod -s para cambiar el shell o
el usuario puede cambiar su shell con el comando chsh. Es común especificar el
shell /sbin/nologin para las cuentas que se vayan a utilizar como cuentas del sistema.
comentario: El campo de comentario, originalmente llamado el campo General Electric
Comprehensive Operating System (GECOS), normalmente se utiliza para contener el nombre
completo del usuario. Muchos programas gráficos muestran el valor de este campo en lugar
del nombre de la cuenta. La opción -c de los comandos useradd y usermod permite
especificar el valor de este campo.
Este ejemplo del comando useradd crea un usuario con UID de 1000, un grupo primario
de users («usuarios»), membresías suplementarias en los grupos wheel y research, un
comentario de «Jane Doe» y un nombre de cuenta jane.
La información sobre la cuenta de usuario de jane se agregará automáticamente a los
archivos /etc/passwd y /etc/shadow, mientras que la información sobre el acceso a
grupos suplementarios de jane se añadirá automáticamente al
archivo /etc/group y /etc/gshadow. Por ejemplo:
root@localhost:~# ls /var/spool/mail
jane root rpc sysadmin
root@localhost:~# ls /home
jane sysadmin
root@localhost:~# ls -a /home/jane
. .. .bash_logout .bashrc .profile .selected_editor
root@localhost:~# ls -a /etc/skel
. .. .bash_logout .bashrc .profile .selected_editor
root@localhost:~#
14.8 Elegir una Contraseña
Elegir una buena contraseña no es una tarea fácil, pero es fundamental que se haga
correctamente, ya que la seguridad de una cuenta (tal vez todo el sistema) puede verse
comprometida. Escoger una buena contraseña es únicamente un comienzo; tienes que ser
cuidadoso con tu contraseña para que otras personas no la puedan ver. Nunca debes decir a
nadie tu contraseña y nunca dejes que alguien te vea escribir tu contraseña. Si quieres
apuntar tu contraseña, entonces la debes guardar en un lugar seguro como una caja fuerte.
¡Es fácil crear una mala contraseña! Si utilizas cualquier información en tu contraseña que
tenga que ver contigo, entonces otras personas pueden llegar a conocerla o descubrir tal
información, por lo tanto tu contraseña podría verse fácilmente comprometida. Tu contraseña
nunca debe contener información sobre ti o alguien que conoces, tales como:
nombre
segundo nombre
apellido
cumpleaños
teléfono
nombres de mascotas
licencia de conducir
seguro social
Hay numerosos factores a considerar al elegir una contraseña para una cuenta:
Longitud: El archivo /etc/login.defs permite al administrador especificar la
longitud mínima de la contraseña. Aunque hay personas que consideran que una
contraseña larga es mejor, esto no es realmente correcto. El problema con las
contraseñas que son demasiado largas es que no se recuerdan fácilmente y,
consecuentemente, la gente las apunta a menudo en un lugar donde pueden ser
fácilmente encontradas y comprometidas.
Composición: Una buena contraseña debe estar compuesta por una combinación de
caracteres alfabéticos, numéricos y simbólicos.
Vigencia: La cantidad de tiempo que una contraseña se puede utilizar como máximo
debe ser limitada por varias razones:
Si una cuenta está comprometida y se limita el tiempo que la contraseña es
válida, el intruso perderá el acceso puesto que eventualmente la contraseña se
volverá invalidada.
Si una cuenta no se usa, entonces se puede desactivar automáticamente
cuando la contraseña no sea válida.
Si los atacantes intentan atacar con «fuerza bruta» con cada contraseña
posible, entonces la contraseña puede cambiarse antes de que el ataque
tenga éxito.
Las opiniones varían sobre la frecuencia con la que los usuarios deben ser forzados a
cambiar sus contraseñas. Para cuentas muy sensibles, se recomienda cambiar las
contraseñas con mayor frecuencia, como cada 30 días. Por otro lado, para cuentas no
críticas sin ningún tipo de acceso a información sensible, hay menos necesidad de
cambio frecuente. Para cuentas con mínimo riesgo, una vigencia razonable sería 90
días.
Suponiendo que el administrador estableció una contraseña para una cuenta de usuario, el
usuario puede entonces iniciar sesión con el nombre de cuenta y la contraseña. Cuando el
usuario abre una terminal, puede ejecutar el comando passwd sin argumentos para cambiar su
propia contraseña. Se le pide su contraseña actual y luego se pedirá que introduzca la nueva
contraseña dos veces.
Para un usuario común puede ser difícil establecer una contraseña válida, porque debe seguir
todas las reglas para la contraseña. El usuario normalmente tiene tres intentos para
proporcionar una contraseña válida antes de que el comando passwd salga con un error.
Con los privilegios del usuario root, las contraseñas encriptadas y otra información relacionada
a la contraseña puede verse consultando el archivo /etc/shadow. Hay que recordar que los
usuarios normales no pueden ver el contenido de este archivo.
14.10 Usando el Comando chage
Aunque no aparezca como un comando que deber saber según los objetivos del curso, el
comando chage ofrece muchas opciones para la gestión de la información de vencimiento de
contraseña que se encuentra en el archivo /etc/shadow.
Aquí está un resumen de las opciones de chage:
Un buen ejemplo del comando chage sería cambiar el número máximo de días para la validez
de la contraseña de una persona a 60 días:
Ten en cuenta que borrar un usuario sin borrar su directorio home significa que los archivos
del directorio home del usuario son ahora huérfanos y estos archivos serán propiedad
únicamente de sus previos UID y GID.
Para eliminar al usuario jane y borrar el directorio /home/jane, utiliza la opción -r:
ADVERTENCIA: El comando anterior solo borra los archivos del usuario en su directorio home
y mail spool. Si el usuario posee otros archivos fuera de su directorio, los archivos seguirán
existiendo como archivos huérfanos.
14.1 Introducción
Este es Lab 14: 14.7 Crear un Usuario Mediante la realización de esta práctica de laboratorio,
los estudiantes aprenderán acerca de cómo crear una nueva cuenta de usuario, establecer la
contraseña inicial para esta cuenta, y realizar otras modificaciones, como por ejemplo hacerlos
miembros de un grupo secundario.
En este laboratorio llevarás a cabo las siguientes tareas:
14.2.1 Paso 1
Con el fin de administrar las cuentas de usuario y de grupo, tendrás que cambiar tu usuario
al root con el siguiente comando:
su -
(Proporciona la contraseña "netlab123" cuando veas el prompt)
sysadmin@localhost:~$ su -
Password:
root@localhost:~#
14.2.2 Paso 2
Utiliza el comando groupadd para crear un grupo llamado «research» (significa
«investigación» en español):
groupadd -r research
root@localhost:~# groupadd -r research
root@localhost:~#
14.2.3 Paso 3
Utiliza el comando getent para recuperar la información acerca del nuevo grupo:
La salida debería ser similar a la siguiente, aunque el GID que le fue asignado puede ser
diferente:
Ahora que se creó el grupo research, usuarios existentes o nuevos pueden ser miembros de
este grupo. La opción -G de usermod debe tener una lista separada por comas de todos los
grupos secundarios a los que pertenece el usuario.
Cuando se utiliza usermod con la opción -a y -G, entonces sólo hay que especificar al grupo
nuevo y añadirlo como miembro de los grupos secundarios existentes.
14.2.4 Paso 4
Utiliza el comando usermod para agregar el grupo research como un grupo secundario para
el usuario sysadmin:
Los usuarios que han iniciado sesión de forma activa en el sistema no podrán pertenecer a los
grupos nuevos hasta que inicien la sesión en el sistema la próxima vez.
14.2.5 Paso 5
Hay varios comandos para verificar la nueva pertenencia al grupo. Utiliza los
comandos groups, id y getent para verificar si el sysadmin pertenece al grupo:
groups sysadmin
id sysadmin
getent group research
14.2.6 Paso 6
Crea un nuevo usuario llamado student siendo éste el miembro secundario del
grupo research y miembro principal de su propio grupo privado. Utiliza un comentario
de Linux Student que aparecerá como nombre completo del usuario cuando lo realizan al
iniciar la sesión en un entorno gráfico. Asegúrate de que su directorio home se creará
especificando la opción -m:
14.2.7 Paso 7
Utilizando el comando getent, vuelve a visualizar los miembros del grupo research, pero
también utiliza getent para mostrar el grupo student , y las bases de
datos passwd y shadow para el usuario student:
14.2.8 Paso 8
Utiliza el comando passwd para establecer la contraseña, netlab123 para el
usuario student y vuelve a visualizar le entrada del archivo shadow para el
usuario student:
passwd student
(escriba la misma contraseña dos veces)
getent shadow student
14.2.9 Paso 9
El hecho de que un usuario tiene una contraseña, no significa que alguna vez haya iniciado
sesión en el sistema. Utiliza el comando last para ver si el usuario student inició la sesión
en alguna ocasión:
last
last student
root@localhost:~# last
sysadmin console Mon Apr 11 19:08 still logged in
sysadmin console Mon Apr 11 19:08 - 19:08 (00:00)
También hay una lastb comando, que funciona de forma similar al comando last salvo que
muestra los intentos de inicio de sesión «malos» o fallidos.
Si ya no quieres que el usuario student tenga acceso al sistema, utiliza el comando usermod
-L student para «bloquear» la cuenta. La cuenta se puede desbloquear con el
comando usermod -U student.
Una solución más permanente para impedir el acceso a la cuenta student sería eliminar la
cuenta, ya sea con el comando userdel student, o bien con userdel -r student.
Utilizando la opción -r con el comando userdel elimina el directorio personal del usuario y el
correo, además de eliminar la cuenta del usuario.
14.2.10 Paso 10
Borra la cuenta student y elimina el directorio home del usuario:
userdel -r student
15.1 Introducción
La propiedad de archivo es crítica para la seguridad de los archivos. Cada archivo tiene un
usuario propietario y un propietario de grupo.
Este capítulo se centrará en cómo especificar el usuario y grupo propietarios de un archivo.
Además, se explorará el concepto de los permisos de archivo y directorio, incluyendo cómo
cambiar los permisos de los archivos y directorios. Por defecto los permisos son los permisos
establecidos para los archivos y directorios cuando se crean inicialmente.
sysadmin@localhost:~$ id
uid=500(sysadmin) gid=500(sysadmin)
groups=500(sysadmin),10001(research),10002(development)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
El ejemplo anterior muestra que el usuario tiene un UID de 500 para la cuenta del usuario
sysadmin. Muestra que el grupo primario para este usuario tiene un GID de 500 para el grupo
sysadmin.
Ya que la cuenta de usuario y la cuenta del grupo primario tienen el mismo nombre y el mismo
identificador numérico, esto indica que este usuario está en un grupo privado de usuario
(UPG). Además, el usuario pertenece a dos grupos adicionales: el grupo research(o
«investigación» en español) con un GID de 10001 y el grupo development (o «desarrollo»
en español) con un GID de 10002.
Cuando se crea un archivo, éste pertenecerá al usuario actual y su grupo primario actual. Si el
usuario del ejemplo anterior ejecutara un comando como touch para crear un archivo y luego
ver los detalles de archivo, la salida sería como la siguiente:
sysadmin@localhost:~$ groups
sysadmin research development
La salida de groups puede no ser tan detallada como la salida del comando id, pero si todo lo
que necesitas saber es a qué grupos puedes cambiar utilizando el comando newgrp, entonces
el comando groups proporciona la información que necesitas. La salida del
comando id muestra tu grupo primario actual, por lo que es útil verificar que el
comando newgrp tuvo éxito.
Por ejemplo, si el usuario sysadmin quería tener un archivo que fuera propiedad del
grupo research, pero no era el grupo primario del usuario, el usuario podría utilizar el
comando newgrp y comprobar el grupo primario correcto con el comando id antes de crear el
nuevo archivo:
sysadmin@localhost:~$ id
uid=502(sysadmin) gid=503(sysadmin)
groups=503(sysadmin),10001(research),10002(development)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sysadmin@localhost:~$ newgrp research
sysadmin@localhost:~$ id
uid=502(sysadmin) gid=10001(research)
groups=503(sysadmin),10001(research),10002(development)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
De la salida de los comandos anteriores, primero puedes ver que el GID del usuario es
de 503 para el usuario sysadmin, y luego se ejecuta el comando newgrp research, y
después el GID primario del usuario es de 10001, el grupo research. Después de estos
comandos, si el usuario quiere crear otro archivo y ver sus detalles, el nuevo archivo
pertenecería al grupo research:
sysadmin@localhost:~$ id
uid=502(sysadmin) gid=10001(research)
groups=503(sysadmin),10001(research),10002(development)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sysadmin@localhost:~$ exit
exit
sysadmin@localhost:~$ id
uid=502(sysadmin) gid=503(sysadmin)
groups=503(sysadmin),10001(research),10002(development)
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
El comando stat también será útil más adelante en este capítulo cuando hablemos de los
permisos, ya que proporciona más detalles que el comando ls -l.
El siguiente gráfico muestra al usuario sysadmin cambiando la propiedad de grupo de un
archivo que posee el usuario:
A veces quieres no sólo cambiar los archivos en el directorio actual, pero también los archivos
en los subdirectorios. Cuando se ejecuta con la opción -R (recursivo), el
comando chgrp operará no sólo en el directorio actual, sino también en todos los directorios
que pueden estar anidados bajo el directorio especificado. La operación también afectarán a
todos los archivos en los subdirectorios, no sólo en los directorios.
El gráfico siguiente ilustra el uso de la opción -R:
sysadmin@localhost:~$ cp -r /etc/sound .
sysadmin@localhost:~$ ls -ld sound
drwxr-xr-x 1 sysadmin sysadmin 0 Dec 11 02:02 sound
sysadmin@localhost:~$ls -lR sound
sound:
total 4
drwxr-xr-x. 2 sysadmin sysadmin 4096 Oct 28 13:06 events
sound/events:
total 48
-rw-r--r--. 1 sysadmin sysadmin 27223 Oct 28 13:06 gnome-2.soundlist
-rw-r--r--. 1 sysadmin sysadmin 18097 Oct 28 13:06 gtk-events-2.soundlist
sysadmin@localhost:~$ chgrp -R development sound
sysadmin@localhost:~$ ls -ld sound
drwxr-xr-x. 3 sysadmin development 4096 Oct 28 13:06 sound
ls -lR sound
sound:
total 4
drwxr-xr-x. 2 sysadmin development 4096 Oct 28 13:06 events
sound/events:
-rw-r--r--. 1 sysadmin development 27223 Oct 28 13:06 gnome-2.soundlist
-rw-r--r--. 1 sysadmin development 18097 Oct 28 13:06 gtk-events-
2.soundlist
sysadmin@localhost:~$
El segundo método es cambiar ambos el usuario y el grupo; esto también requiere privilegios
de root. Para lograr esto, debes separar al usuario y el grupo por dos puntos o un punto. Por
ejemplo:
Si un usuario no tiene privilegios de root, puede utilizar el tercer método para cambiar el grupo
propietario de un archivo al igual que el comando chgrp. Para usa chown para cambiar sólo la
propiedad de grupo del archivo, usar dos puntos o un punto como un prefijo para el nombre
del grupo:
15.6 Permisos
Al ejecutar el comando ls -l, la salida resultante muestra diez caracteres al principio de cada
línea, que indican el tipo de archivo y los permisos del archivo:
root@localhost:~# ls -l /etc/passwd
-rw-r--r--. 1 root root 4135 May 27 21:08 /etc/passwd
Basándose en la salida del comando anterior, los primeros diez caracteres podrían ser
descritos por la siguiente tabla:
Caracte
r Tipo de Archivo
- Un archivo normal que puede estar vacío, contener texto o datos binarios.
A pesar de que todos los tipos de archivos estan listados en la tabla anterior, lo más probable
es que nunca te encontrarás nada más que archivos regulares, directorios y archivos de
enlace, a menos que explores el directorio /dev.
Los caracteres de la parte de permisos de la salida tienen los siguientes significados:
Los permisos establecidos en estos archivos determinan el nivel de acceso que un usuario va
a tener en el archivo. Cuando un usuario ejecuta un programa y el programa accede a un
archivo, los permisos se comprueban para determinar si el usuario tiene los derechos de
acceso correctos en el archivo.
Los propios permisos son engañosamente simple y tienen un significado diferente
dependiendo de si se aplican a un archivo o un directorio:
Permis
o Significado relacionado a un archivo Significado relacionado a un directorio
Respuesta: Ninguno
Explicación: Al principio podría parece que el usuario bob puede ver el contenido del archivo
abc.txt, igual que copiar el archivo, modificar su contenido y ejecutarlo como un programa.
Esta conclusión errónea sería el resultado de tener en cuenta únicamente permisos del
archivo (rwx para el usuario bob en este caso).
Sin embargo, para hacer algo con el archivo, el usuario debe primero «entrar» al
directorio /data. Los permisos para bob en el directorio /data son los permisos para «otros»
(r--), que significa bob no puede utilizar ni siquiera el comando cd para entrar al directorio. Si
el permiso de ejecutar (--x) fuera configurado para el directorio, entonces el
usuario bob sería capaz de «entrar» al directorio, lo que significa que se aplicarían los
permisos del propio archivo.
Lección aprendida: Los permisos de todos los directorios padres deben considerarse antes
de considerar los permisos en un archivo específico.
Importante: Para cambiar los permisos de un archivo, necesitas ser el propietario del archivo
o iniciar la sesión como el usuario root.
Debe especificar un + para agregar un permiso o un - para quitar un permiso. Por último,
especifica r para la lectura w para escritura y x para ejecución.
Por ejemplo, para conceder permiso de lectura al usuario propietario en un archivo
denominado abc.txt, podrías utilizar el siguiente comando:
Solamente se cambió el permiso del usuario propietario. Todos los otros permisos
permanecieron como estaban antes de la ejecución del comando chmod.
Puedes combinar los valores para realizar múltiples cambios en los permisos del archivo. Por
ejemplo, considera el siguiente comando que agregará permisos de lectura para el usuario
propietario y grupo propietario mientras quita el permiso de escritura para «otros»:
Por último, podrías utilizar el carácter = en lugar de - o + para especificar exactamente los
permisos que quieres para un conjunto de permisos:
4 read (leer)
2 write (escribir)
1 execute (ejecutar)
5 r-x
4 r--
3 -wx
2 -w-
1 --x
0 ---
Cuando se utiliza el método numérico para cambiar los permisos, se deben especificar los
nueve permisos. Debido a esto, el método simbólico es generalmente más fácil para cambiar
unos pocos permisos, mientras que el método numérico es mejor para los cambios más
drásticos.
Por ejemplo, para establecer los permisos de un archivo llamado abc.txt a rwxr-
xr-- puedes utilizar el siguiente comando:
15.8 umask
El comando umask es una característica que se utiliza para determinar los permisos
predeterminados establecidos al crear un archivo o directorio. Los permisos predeterminados
se determinan cuando el valor de umask se resta de los permisos máximos predeterminados
permisibles. Los permisos máximos por defecto son diferentes para los archivos y para los
directorios:
Archivo rw-rw-rw-
Directorios rwxrwxrwx
sysadmin@localhost:~$ umask
0002
Desglose de la salida:
Ten en cuenta que los diferentes usuarios pueden tener diferentes umasks. Normalmente, el
usuario root tendrá una unmask más restrictiva que las cuentas de usuario:
root@localhost:~# umask
0022
15.1 Introducción
Este es Lab 15: Propiedad y Permisos. Mediante la realización de esta práctica de laboratorio,
los estudiantes aprenderán a ajustar y ver la propiedad y los permisos de los archivos y
directorios.
En este laboratorio llevarás a cabo las siguientes tareas:
15.2.1 Paso 1
Crea dos directorios y dos archivos en el directorio /tmp:
cd /tmp
mkdir priv-dir pub-dir
touch priv-dir/priv-file
touch pub-dir/pub-file
sysadmin@localhost:~$ cd /tmp
sysadmin@localhost:/tmp$ mkdir priv-dir pub-dir
sysadmin@localhost:/tmp$ touch priv-dir/priv-file
sysadmin@localhost:/tmp$ touch pub-dir/pub-file
sysadmin@localhost:/tmp$
15.2.2 Paso 2
Ve el contenido de los directorios:
ls -l priv-dir
ls -l pub-dir
sysadmin@localhost:/tmp$ ls -l priv-dir
total 0
-rw-rw-r-- 1 sysadmin sysadmin 0 Apr 11 21:26 priv-file
sysadmin@localhost:/tmp$ ls -l pub-dir
total 0
-rw-rw-r-- 1 sysadmin sysadmin 0 Apr 11 21:27 pub-file
sysadmin@localhost:/tmp$
Observa que para cada archivo que se muestra, el primer carácter de la línea es un guión -.
Esto transmite que los artículos son archivos regulares. El primer carácter de la lista indica el
tipo de archivo, donde d indica un directorio, - es un archivo regular, l es un enlace
simbólico, b es un archivo de dispositivo de bloques, c es un archivo de dispositivo de
caracteres, p es un archivo canalizador y s es un archivo de ranura.
Los siguientes nueve caracteres están en tres grupos de tres caracteres. El primer grupo de
tres caracteres (rw- en el ejemplo anterior) son los permisos del usuario propietario, los
siguientes tres caracteres (rw- en el ejemplo anterior) son los permisos del propietario del
grupo y los tres últimos caracteres (r-- en el ejemplo anterior) representan todos los demás
permisos (denominados «otros»).
Al visualizar los permisos, r indica el permiso leer, w indica el permiso escribir y x indica el
permiso de ejecución. El guión - indica que ese permiso no se ha concedido.
Después de los permisos viene un número de enlaces indicando cuántos archivos están
vinculados a este archivo. A continuación, ves al usuario propietario, al propietario del grupo,
el tamaño del archivo, la fecha/hora de la última modificación del archivo y el nombre del
archivo.
15.2.3 Paso 3
Si quieres que un directorio sea más privado, a continuación, puedes utilizar el
comando chmod para quitar los permisos que otros tienen en el directorio. Utiliza el
comando chmod para quitar los permisos del otro para leer y ejecutar:
ls -ld priv-dir/
chmod o-rx priv-dir/
ls -ld priv-dir/
Utilizaste el comando chmod para modificar los permisos para los demás mediante el uso del
carácter “o” seguido de un carácter + o un carácter - para sumar o restar los permisos. El
carácter = se puede utilizar para fijar un permiso exacto.
Puedes utilizar una u en lugar de una o para modificar los permisos del usuario propietario.
Utiliza una g si quieres cambiar los permisos para el propietario del grupo.
Para modificar los permisos de todo el mundo utiliza una “a” en lugar de o, u o g.
chmod g-w file #elimina el permiso de escritura para los propietarios del grupo
chmod go+r file #agrega permiso de lectura para el propietario del grupo y otros
15.2.4 Paso 4
Si quieres que un directorio sea más público, a continuación, puedes utilizar el
comando chmod para agregar el permiso de escritura para otros:
ls -ld pub-dir/
chmod o+w pub-dir/
ls -ld pub-dir/
Ahora, tu salida muestra que los demás tienen permiso de escritura en el directorio (pueden
añadir o eliminar archivos dentro del directorio):
15.2.5 Paso 5
Utiliza el comando chmod para eliminar cualquier permiso del grupo u otros en el
archivo priv-file:
ls -l priv-dir/priv-file
chmod g-rw,o-r priv-dir/priv-file
ls -l priv-dir/priv-file
sysadmin@localhost:/tmp$ ls -l priv-dir/priv-file
-rw-rw-r-- 1 sysadmin sysadmin 0 Apr 11 21:26 priv-dir/priv-file
sysadmin@localhost:/tmp$ chmod g-rw,o-r priv-dir/priv-file
sysadmin@localhost:/tmp$ ls -l priv-dir/priv-file
-rw------- 1 sysadmin sysadmin 0 Apr 11 21:26 priv-dir/priv-file
sysadmin@localhost:/tmp$
15.2.6 Paso 6
Concede a todos los usuarios los mismos permisos de lectura y escritura para el archivo pub-
file:
ls -l pub-dir/pub-file
chmod a=rw pub-dir/pub-file
ls -l pub-dir/pub-file
sysadmin@localhost:/tmp$ ls -l pub-dir/pub-file
-rw-rw-r-- 1 sysadmin sysadmin 0 Apr 11 21:27 pub-dir/pub-file
sysadmin@localhost:/tmp$ chmod a=rw pub-dir/pub-file
sysadmin@localhost:/tmp$ ls -l pub-dir/pub-file
-rw-rw-rw- 1 sysadmin sysadmin 0 Apr 11 21:27 pub-dir/pub-file
sysadmin@localhost:/tmp$
15.2.7 Paso 7
Crea un archivo test.sh en el directorio /tmp con el contenido de «date»:
15.2.8 Paso 8
Intenta ejecutar el archivo test.sh; debería fallar. Ve los permisos en el archivo para ver por
qué:
./test.sh
ls -l test.sh
sysadmin@localhost:/tmp$ ./test.sh
-bash: ./test.sh: Permission denied
sysadmin@localhost:/tmp$ ls -l test.sh
-rw-rw-r-- 1 sysadmin sysadmin 5 Apr 11 22:27 test.sh
sysadmin@localhost:/tmp$
15.2.9 Paso 9
Sólo el usuario propietario de un archivo (o el usuario root) puede cambiar los permisos de
un archivo. Como usuario propietario, date permisos de ejecución y luego ejecuta test.sh:
Hasta ahora, viste cómo utilizar el comando chmod con la notación simbólica, donde se utilizan
símbolos para representar quién (u, g, o, y a), cómo (+, -, o =), y qué cambiar (r, w, y x). El
comando chmod también se puede utilizar con un valor numérico que representa los permisos
del usuario propietario, propietario del grupo y otros en lo que se llama notación octal.
Para utilizar el comando chmod con la notación octal, primero hay que entender el valor octal
de los permisos:
A partir del último listado del archivo test.sh, se mostró que los permisos eran rwx para el
usuario propietario, rw para el propietario del grupo, y r para otros. Para expresar estos
permisos en notación octal, se calcula un total para cada propiedad.
Como resultado se calcularía el total del permiso del usuario como 4 + 2 + 1, o 7, donde 4 es
permiso de lectura, el 2 de escritura, y 1 de ejecución.
El permiso total del grupo sería 4 + 2 o 6, donde 4 es permiso de lectura y 2 de escritura.
El permiso de propiedad para otros sería simplemente 4, permiso de lectura.
Poniendo todo junto, el valor octal para los permisos actuales sería 764.
15.2.10 Paso 10
Utiliza el comando stat para verificar el valor octal para los permisos (acceso) al
archivo test.sh:
stat test.sh
sysadmin@localhost:/tmp$ stat test.sh
File: `test.sh'
Size: 5 Blocks: 8 IO Block: 4096 regular file
Device: fc00h/64512d Inode: 3540004 Links: 1
Access: (0764/-rwxrw-r--) Uid: ( 1001/sysadmin) Gid: ( 1001/sysadmin)
Access: 2016-04-11 22:27:24.987740243 +0000
Modify: 2016-04-11 22:27:24.987740243 +0000
Change: 2016-04-11 22:35:08.335757863 +0000
Birth: -
sysadmin@localhost:/tmp$
Si quieres cambiar estos permisos usando la notación octal para dar al grupo y a otros
permiso de ejecución, entonces deberías usar los tres números siguientes:
7 (lectura, escritura y ejecución) para el usuario propietario
7 (lectura, escritura y ejecución) para el propietario del grupo
5 (leer y ejecutar) para otros
El nuevo modo, o el número octal para los permisos sería entonces 775.
15.2.11 Paso 11
Utilizando la notación octal, modifica los permisos del archivo test.sh de tal modo, que todo
el mundo pueda ejecutar el archivo:
Hay dos comandos que pueden afectar la propiedad de los archivos. El comando chown sólo
puede ser ejecutado por el usuario root y puede cambiar el usuario propietario de un archivo o
el usuario y grupo propietario de un archivo.
El comando chgrp se puede utilizar ya sea por el usuario propietario de un archivo o por el
usuario root.
El comando chgrp sólo cambia el grupo propietario de un archivo.
Cuando un usuario que no sea un root utiliza el comando chgrp, sólo puede cambiar la
propiedad del grupo a un grupo del cual sea miembro. El usuario root puede
utilizar chgrp para cambiar la propiedad de grupo de cualquier archivo a cualquier grupo.
15.2.12 Paso 12
Cambia al usuario root para que puedas ejecutar tanto el comando chown como el chgrp para
las pertenencias a grupos a cualquier grupo:
su -
(proporciona la contraseña root: netlab123)
sysadmin@localhost:/tmp$ su -
Password:
root@localhost:~#
15.2.13 Paso 13
Cambia el directorio /tmp y lista los detalles del archivo pub-dir, y luego su contenido:
cd /tmp
ls -ld pub-dir
ls -l pub-dir/pub-file
Observa que la salida muestra el directorio y el archivo propiedad del usuario sysadmin, y del
grupo sysadmin:
root@localhost:~# cd /tmp
root@localhost:/tmp# ls -ld pub-dir/
drwxrwxrwx 2 sysadmin sysadmin 4096 Apr 11 22:48 pub-dir/
root@localhost:/tmp# ls -l pub-dir/pub-file
-rw-rw-rw- 1 sysadmin sysadmin 0 Apr 11 22:48 pub-dir/pub-file
root@localhost:/tmp#
15.2.14 Paso 14
Utiliza el comando chown para cambiar al usuario y al propietario de grupo del archivo pub-
dir al usuario root y al grupo root. A continuación, ve los detalles del directorio:
La salida debe mostrar que el usuario y los propietarios de grupos han cambiado:
15.2.15 Paso 15
Utiliza el comando chown para cambiar al usuario propietario del archivo pub-file al
usuario bin:
15.2.16 Paso 16
Visualiza los detalles del archivo priv-dir y su contenido:
ls -ld priv-dir
ls -l priv-dir/priv-file
15.2.17 Paso 17
Cambia el propietario del grupo del archivo priv-dir y priv-file al grupo users de forma
recursiva con el comando chgrp y visualiza los archivos actualizados:
ls -ld priv-dir
ls -l priv-dir/priv-file
chgrp -R users priv-dir
ls -ld priv-dir
ls -l priv-dir/priv-file
root@localhost:/tmp# ls -ld priv-dir
drwxrwx--- 2 sysadmin sysadmin 4096 Apr 11 22:48 priv-dir
root@localhost:/tmp# ls -l priv-dir/priv-file
-rw------- 1 sysadmin sysadmin 0 Apr 11 22:48 priv-dir/priv-file
root@localhost:/tmp# chgrp -R users priv-dir
root@localhost:/tmp# ls -ld priv-dir
drwxrwx--- 2 sysadmin users 4096 Apr 11 22:48 priv-dir
root@localhost:/tmp# ls -l priv-dir/priv-file
-rw------- 1 sysadmin users 0 Apr 11 22:48 priv-dir/priv-file
root@localhost:/tmp#
Tu salida refleja que al aplicar los cambios de forma recursiva a un directorio, los cambios se
aplican al directorio y a todo lo que contiene. Esto significaría que este cambio se aplica a
cada subdirectorio bajo priv-dir, cada archivo en priv-dir y a todos sus subdirectorios.
16.1 Introducción
En el capítulo anterior se detallaron los permisos básicos de Linux: leer, escribir y ejecutar. En
la mayoría de las circunstancias, estos permisos básicos de Linux serán suficientes para dar
cabida a las necesidades de seguridad de los usuarios u organizaciones individuales.
Sin embargo, cuando varios usuarios necesitan trabajar de forma rutinaria en los mismos
directorios y archivos, estos permisos pueden no ser suficientes. Los permisos especiales
setuid, setgid y sticky bit están diseñados para hacer frente a estas preocupaciones. En este
capítulo vas a ver cómo estos permisos especiales funcionan y cómo configurarlos.
Conocer la estructura básica del sistema de archivos puede ser esencial para poder trabajar
con éxito con Linux. El Estándar de Jerarquía del Sistema de Archivos (FHS) («Filesystem
Hierarchy Standard» en inglés) proporciona una guía para la mayoría de las distribuciones de
Linux para saber qué directorios hay y qué poner en ellos. Este capítulo trata de este
estándar, así como del propósito de estos directorios comunes.
Como puedes ver, el archivo /etc/shadow no se puede ver (o modificar) por los usuarios
normales debido a que los permisos del archivo /etc/shadow son: -rw-r-----. Dado que
el archivo es propiedad del usuario root, el administrador del sistema podría modificar
temporalmente los permisos en el caso de que quisieran ver o modificar este archivo.
Consideremos ahora el comando passwd. Cuando se ejecuta este comando, se modifica el
archivo /etc/shadow. Esto parece imposible porque otros comandos que el
usuario sysadmin ejecuta e intentan acceder a este archivo, fallan. Así que, ¿Por qué el
usuario sysadmin puede modificar el archivo /etc/shadow mientras se ejecuta el
comando passwd cuando normalmente este usuario no tiene acceso al archivo?
El comando passwd tiene el permiso especial setuid. Cuando se ejecuta el comando passwd y
éste accede al archivo /etc/shadow, el sistema actúa como si el usuario que accede al
archivo fuera el propietario del comando passwd (el usuario root), no el usuario que está
ejecutando realmente el comando.
Puedes ver este conjunto de permisos mediante la ejecución del comando ls -l:
sysadmin@localhost:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 31768 Jan 28 2010 /usr/bin/passwd
Al igual que los permisos de lectura, escritura y ejecución, permisos especiales pueden ser
ajustados con el comando chmod, utilizando cualquiera de los métodos, simbólicos y octales.
Para agregar el permiso setuid simbólicamente, ejecuta:
Para agregar el permiso setuid numéricamente, agrega 4000 a los permisos existentes del
archivo (asume que el archivo tenía originalmente 775 para su permiso en el ejemplo
siguiente):
Para retirar el permiso setuid numéricamente, resta 4000 de los permisos existentes del
archivo:
En el capítulo anterior, establecimos permisos con el método octal utilizando códigos de tres
dígitos. Cuando se proporciona un código de tres dígitos, el comando chmod supone que el
primer dígito antes del código de tres dígitos es 0. Los permisos especiales serán establecidos
sólo si se fijan los cuatro dígitos.
Si se especifican tres dígitos cuando se cambian los permisos en un archivo que ya tiene un
conjunto de permisos especiales, el primer dígito se establecerá en 0 y el permiso especial se
quita del archivo.
16.3 El Permiso setgid en un Archivo
El permiso setgid es similar a setuid, pero hace uso de los permisos del grupo propietario. En
realidad, hay dos formas de permisos setgid: setgid en un archivo y setgid en un directorio.
Cómo funciona el setgid depende de si se establece en un archivo o un directorio.
El permiso setgid en un archivo es muy similar a setuid; permite que un usuario ejecute un
archivo binario ejecutable proporcionando un acceso adicional (temporal) de grupo. El sistema
permitirá que el usuario que ejecuta el comando pertenezca al grupo al que pertenece el
archivo, pero sólo «en» el programa setgid. A medida que el comando se ejecuta y accede a
archivos, esta afiliación adicional al grupo puede proporcionar acceso a los archivos.
Un buen ejemplo del permiso setgid en un archivo ejecutable es el
comando /usr/bin/wall. Observa los permisos de este archivo y el grupo propietario:
sysadmin@localhost:~$ ls -l /usr/bin/wall
-rwxr-sr-x. 1 root tty 10996 Jul 19 2011 /usr/bin/wall
Se puede ver que este archivo es setgid por la presencia de la s en la posición de ejecución
del grupo. Debido a que este ejecutable pertenece al grupo TTY, cuando un usuario ejecuta
este comando, el comando podrá acceder a los archivos que son propiedad del grupo TTY.
Este acceso es importante porque el comando /usr/bin/wall envía mensajes a
«terminales». Esto se logra al escribir datos en archivos como los siguientes:
sysadmin@localhost:~$ ls -l /dev/tty?
crw-------. 1 root tty 4, 0 Mar 29 2013 /dev/tty0
crw--w----. 1 root tty 4, 1 Oct 21 19:57 /dev/tty1
Entonces, ¿Por qué el administrador configuraría un directorio setgid? En primer lugar, ten en
cuenta las siguientes cuentas de usuario:
Para agregar el permiso setgid numéricamente, añade 2000 a los permisos existentes del
archivo (asume en el ejemplo siguiente de que el directorio tenía originalmente 775 para su
permiso):
Para retirar el permiso setgid numéricamente, resta 2000 de los permisos existentes del
archivo:
En un listado largo el permiso setgid está representado por una s en la posición de ejecución
del grupo: drwxrwsr-x.
Una s minúscula significa tanto los permisos de ejecución de setgid como los de grupo están
establecidos. Una S mayúscula significa que sólo el permiso setgid está establecido y no el
permiso de ejecución del grupo: drwxrwSr-x.
Si ves una S mayúscula en la posición de ejecución del grupo, esto indica que, aunque se
haya establecido el permiso setgid, en realidad no está realmente en efecto debido a que el
grupo carece de los permisos de ejecución para utilizarlo.
Para establecer el permiso sticky bit numéricamente, añade 1000 a los permisos existentes
del directorio (asume que el directorio en el ejemplo siguiente tenía originalmente 775 para su
permiso):
chmod 1775 <archivo|directorio>
Para retirar el permiso sticky bit numéricamente, resta 1000 de los permisos existentes del
directorio:
La salida del comando ls -l visualiza el permiso sticky bit con una t en la posición de
ejecución de «otros»: drwxrwxrwt.
Una t minúscula significa que tanto el permiso sticky bit como los permisos de ejecución están
establecidos para «otros». Una T mayúscula significa que sólo el permiso sticky bit está
establecido: drwxrwxrwT.
Mientras la S mayúscula indica un problema con los permisos setuid o setgid,
una T mayúscula no indica necesariamente un problema, siempre y cuando el grupo
propietario aún tenga permiso de ejecución.
Un buen ejemplo del uso de directorios con el permiso sticky bit serían los
directorios /tmp y /var/tmp. Estos directorios están diseñados como ubicaciones donde
cualquier usuario puede crear un archivo temporal.
Debido a que estos directorios están destinados a ser modificables por todos los usuarios,
están configurados para utilizar el permiso sticky bit. Sin este permiso especial, un usuario
podría eliminar los archivos temporales de otro usuario.
passwd 123
shadow 175
group 144
gshadow 897
Cuando se intenta acceder al archivo /etc/passwd, el sistema utiliza esta tabla para traducir
el nombre de archivo en un número de inodo. A continuación, recupera los datos del archivo al
ver la información en la tabla de inodos para el archivo.
Los enlaces físicos son dos nombres de archivo que apuntan al mismo inodo. Por ejemplo,
considera las siguientes entradas de directorio:
passwd 123
mypasswd 123
shadow 175
group 144
gshadow 897
El número contador de enlaces indica cuántos enlaces físicos fueron creados. Cuando el
número es un valor de uno, entonces el archivo sólo tiene un nombre relacionado con el
inodo.
Para crear los enlaces físicos, se utiliza el comando ln con el primer argumento siendo el
nombre de archivo existente y el segundo argumento es el nuevo archivo. Cuando utilizas el
comando ln para crear un enlace físico, el número del enlace aumentará en una unidad por
cada nombre de archivo adicional que enlaces:
sysadmin@localhost:~$ ls -l /etc/grub.conf
lrwxrwxrwx. 1 root root 22 Feb 15 2011 /etc/grub.conf ->
../boot/grub/grub.conf
Los enlaces blandos son mucho más visuales y no requieren ningún comando adicional más
allá del comando ls para determinar el vínculo:
sysadmin@localhost:~$ ls -l mypasswd
lrwxrwxrwx. 1 sysadmin sysadmin 11 Oct 31 13:17 mypasswd -> /etc/passwd
sysadmin@localhost:~$ ln /boot/vmlinuz-2.6.32-358.6.1.el6.i686
Linux.Kernel
ln: creating hard link `Linux.Kernel' => `/boot/vmlinuz-2.6.32-
358.6.1.el6.i686': Invalid cross-device link
sysadmin@localhost:~$ ln -s /boot/vmlinuz-2.6.32-358.6.1.el6.i686
Linux.Kernel
sysadmin@localhost:~$ ls -l Linux.Kernel
lrwxrwxrwx. 1 sysadmin sysadmin 11 Oct 31 13:17 Linux.Kernel ->
/boot/vmlinuz-2.6.32-358.6.1.el6.i686
Con el fin de poder hacer estas clasificaciones, a menudo es necesario hacer referencia a los
subdirectorios debajo del nivel superior de los directorios. Por ejemplo, el directorio /var en sí
no puede ser clasificado como compartible o no compartible, pero uno de sus subdirectorios,
el directorio /var/mail, es compartible. Por el contrario, el directorio /var/lock no debe
ser compartible.
No compartible Compartible
/bin Para mantener binarios esenciales como los comandos ls, cp, y rm, y ser
parte del sistema de archivos root.
/boot Contiene los archivos necesarios para arrancar el sistema, como el kernel de
Linux y los archivos de configuración asociados
/lib Las librerías esenciales de soporte para los archivos ejecutables en los
directorios /bin y /sbin
/lib<qual> Las librerías esenciales creadas para una arquitectura específica. Por
ejemplo, el directorio /lib64 para los procesadores de 64 bit AMD/Intel x86
compatibles
/proc Un sistema de archivos virtual para que el kernel reporte procesos y otra
información
/sbin Los binarios esenciales del sistema utilizados principalmente por el usuario
root
/srv Ubicación donde los servicios específicos del sitio pueden estar alojados
/tmp Directorio en el que todos los usuarios tienen permiso para crear archivos
temporales que deberían ser borrados durante el arranque (pero a menudo no
es así)
/var/lock Ubicación para guardar los archivos de bloqueo de los recursos compartidos
/var/tmp Los archivos temporales que se deben conservar entre los reinicios
La segunda y la tercera jerarquía, que se encuentra bajo los directorios /usr y /usr/local,
repiten el patrón de muchos de los directorios clave que se encuentran debajo de la primera
jerarquía o el sistema de archivos root. La cuarta jerarquía, el directorio /var, también repite
algunos de los directorios de primer nivel, como lib, opt y tmp.
Cuando el sistema de archivos root y su contenido se consideran esenciales o necesarios
para arrancar el sistema, los directorios /var, /usr y /usr/local no se consideran
esenciales para el proceso de arranque. Como resultado, el sistema de archivos root y sus
directorios pueden ser los únicos disponibles en ciertas situaciones, tales como arrancar en
modo de usuario único, un entorno diseñado para la solución de problemas del sistema.
El directorio /usr sirve para contener software para su uso por varios usuarios. El
directorio /usr a veces se comparte a través de la red y se monta como de sólo lectura. Los
directorios comunes de segundo nivel se describen en la siguiente tabla:
/usr/bin Los binarios para el usuario común, usados cuando el sistema está en
modo multiusuario
/usr/sbin Los binarios del sistema para su uso por el administrador en modo
multiusuario
/usr/local/include Los archivos que necesitan ser incluidos con el fin de compilar el
código fuente local
/usr/local/sbin Los binarios locales para uso del administrador del sistema
16.1 Introducción
Este es Lab 16: Los Permisos Especiales. Mediante la realización de esta práctica de
laboratorio, los estudiantes aprenderán acerca de los permisos especiales y diferentes tipos
de archivos de enlace.
En este laboratorio llevarás a cabo las siguientes tareas:
ls -ld /tmp
ls -ld /var/tmp
16.2.2 Paso 2
Visualiza los permisos en el archivo /etc/shadow:
ls -l /etc/shadow
El resultado muestra que el usuario root tiene permisos de leer y escribir, los miembros del
grupo shadow tienen permiso de lectura, mientras otros no tienen ningún permiso para este
archivo:
sysadmin@localhost:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 838 Mar 14 17:34 /etc/shadow
sysadmin@localhost:~$
16.2.3 Paso 3
Visualiza los permisos del archivo /usr/bin/passwd:
ls -l /usr/bin/passwd
sysadmin@localhost:~$ ls -l /usr/bin/passwd
-rwsr-xr-x 5 root root 42824 Sep 12 2012 /usr/bin/passwd
sysadmin@localhost:~$
Observa la s en la columna de permiso de ejecución del usuario. Esto indica que el archivo
tiene el conjunto de permisos setuid, por lo que se ejecuta como el usuario que lo posee
(root) en lugar del usuario que ejecuta el comando.
Por lo tanto, el comando passwd puede actualizar el archivo /etc/shadow, conforme se
ejecuta como el usuario root (recuerda que el usuario root puede editar cualquier archivo,
independientemente de los permisos en el archivo).
16.2.4 Paso 4
Visualiza los permisos del comando /usr/bin/wall:
ls -l /usr/bin/wall
sysadmin@localhost:~$ ls -l /usr/bin/wall
-rwxr-sr-x 5 root tty 18976 Jun 18 2014 /usr/bin/wall
sysadmin@localhost:~$
La s en la columna de ejecución de grupo indica que este archivo tiene el conjunto de
permisos setgid, por lo que se ejecuta como el grupo que lo posee (tty) en lugar del grupo
del usuario que ejecuta el comando. Por lo tanto, el comando wall puede escribir en todas las
terminales (ttys) conforme se ejecuta como el grupo de tty.
Nota: Esto es muy similar al permiso setuid, pero en lugar de ejecutar el comando como el
usuario propietario del programa, el comando se ejecuta como el propietario del grupo del
programa.
Hasta ahora has visto tres tipos de permisos especiales: sticky bit en un directorio, setuid en
un archivo ejecutable y setgid en un archivo ejecutable. Como has visto, estos tres tipos están
presentes en un sistema típico.
Puedes utilizar un tipo de permiso especial; El permiso setgid también se puede aplicar a un
directorio.
Si ves la s en la columna de ejecutar para el grupo propietario del directorio, el directorio tiene
el permiso setgid. Cuando un directorio tiene el permiso setgid, entonces cualquier nuevo
archivo o directorio creado en ese directorio será automáticamente propiedad del grupo que
posee el directorio, no del grupo del usuario que creó el archivo.
16.3.1 Paso 1
Cambia a tu directorio home:
cd
16.3.2 Paso 2
Crea un archivo llamado source que contiene el texto «data» utilizando la redirección:
16.3.3 Paso 3
Visualiza los detalles e información del i-nodo del archivo source:
ls -li source
La salida resaltada muestra que el archivo tiene el número i-nodo 2076 (este número puede
variar de un sistema a otro) y un conteo de vínculos 1:
El sistema operativo Linux utiliza los i-nodos para realizar un seguimiento de la información
acerca de un archivo. Una entrada de directorio asocia un i-nodo con un nombre de archivo.
Al crear un vínculo físico se crea otra entrada de directorio asociado con un i-nodo existente, y
aumentará el número de los vínculos.
Los vínculos físicos te permiten tener varios nombres para referirse a un mismo archivo. Si se
elimina cualquiera de estos nombres, aún puedes utilizar los otros nombres para hacer
referencia al archivo.
De hecho, estos otros nombres, incluso se pueden utilizar para crear vínculos adicionales.
Todos estos nombres se consideran equivalentes, ya que todos se refieren a un i-nodo
existente.
Nota: No puedes crear vínculos físicos a los directorios. Además, un vínculo físico a un archivo
también tiene que existir dentro del mismo sistema de archivos (partición) igual que el archivo
al que se vincula.
16.3.4 Paso 4
Utiliza el comando ln para crear un vínculo físico. Visualiza los detalles e información del i-
nodo del archivo de vínculo físico original y el nuevo:
ln source hardlink
ls -li source hardlink
16.3.5 Paso 5
16.3.5 Paso 5
Utiliza el comando ln para crear un vínculo físico al archivo source. Visualiza los detalles e
información del i-nodo del archivo de vínculo físico original y el nuevo:
ln hardlink hardtoo
ls -li hardlink hardtoo source
Observa que el resultado sigue mostrando que los vínculos físicos comparten el mismo i-nodo
y el número de vínculos aumenta en todos los vínculos cuando se añade uno nuevo:
16.3.6 Paso 6
16.3.6 Paso 6
Retira el último vínculo que se creó y lista los archivos source y hardlink:
rm hardtoo
ls -li source hardlink
Observa que el número de vínculos se disminuye cuando se elimina uno de los archivos con
el vínculo físico:
sysadmin@localhost:~$ rm hardtoo
sysadmin@localhost:~$ ls -li source hardlink
2076 -rw-rw-r-- 2 sysadmin sysadmin 5 Apr 12 13:27 hardlink
2076 -rw-rw-r-- 2 sysadmin sysadmin 5 Apr 12 13:27 source
sysadmin@localhost:~$
16.3.7 Paso 7
Elimina el archivo hardlink y lista los detalles del archivo source:
rm hardlink
ls -li source
sysadmin@localhost:~$ rm hardlink
sysadmin@localhost:~$ ls -li source
2076 -rw-rw-r-- 1 sysadmin sysadmin 5 Apr 12 13:27 source
sysadmin@localhost:~$
Otro tipo de vínculo que puedes crear se conoce como un vínculo simbólico o vínculo blando.
Los vínculos simbólicos no aumentan el número de vínculos de los archivos con los que están
vinculados.
Los archivos de vínculos simbólicos tienen su propio i-nodo y el tipo de archivo. En lugar de
vincular y compartir un i-nodo, se vinculan al nombre de archivo. A diferencia de los vínculos
físicos, los vínculos simbólicos pueden estar vinculados a los directorios y pueden atravesar
los dispositivos y las particiones de sus objetivos.
16.3.8 Paso 8
Crea un vínculo simbólico al archivo source y ve los detalles de los dos archivos:
ln -s source softlink
ls -li source softlink
16.3.9 Paso 9
Crea un enlace simbólico al directorio /proc y muestra el vínculo:
ln -s /proc crossdir
ls -l crossdir
El éxito de estos comandos muestra que los vínculos simbólicos pueden hacer referencia a los
directorios, y pueden cruzar de un sistema de archivos a otro, que son dos cosas que los
enlaces físicos no pueden hacer: