Linux Essentials CURSO OFICIAL INTECAP 2020
Linux Essentials CURSO OFICIAL INTECAP 2020
1.1 Introducción
En este capítulo vamos a explorar la evolución del Linux® y los sistemas operativos populares. También vamos a
hablar sobre las consideraciones para elegir un sistema operativo.
Página 1 de 265
Linux es de Código Abierto. ¿Qué significa eso? El código que impulsa a Linux no es propiedad de una empresa.
En cambio, lo desarrolla la comunidad que lo usa. ¿Por qué es esto bueno? Libera a los usuarios de los costos de
licencia y permite modificar el código según las necesidades cambiantes.
Linux® es una marca registrada de Linus Torvalds en los Estados Unidos y otros países.
El término que más complica las cosas es UNIX. UNIX era originalmente un sistema operativo desarrollado en los
laboratorios de Bell AT&T en la década de 1970. Éste fue modificado y bifurcado (es decir, las personas lo
modificaron y estas modificaciones sirvieron de base para otros sistemas). En la actualidad hay muchas variantes
de UNIX. Sin embargo, UNIX es ahora una marca registrada y una especificación, propiedad de un consorcio
industrial llamado Open Group. Sólo el software que ha sido certificado por el Open Group puede llamarse UNIX.
A pesar de la adopción de todos los requisitos de la especificación de UNIX, Linux no ha sido certificado. ¡Eso
significa que Linux realmente no es un UNIX! Es sólo... como UNIX.
El kernel también se encarga de cambiar entre aplicaciones. Un equipo tendrá un pequeño número de procesadores
CPU y una cantidad finita de memoria. El kernel se encarga de descargar una tarea y cargar una nueva si hay más
tareas que CPUs. Cuando la tarea actual se ha ejecutado una cantidad suficiente de tiempo, la CPU detiene la tarea
para que otra pueda ejecutarse. Esto se llama multitarea preferente. Multitarea significa que la computadora realiza
varias tareas a la vez, preferente significa que el kernel decide cuándo cambia el enfoque entre las tareas. Con las
tareas de conmutación rápida, parece que el equipo está haciendo muchas cosas a la vez. Cada aplicación puede
pensar que tiene un bloque grande de memoria en el sistema, pero es el kernel que mantiene esta ilusión,
reasignando bloques más pequeños de memoria, intercambiando bloques de memoria con otras aplicaciones, o
incluso sacando al disco bloques que aún no se hayan tocado.
Cuando el equipo arranca, carga un pequeño trozo de código llamado gestor de arranque. El gestor de arranque
debe cargar el kernel y arrancarlo. Si estás más familiarizado con sistemas operativos como Microsoft Windows y
Apple OS X, probablemente nunca ves al gestor de arranque, pero en el ambiente de UNIX es generalmente visible
por lo que puedes modificar la manera en la que tu equipo arranque.
Página 2 de 265
El gestor de arranque carga el kernel de Linux y luego transfiere el control. Linux continúa con el funcionamiento
de los programas necesarios para hacer que el equipo sea útil, tales como conexión a la red o abrir un servidor web.
Cuando nosotros, como usuarios, pensamos en aplicaciones, tendemos a pensar en los procesadores de texto,
navegadores web y clientes de correo electrónico. Al kernel no le importa si se está ejecutando algo orientado al
usuario, es un servicio de red que se comunique con un equipo remoto, o una tarea interna. Por lo tanto, de esto
obtenemos una abstracción llamada proceso. Un proceso es solamente una tarea que está cargada y rastreada por el
kernel. Una aplicación puede necesitar incluso múltiples procesos para funcionar, por lo que el kernel se encarga
de ejecutar los procesos, los arranca y para según lo requerido, y entrega los recursos del sistema.
Los proyectos de software toman la forma de código fuente, que es un conjunto de instrucciones de computo
legibles para el humano. El código fuente puede escribirse en cualquiera de los cientos de lenguajes diferentes,
Linux ha sido escrito solamente en C, que es un lenguaje que comparte historia con el UNIX original.
El código fuente no se entiende directamente por el equipo, por lo que debe ser compilado en instrucciones de
máquina por un compilador. El compilador reúne todos los archivos fuente y genera algo que se puede ejecutar en
el equipo, como el kernel de Linux.
Históricamente, la mayor parte del software se ha publicado bajo una licencia de código cerrado, lo que significa
que obtienes el derecho a utilizar el código de máquina, pero no puedes ver el código fuente. ¡A menudo la licencia
dice específicamente, que no se intente revertir el código máquina al código de fuente para averiguar lo que hace!
El Código Abierto toma una vista centrada en la fuente del software. La filosofía de código abierto es que tienes
derecho a obtener el software y modificarlo para tu propio uso. Linux adoptó esta filosofía con gran éxito. La gente
tomó la fuente, hizo cambios y lo compartió con el resto del grupo.
Junto a ésto, fue el proyecto GNU (GNU, no UNIX). Mientras que GNU estaba construyendo su propio sistema
operativo, eran mucho más eficaces en la creación de las herramientas que están de acuerdo con el sistema
operativo UNIX, como los compiladores y las interfaces de usuario. La fuente era completamente gratuita, así que
Página 3 de 265
Linux pudo enfocar sus herramientas y proporcionar un sistema completo. Como tal, la mayoría de las
herramientas que forman parte del sistema Linux provienen de estas herramientas GNU.
Hay muchas diversas variantes en código abierto, y los veremos en un capítulo posterior. Todos coinciden en que
debes tener acceso al código fuente, pero difieren en cómo puedes, o en algunos casos, cómo debes redistribuir los
cambios.
Como en UNIX, hay muchos sabores diferentes de distribuciones. En estos días, hay distribuciones que se centran
en el funcionamiento en servidores, computadoras de escritorio (desktop) o incluso herramientas específicas de la
industria como el diseño de la electrónica o la computación estadística. Los principales actores en el mercado se
remontan a Red Hat o Debian. La diferencia más visible es el administrador de paquetes, aunque encontrarás otras
diferencias en todo, desde ubicaciones de archivos a filosofías de políticas.
Red Hat empezó como una simple distribución que introdujo el Administrador de Paquetes Red Hat (RPM- Red
Hat Package Manager). El desarrollador eventualmente formó una compañía alrededor de éste, que intentó
comercializar una computadora de escritorio Linux para negocios. Con el tiempo, Red Hat comenzó a centrarse
más en las aplicaciones de servidor web y servicios de archivos, y lanzó Red Hat Enterprise Linux, que era un
servicio de pago en un ciclo de liberación largo. El ciclo de liberación dicta con qué frecuencia se actualiza el
software. Una empresa puede valorar la estabilidad y quiere ciclos de liberación largos, un aficionado o un
principiante puede querer un software más reciente y optar por un ciclo de liberación más corto. Para cumplir con
este último grupo, Red Hat patrocina el Proyecto Fedora que hace que el escritorio personal contenga el software
más reciente, pero aun construido sobre los mismos principios como la versión para empresas.
Porque todo en Red Hat Enterprise Linux es de código abierto, un proyecto llamado CentOS llegó a ser el que
volvió a compilar todos los paquetes RHEL y los proporcionó gratis. CentOS y otros proyectos similares (como
Scientific Linux) son en gran parte compatibles con RHEL e integran algún software más reciente, pero no ofrecen
el soporte pagado que Red Hat si ofrece.
Scientific Linux es un ejemplo de una distribución de uso específico basada en Red Hat. El proyecto viene
patrocinado por Fermilab siendo una distribución diseñada para habilitar la computación científica. Entre sus
muchas aplicaciones, Scientific Linux se utiliza con aceleradores de partículas como el Gran Colisionador de
Hadrones en el CERN.
Open SUSE, originalmente derivado de Slackware, aun incorpora muchos aspectos de Red Hat. La compañía
original fue comprada por Novell en el año 2003, que entonces fue adquirida por el Grupo Attachmate en 2011. El
grupo Attachmate luego se fusionó con Micro Focus Internacional. A través de todas las fusiones y adquisiciones
SUSE ha logrado continuar y crecer. Mientras que Open SUSE se basa en escritorio y es disponible al público en
general, SUSE Linux Enterprise contiene código propietario y se vende como un producto de servidor.
Página 4 de 265
Debian es más bien un esfuerzo de la comunidad y como tal, también promueve el uso de software de código
abierto y la adherencia a estándares. Debian desarrolló su propio sistema de administración de paquetes basado en
el formato del archivo .deb. Mientras que Red Hat deja sin soporte las plataformas Intel y AMD para proyectos
derivados, Debian es compatible con muchas de estas plataformas directamente.
Ubuntu es la distribución derivada de Debian más popular. Es la creación de Canonical, una empresa que apoyó
el crecimiento de Ubuntu ganando dinero proporcionando soporte.
Linux Mint se inició como una bifurcación de Ubuntu Linux mientras sigue dependiendo sobre los repositorios
de Ubuntu. Existen varias versiones, todas libres de costo, pero algunas incluyen códigos propietarios que no
pueden ser distribuidos sin restricciones de la licencia en algunos países. Linux Mint está suplantando rápidamente
Ubuntu como solución de Linux escritorio más popular del mundo.
Hemos tratado el tema de las distribuciones mencionadas específicamente en los objetivos de Linux Essentials.
Debes saber que hay cientos, y hasta miles más que están disponibles. Es importante entender que si bien hay
muchas diferentes distribuciones de Linux, muchos de los programas y comandos siguen siendo los mismos o muy
similares.
Cuando tomas en cuenta un comando utilizando esta definición, en realidad estás tomando en cuenta lo que sucede
al ejecutar un comando. Cuando se escribe un comando, el sistema operativo ejecuta un proceso que puede leer una
entrada, manipular datos y producir la salida. Desde esta perspectiva, un comando ejecuta un proceso en el sistema
operativo, y entonces la computadora realiza un trabajo.
Sin embargo, un comando se puede ver desde una perspectiva diferente: desde su origen. La fuente es desde donde
el comando "proviene" y hay varios orígenes diferentes de comandos dentro de shell de la CLI:
• Comandos integrados en el shell: Un buen ejemplo es el comando cd ya que es parte del bash shell.
Cuando un usuario escribe el comando cd, el bash shell ya se está ejecutando y sabe cómo interpretar ese
comando, sin requerir de ningún programa adicional para iniciarse.
• Comandos que se almacenan en archivos que son buscados por el shell: Si escribes un comando ls,
entonces shell busca en los directorios que aparecen en la variable RUTA DE ACCESO (PATH) para tratar
de encontrar un archivo llamado ls que puede ejecutar. Estos comandos se pueden ejecutar también
escribiendo la ruta de acceso completa del comando.
• Alias: Un alias puede reemplazar un comando integrado, la función o un comando que se encuentra en un
archivo. Los alias pueden ser útiles para la creación de nuevos comandos de funciones y comandos
existentes.
• Funciones: Las funciones también pueden ser construidas usando los comandos existentes o crear nuevos
comandos, reemplazar los comandos integrados en el shell o comandos almacenados en archivos. Los alias
y las funciones normalmente se cargan desde los archivos de inicialización cuando se inicia el shell por
primera vez, que veremos más adelante.
Para considerar
Página 5 de 265
Aunque los alias serán tratados en detalle en una sección posterior, este ejemplo breve puede ser útil para entender
el concepto de comandos.
Un alias es esencialmente un apodo para otro comando o una serie de comandos. Por ejemplo, el comando de cal
2014 muestra el calendario para el año 2014. Supongamos que acabes ejecutando este comando a menudo. En
lugar de ejecutar el comando completo cada vez, puedes crear un alias llamado mycal y ejecutar el alias como se
muestra en el siguiente gráfico:
Página 6 de 265
1.2.5 Plataformas de Hardware
Linux comenzó como algo que sólo funcionaría en un equipo como Linus': un 386 con un controlador de disco
duro específico. El rango de soporte creció gracias a que se empezó a implementar soporte para otros hardware.
Finalmente, Linux comenzó a apoyar a otros chips, incluido el hardware que se hizo para ejecutar sistemas
operativos competitivos!
Los tipos de hardware crecieron desde el simple chip de Intel hasta supercomputadores. Más tarde se desarrollaron
chips de menor tamaño compatibles con Linux pensados para que quepan en dispositivos de consumo, llamados
dispositivos integrados. El soporte para Linux se hizo omnipresente de tal manera que a menudo es más fácil
construir hardware para soportar Linux y usar Linux como un trampolín para su software personalizado, que
construir el hardware y el software personalizados desde cero.
Finalmente, teléfonos celulares y tabletas empezaron a funcionar con Linux. Una empresa, más tarde comprada por
Google, salió con la plataforma Android que es un paquete de Linux y el software necesario para ejecutarse un
teléfono o una tableta. Esto significa que el esfuerzo para introducir un teléfono al mercado es significativamente
Página 7 de 265
menor, y las empresas pueden pasar su tiempo innovando el software orientado al usuario en lugar de reinventar la
rueda cada vez. Android es ahora uno de los líderes del mercado en el espacio.
Además de teléfonos y tabletas, muchos dispositivos de consumo llevan Linux. Los enrutadores inalámbricos
normalmente funcionan con Linux porque tiene un gran conjunto de características de red. El TiVo es un grabador
de vídeo digital para el consumidor basado en Linux. A pesar de que estos dispositivos tienen Linux en el kernel,
los usuarios finales no tiene que saberlo. El software a la medida interactúa con el usuario y Linux proporciona una
plataforma estable.
La pregunta más importante para determinar la configuración de una máquina es "¿Qué hará esta máquina?" Si
necesitas ejecutar un software especializado que sólo se ejecuta en Oracle Solaris, entonce eso es lo que
necesitarás. Si necesitas leer y escribir documentos de Microsoft Office, entonces necesitarás Windows o algo
capaz de ejecutar OpenOffice o LibreOffice.
Los servidores generalmente están en un rack y comparten un teclado y un monitor con muchos otros equipos, ya
que el acceso de la consola sólo se utiliza para configurar y solucionar problemas en el servidor. El servidor se
ejecutará en modo no gráfico, que libera recursos para el propósito real de la computadora. Un equipo de escritorio
ejecutará principalmente una GUI.
A continuación, debes determinar las funciones de la máquina. ¿Existe software específico que necesita para
funcionar, o funciones específicas que debe hacer? ¿Quieres manejar cientos o miles de estas máquinas al mismo
tiempo? ¿Cuál es el conjunto de habilidades del equipo que administra la máquina y del software?
También debes determinar la vida útil y la tolerancia de riesgo del servidor. Los sistemas operativos y
actualizaciones de software vienen sobre una base periódica, llamada el ciclo de liberación. Los proveedores de
software sólo darán soporte a las versiones anteriores del software durante un tiempo antes de que ya no ofrezcan
las actualizaciones, lo que se llama ciclo de mantenimiento (o ciclo de vida). Por ejemplo, las versiones principales
de Fedora Linux salen aproximadamente cada 6 meses. El Fin de vida (EOL- End of Life) de las versiones se
considera después de 2 versiones principales más un mes, por lo que tienes entre 7 y 13 meses después de instalar
Fedora antes que necesites actualizaciones. Compara esto con la variante del servidor comercial, Red Hat
Enterprise Linux, y puedes utilizarla hasta 13 años sin la necesidad de actualizar.
Página 8 de 265
Los ciclos de mantenimiento y liberación son importantes porque en un entorno de servidor empresarial las
actualizaciones importantes del servidor requieren mucho tiempo y por lo tanto se hacen raramente. En cambio, el
propio servidor se reemplaza cuando hay actualizaciones importantes o reemplazos de las aplicaciones que
requieren actualización del sistema operativo. Del mismo modo, un ciclo de liberación lento es importante porque
las aplicaciones a menudo se enfocan en la versión actual del sistema operativo y querrás evitar la sobrecarga de
las constantes actualizaciones para mantenerse al día en los servidores y sistemas operativos. Hay una gran
cantidad de trabajo involucrada en la actualización de un servidor, y la función del servidor tiene a menudo muchas
personalizaciones que dificultan el portar a un nuevo servidor. Esto requiere mucho más pruebas que si sólo se
haya actualizado una aplicación.
Si te dedicas al desarrollo de software o al trabajo tradicional de escritorio, a menudo querrás tener el software más
reciente. El software más reciente tiene mejoras en funcionalidad y aspecto que contribuyen a que el uso del equipo
sea más agradable. Un escritorio frecuentemente guarda su trabajo en un servidor remoto, por lo que el escritorio se
puede limpiar e instalar el sistema operativo más reciente con poca interrupción.
Las versiones de software individuales se pueden caracterizar por ser beta o estables. Una de las ventajas de ser un
desarrollador de código abierto es que puedes liberar tu nuevo software y rápidamente obtener retroalimentación de
los usuarios. Si una versión de software está en una etapa de muchas funciones nuevas que no han sido
rigurosamente probados por lo general se denomina beta. Después de que tales funciones hayan sido probadas en el
campo el software se mueve a un punto estable. Si necesitas las últimas funciones, buscarás una distribución que
tiene un ciclo de liberación corto y el software beta es de fácil uso. Cuando se trate de un servidor querrás un
software estable a menos que las nuevas funciones sean necesarias y no te importe ejecutar código que no haya
sido completamente probado.
Otro concepto ligeramente relacionado es la compatibilidad con versiones anteriores. Esto se refiere a la capacidad
de un sistema operativo más reciente de ser compatible con el software creado para las versiones anteriores. Esto es
generalmente una preocupación si necesitas actualizar tu sistema operativo, pero no estás en condiciones de
actualizar el software de la aplicación.
Por supuesto, el costo siempre es un factor. Linux en sí podría ser gratuito, pero tendrías que pagar por soporte
dependiendo de las opciones que elijas. Microsoft tiene costo de licencia de servidor y podría aplicar los gastos
adicionales de soporte durante la vigencia del servidor. El sistema operativo que hayas elegido puede que sólo se
ejecute en un hardware en particular, lo que también afecta el costo.
En el mundo de los servidores existe Windows Server. Actualmente hay (hasta la fecha de este texto) la versión
2012 para indicar la fecha de lanzamiento. El servidor ejecuta una GUI, pero en gran parte como una respuesta
competitiva a Linux. Ha hecho progresos sorprendentes en la línea de comandos con capacidades de scripting a
través de PowerShell. También puedes hacer que el servidor parezca una computadora de sobremesa con un
paquete de experiencia de escritorio opcional.
Página 9 de 265
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
Cada uno de ellos se ejecuta en el hardware de sus respectivos creadores. El hardware es generalmente grande y
potente, que ofrece características tales como CPU y memoria o integración de intercambio con sistemas de legado
mainframe también ofrecidos por el proveedor.
A menos que el software requiera un hardware específico o las necesidades de la aplicación requieran de la
redundancia en el hardware, muchas personas tienden a elegir estas opciones porque ya son usuarios de productos
de la compañía. Por ejemplo, IBM AIX ejecuta en una amplia variedad de hardware de IBM y puede compartir el
hardware con mainframes. Por lo tanto, encontrarás AIX en empresas que ya tienen una larga tradición de uso de
IBM o que hacen uso de software de IBM software como el WebSphere.
Página 10 de 265
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:
• "sid" está sujeta a cambios masivos y actualizaciones de librerías (biblioteca). Esto puede resultar en un
sistema muy "inestable" que contiene paquetes que no se pueden instalar debido a la falta de librerías,
dependencias que no se pueden satisfacer, etc. Usar bajo el propio riesgo!
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.
Página 11 de 265
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.
Página 12 de 265
NDG Linux Essentials Spanish - Capítulo 2: Aplicaciones de
código abierto y Licencias
2.1 Introducción
En este capítulo vamos a conocer varias herramientas y aplicaciones de código abierto. También vamos a hablar
del software y concesión de licencias de código abierto.
Página 13 de 265
¿Lo sabía? ¡Todas estas compañías ejecutan sobre Linux!
Una ventaja de esto es que se pueden simular casi todos los aspectos de un entorno de producción, desde el
desarrollo a las pruebas y hasta la verificación en un hardware reducido, lo cual ahorra costos y tiempo. Como
estudiante de Linux puedes ejecutar las mismas aplicaciones de servidor en tu escritorio o un servidor virtual no
muy costoso que funciona a través de un gran proveedor de servicios de Internet. Por supuesto no vas a poder
manejar el mismo volumen que un proveedor de servicios grande, ya que éste posee un hardware mucho más caro.
Sin embargo, vas a poder simular casi cualquier configuración sin necesidad de un hardware muy potente o un
servidor de licencias para el servidor.
• Software de servidor – software que no tiene ninguna interacción directa con el monitor y el teclado de la
máquina en la que se ejecuta. Su propósito es servir de información a otras computadoras llamados clientes.
A veces el software de servidor puede no interactuar con otros equipos, sin embrago, va a estar ahí sentado
y "procesando" datos.
• Software de escritorio – un navegador web, editor de texto, reproductor de música u otro software con el
que tú interactúas. En muchos casos, como un navegador web, el software consultará a un servidor en el
otro extremo e interpretará los datos para ti. Aquí, el software de escritorio es el cliente.
• Herramientas – una categoría adicional de software que existe para que sea más fácil gestionar el sistema.
Puedes tener una herramienta que te ayude a configurar la pantalla o algo que proporcione un shell de
Linux o incluso herramientas más sofisticadas que convierten el código fuente en algo que la computadora
pueda ejecutar.
Adicionalmente, vamos a ver las aplicaciones móviles, principalmente para el beneficio del examen LPI. Una
aplicación móvil es muy parecida a una aplicación de escritorio pero se ejecuta en un teléfono o una tableta en
lugar de una maquina de escritorio.
Cualquier tarea que quieras hacer en Linux probablemente pueda ser acomodada por cualquier número de
aplicaciones. Hay muchos navegadores, muchos servidores web y muchos editores de texto (los beneficios de cada
uno son objeto de muchas guerras santas de UNIX). Esto no es diferente que el mundo de código cerrado. Sin
embargo, una ventaja del código abierto es que si a alguien no le gusta la manera en la que funciona su servidor
web, puede empezar a construir su propio. Una cosa que aprenderás mientras vayas progresando con Linux es
cómo evaluar el software. A veces querrás ir con el líder de la manada y otras querrás conocer la última vanguardia
de la tecnología.
Página 14 de 265
2.2.1 Aplicaciones de Servidor
Linux destaca en la ejecución de aplicaciones de servidor gracias a su confiabilidad y eficiencia. Cuando queremos
hablar de un software de servidor la pregunta más importante es "¿Qué tipo de servicio estoy ejecutando?" ¡Si
quieres proporcionar un servicio de páginas web necesitas un software de servidor web, no un servidor de correo!
Uno de los primeros usos de Linux era para servidores web. Un servidor web aloja contenido para páginas web a
las que ve el explorador web mediante el Protocolo de transferencia de hipertexto (HTTP - Hypertext Transfer
Protocol) o su forma cifrada HTTPS. La propia página web puede ser estática, lo que significa que cuando el
navegador solicita una página, el servidor web envía sólo el archivo tal y como aparece en el disco. El servidor
también puede proporcionar un contenido dinámico, esto es, el servidor web envía la solicitud a una aplicación que
genera el contenido. WordPress es un ejemplo popular. Los usuarios pueden desarrollar contenidos a través de su
navegador en la aplicación de WordPress y el software lo convierte en un sitio web completamente funcional.
Cada vez que realizas compras en línea estás viendo un sitio dinámico.
Hoy en día, Apache es el servidor web dominante. Apache fue originalmente un proyecto independiente, pero el
grupo ha formado la Apache Software Foundation y mantiene más de cien proyectos de software de código
abierto.
Otro servidor web es nginx con su base en Rusia. Se centra en el rendimiento haciendo uso de kernels UNIX más
modernos y solo se puede hacer un subconjunto de lo que Apache puede hacer. Más de un 65% de los sitios web
funcionan mediante Apache o nginx.
El correo electrónico (e-mail) siempre ha sido un uso popular para servidores Linux. Cuando se habla de servidores
de correo electrónico siempre es útil considerar las 3 funciones diferentes para recibir correo electrónico entre
personas:
• Agente de transferencia de correo (MTA- Mail Transfer Agent) – decide qué servidor debe recibir el
correo electrónico y utiliza el Protocolo simple de transferencia de correo (SMTP- Simple Mail
Transfer Protocol) para mover el correo electrónico hacia tal servidor. No es inusual que un correo
electrónico tome varios "saltos" para llegar a su destino final, ya que una organización puede tener varios
MTAs.
• Agente de entrega de correo (MDA- Mail Delivery Agent, también llamado el Agente de entrega local)
se encarga de almacenar el correo electrónico en el buzón del usuario. Generalmente se invoca desde el
MTA al final de la cadena.
• Servidor POP/IMAP – (Post Office Protocol e Internet Message Access Protocol) son dos protocolos
de comunicación que permiten a un cliente de correo funcionando en tu computadora actuar con un servidor
remoto para recoger el correo electrónico.
A veces un software implementará varios componentes. En el mundo de código cerrado, Microsoft Exchange
implementa todos los componentes, por lo que no hay ninguna opción para hacer selecciones individuales. En el
mundo del código abierto hay muchas opciones. Algunos servidores POP/IMAP implementan su propio formato de
base de datos de correo para el rendimiento, por lo que también incluirá el MDA si se requiere una base de datos
personalizada. Las personas que utilizan formatos de archivo estándar (como todos los correos en un archivo)
pueden elegir cualquier MDA.
El MTA más conocido es sendmail. Postfix es otro MDA popular y pretende ser más simple y más seguro que
sendmail.
Página 15 de 265
Si utilizas formatos de archivo estándar para guardar mensajes de correo electrónico, tu MTA también puede
entregar el correo. Como alternativa, puedes usar algo como procmail que te permite definir filtros personalizados
para procesar el correo y filtrarlo.
Dovecot es un servidor POP/IMAP popular gracias a su facilidad de uso y bajo mantenimiento. Cyrus IMAP es
otra opción.
Para compartir archivos, Samba es el ganador sin duda. Samba permite que una máquina Linux se parezca a una
máquina Windows para que pueda compartir archivos y participar en un dominio de Windows. Samba implementa
los componentes del servidor, tales como archivos disponibles para compartir y ciertas funciones de servidor de
Windows, así como el cliente para que una máquina de Linux puede consumir un recurso compartido de archivos
de Windows.
Si tiene máquinas Apple en la red, el proyecto Netatalk permite que tu máquina Linux se comporte como un
servidor de archivos de Apple.
El protocolo para compartir el archivo nativo para UNIX se llama Sistema de Archivos de Red (NFS-Network
File System). NFS es generalmente parte del kernel lo que significa que un sistema de archivos remoto puede
montarse como un disco regular, haciendo el acceso al archivo transparente para otras aplicaciones.
Al crecer tu red de computadoras, necesitarás implementar algún tipo de directorio. El directorio más antiguo se
llama Sistema de nombres de dominio y se utiliza para convertir un nombre como http://www.linux.com a una
dirección IP como 192.168.100.100 lo que es un identificador único de ese equipo en Internet. DNS contiene
también información global como la dirección de la MTA para un nombre de dominio proporcionado. Una
organización puede ejecutar su propio servidor DNS para alojar sus nombres públicos y también para servir como
un directorio interno de servicios. El Consorcio de Software de Internet (Internet Software Consortium), mantiene
el servidor DNS más popular, llamado simplemente bind, esto tras el nombre del proceso que ejecuta el servicio.
El DNS se centra en gran parte en nombres de equipos y direcciones IP y no es fácilmente accesible. Han surgido
otros directorios para almacenar información distinta tales como cuentas de usuario y roles de seguridad. El
Protocolo ligero de acceso a directorios (LDAP- Lightweight Directory Access Protocol) es el directorio más
común que alimenta también el Active Directory de Microsoft. En el LDAP, un objeto se almacena en una forma
de árbol (ramificada), y la posición de tal objeto en el árbol se puede utilizar para obtener información sobre el
objeto, además de lo que se almacena en el objeto en sí. Por ejemplo, un administrador de Linux puede
almacenarse en una rama del árbol llamado "Departamento TI", que está debajo de una rama llamada
"Operaciones". Así uno puede encontrar personal técnico buscando bajo la rama del Departamento TI. OpenLDAP
es aquí el jugador dominante.
Una última pieza de la infraestructura de red se denomina el Protocolo de configuración dinámica de Host
(DHCP- Dynamic Host Configuration Protocol). Cuando un equipo arranca, necesita una dirección IP para la
red local por lo que puede identificarse de manera unica. El trabajo de DHCP sirve para identificar las solicitudes y
asignar una dirección disponible del grupo DHCP. La entidad Internet Software Consortium también mantiene el
servidor ISC DHCP que es el jugador más común.
Una base de datos almacena la información y también permite una recuperación y consulta fáciles. Las bases de
datos más populares son MySQL y PostgreSQL. En la base de datos podrías ingresar datos de venta totales y
luego usar un lenguaje llamado Lenguaje de consulta estructurado (SQL- Structured Query Language) para
agregar ventas por producto y fecha con el fin de producir un informe.
Página 16 de 265
2.2.2 Aplicaciones de Escritorio
El ecosistema de Linux tiene una amplia variedad de aplicaciones de escritorio. Puedes encontrar juegos,
aplicaciones de productividad, herramientas creativas y mucho más. Esta sección es un mero estudio de lo que
existe centrándose en lo que LPI considera más importante.
Antes de considerar las aplicaciones individuales, es útil conocer el entorno de escritorio. Un escritorio de Linux
ejecuta un sistema llamado X Window, también conocido como X11. Un servidor Linux X11 es un X.org que
hace que el software opere en un modo gráfico y acepte la entrada de un teclado y un ratón. Otro software controla
a las ventanas y a los iconos, y se llama administrador de ventanas o entorno de escritorio. El administrador de
ventanas es una versión más simple del entorno de escritorio, ya que sólo proporciona el código para dibujar menús
y gestionar las ventanas de las aplicaciones en la pantalla. Los niveles de funciones en el entorno de escritorio
como ventanas de inicio, sesiones, administrador de archivos y otras utilidades. En resumen, una estación de
trabajo Linux de sólo texto se convierte en un escritorio gráfico con la adición de X-Windows y un entorno de
escritorio o un administrador de ventanas.
Los administradores de ventanas incluyen: Compiz, FVWM y Enlightenment, aunque hay muchos más. Los
entornos de escritorio principalmente son KDE y GNOME, los cuales tienen sus propios administradores de
ventanas. KDE y GNOME son proyectos maduros con una cantidad increíble de utilidades construidas, y la
elección es a menudo una cuestión de preferencia personal.
Las aplicaciones de productividad básicas, tales como un procesador de textos, hoja de cálculo y paquete de
presentación son muy importantes. Conocidos como la suite ofimática (de oficina), en gran parte debido a
Microsoft Office el jugador dominante en el mercado.
OpenOffice (a veces llamado OpenOffice.org) y LibreOffice ofrecen una suite ofimática (de oficina) completa,
incluyendo una herramienta de dibujo que busca la compatibilidad con Microsoft Office, tanto en términos de
características como en formatos de archivo. Estos dos proyectos también sirven de gran ejemplo de cómo influir
en política de código abierto.
En 1999 Sun Microsystems adquirió una compañía alemana relativamente desconocida que estaba haciendo una
suite ofimática (de oficina) para Linux llamada StarOffice. Pronto después de eso, Sun cambio la marca a
OpenOffice y la había liberado bajo una licencia de código abierto. Para complicar más las cosas, StarOffice
seguía siendo un producto propietario que se separó de OpenOffice. En 2010 Sun fue adquirido por Oracle, que
más tarde entregó el proyecto a la fundación Apache.
Oracle ha tenido una historia pobre de soporte a los proyectos de código abierto que va adquiriendo, así pues
pronto después de la adquisición por parte de Oracle el proyecto se bifurcó para convertirse en LibreOffice. En ese
momento se crearon dos grupos de personas desarrollando la misma pieza de software. La mayor parte del impulso
fue al proyecto LibreOffice, razón por la cual se incluye por defecto en muchas distribuciones de Linux.
Para navegar por la web, los dos principales contendientes son Firefox y Google Chrome. Ambos son
navegadores rápidos de código abierto, ricos en funciones y tienen un soporte excelente para desarrolladores web.
Estos dos paquetes son un buen ejemplo de cómo la diversidad es buena para el código abierto – mejoras de uno
dan estímulo al otro equipo para tratar de mejorar al otro. Como resultado, Internet tiene dos navegadores
excelentes que empujan los límites de lo que se puede hacer en la web y el trabajo a través de una variedad de
plataformas.
Página 17 de 265
El proyecto Mozilla ha salido también con Thunderbird, un cliente integral de correo electrónico de escritorio.
Thunderbird se conecta a un servidor POP o IMAP, muestra el correo electrónico localmente y envía el correo
electrónico a través de un servidor SMTP externo.
Otros clientes de correo electrónico notables son Evolution y KMail que son clientes de correo electrónico de los
proyectos GNOME y KDE. Los formatos de estandarización a través de POP, IMAP y correo electrónico local
significa que es fácil cambiar entre clientes de correo electrónico sin perder datos. El correo electrónico basado en
web también es otra opción.
Para los tipos creativos existen Blender, GIMP y Audacity que controlan la creación de películas 3D,
manipulación de imágenes 2D y edición de audio respectivamente. Han tenido diversos grados de éxito en los
mercados profesionales. Blender se utiliza para todo, desde películas independientes hasta películas de Hollywood,
por ejemplo.
En el nivel básico, interactúan con un sistema Linux a través de un shell sin importar si te conectas al sistema de
forma remota o desde un teclado. El trabajo de shell consiste en aceptar los comandos, como manipulación de
archivos y aplicaciones de inicio y pasarlos al kernel de Linux para su ejecución. A continuación se muestra una
interacción típica con la shell de Linux:
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
El usuario recibe un mensaje, que normalmente termina en un signo de dólar $ para indicar una cuenta sin
privilegios. Cualquier cosa antes del símbolo, en este caso sysadmin@localhost:~, es un indicador configurable
que proporciona información extra al usuario. En la imagen anterior, sysadmin es el nombre del usuario actual,
localhost es el nombre del servidor, y ~ es el directorio actual (en UNIX, el símbolo de tilde es una forma corta
para el directorio home del usuario). Los comandos de Linux los trataremos con más detalle más adelante, pero
para terminar la explicación, el primer comando muestra los archivos con el comando ls, recibe información sobre
el archivo y luego elimina ese archivo con el comando rm.
El shell de Linux proporciona un rico lenguaje para iterar sobre los archivos y personalizar el entorno, todo sin salir
del shell. Por ejemplo, es posible escribir una sola línea de comando que encuentra archivos con un contenido que
corresponda a un cierto patrón, extrae la información del archivo, y luego copia la nueva información en un archivo
nuevo.
Linux ofrece una variedad de shells para elegir, en su mayoría difieren en cómo y qué se puede modificar para
requisitos particulares y la sintaxis del lenguaje “script” incorporado. Las dos familias principales son Bourne
shell y C shell. Bourne shell recibió su nombre de su creador y C shell porque la sintaxis viene prestada del
lenguaje C. Como ambos de estos shells fueron inventados en la década de 1970 existen versiones más modernas,
Página 18 de 265
el Bourne Again Shell (Bash) y tcsh (tee-cee-shell). Bash es el shell por defecto en la mayoría de los sistemas,
aunque casi puedes estar seguro de que tcsh es disponible si lo prefieres.
Otras personas tomaron sus características favoritas de Bash y tcsh y han creado otros shells, como el Korn shell
(ksh) y zsh. La elección de los shells es sobre todo personal. Si estás cómodo con Bash entonces puedes operar
eficazmente en la mayoría de los sistemas Linux. Después de eso puedes buscar otras vías y probar nuevos shells
para ver si ayudan a tu productividad.
Aún más dividida que la selección de los shells son las alternativas de los editores de texto. Un editor de texto se
utiliza en la consola para editar archivos de configuración. Los dos campos principales son vi (o vim más
moderno) y emacs. Ambos son herramientas extraordinariamente poderosas para editar archivos de texto, que se
diferencian en el formato de los comandos y manera de escribir plugins para ellos. Los plugins podrían ser
cualquier cosa desde el resaltado de sintaxis de proyectos de software hasta los calendarios integrados.
Ambos vim y emacs son complejos y tienen una curva de aprendizaje extensa. Esto no es útil si lo que necesitas es
editar un pequeño archivo de texto simple. Por lo tanto pico y nano están disponibles en la mayoría de los sistemas
(el último es un derivado del anterior) y ofrecen edición de texto muy básica.
Incluso si decides no usar vi, debes esforzarte a ganar cierta familiaridad básica porque el vi básico está en todos
los sistemas Linux. Si vas a restaurar un sistema Linux dañado ejecutando el modo de recuperación de la
distribución, seguramente tendrás un vi disponible.
Si tienes un sistema Linux necesitarás agregar, quitar y actualizar el software. En cierto momento esto significaba
descargar el código fuente, configurarlo, construirlo y copiar los archivos en cada sistema. Afortunadamente, las
distribuciones crearon paquetes, es decir copias comprimidas de la aplicación. Un administrador de paquetes se
encarga de hacer el seguimiento de que archivos que pertenecen a que paquete, y aun descargando las
actualizaciones desde un servidor remoto llamado repositorio. En los sistemas Debian las herramientas incluyen
dpkg, apt-get y apt-cache. En los sistemas derivados de Red Hat utilizas rpm y yum. Veremos más de los
paquetes más adelante.
Los lenguajes informáticos proporcionan una manera para que un programador ingrese instrucciones en un formato
más legible por el ser humano y que tales instrucciones sean eventualmente traducidas en algo que la computadora
entiende. Los lenguajes pertenecen a uno de los dos campos: interpretado o compilado. Un lenguaje interpretado
traduce el código escrito en código de computación mientras se ejecuta el programa, y el lenguaje compilado se
traduce todo a la vez.
Linux fue escrito en un lenguaje compilado llamado C. El beneficio principal del lenguaje C es que el lenguaje en
sí es similar a al código de máquina generado, por lo que un programador experto puede escribir un código que sea
pequeño y eficiente. Cuando la memoria del equipo se medía en Kilobytes, esto era muy importante. Hoy, incluso
con tamaños de memoria de gran capacidad, el C sigue siendo útil para escribir código que debe ejecutarse
rápidamente, como un sistema operativo.
Página 19 de 265
El C se ha ampliado durante los años. Existe el C++ que añade soporte de objetos al C (un estilo diferente de
programación) y Objective C que tomó otro rumbo y se usa mucho en productos de Apple.
El lenguaje Java toma un rumbo diferente del enfoque compilado. En lugar de compilar al código máquina, Java
primero imagina un hipotético CPU llamado la Máquina Virtual de Java (JVM-Java Virtual Machine) y compila
todo el código para ésta. Cada equipo host entonces corre el software JVM para traducir las instrucciones de JVM
(llamadas bytecode) en instrucciones nativas.
La traducción adicional con Java podría hacer pensar que sería lento. Sin embargo, la JVM es bastante simple, por
lo que se puede implementar de manera rápida y confiable en cualquier cosa, desde un equipo potente hasta un
dispositivo de baja potencia que se conecta a un televisor. ¡Un archivo compilado de Java también se puede
ejecutar en cualquier equipo implementando la JVM!
Otra ventaja de la compilación frente a un objetivo intermedio, es que la JVM puede proporcionar servicios a la
aplicación que normalmente no estarían disponibles en una CPU. Asignar memoria a un programa es un problema
complejo, pero esto está construido dentro de la JVM. Esto también significa que los fabricantes de la JVM pueden
enfocar sus mejoras en la JVM como un todo, así cualquier mejora está inmediatamente disponible para las
aplicaciones.
Por otra parte, los lenguajes interpretados se traducen a código máquina como se van ejecutando. La potencia extra
del equipo consumida para esta tarea a menudo puede ser recuperada por el aumento de la productividad del
programador, quien gana por no tener que dejar de trabajar para compilar. Los lenguajes interpretados también
suelen ofrecer más funciones que los lenguajes compilados, lo que significa que a menudo se necesita menos
código. ¡El intérprete del lenguaje generalmente está escrito en otro lenguaje tal como C y a veces incluso en Java!
Esto significa que un lenguaje interpretado se ejecuta en la JVM, que se traduce durante el tiempo de ejecución al
código máquina.
Perl es un lenguaje interpretado. Perl fue desarrollado originalmente para realizar la manipulación de texto. Con los
años, se ganó su lugar entre los administradores de sistemas y todavía sigue siendo mejorado y utilizado en todo,
desde la automatización hasta la construcción de aplicaciones web.
PHP es un lenguaje que fue construido originalmente para crear páginas web dinámicas. Un archivo PHP es leído
por un servidor web como Apache. Etiquetas especiales en el archivo indican que partes del código deben ser
interpretadas como instrucciones. El servidor web reúne las diferentes partes del archivo y lo envía al navegador
web. Las ventajas principales del PHP son que es fácil de aprender y está disponible en casi cualquier sistema.
Debido a esto, muchos proyectos populares se construyen en PHP. Los ejemplos notables incluyen WordPress
(blogging), cacti (para monitoreo) e incluso partes de Facebook.
Ruby es otro lenguaje que fue influenciado por Perl y Shell junto con muchos otros lenguajes. Convierte tareas de
programación complejas relativamente fáciles y con la inclusión del marco de referencia (framework) Ruby on
Rails, es una opción popular para crear aplicaciones web complejas. Ruby es también el lenguaje que potencia
muchas de las principales herramientas de automatización como Chef y Puppet, que hacen que la gestión de un
gran número de sistemas Linux sea mucho más fácil.
Python es otro lenguaje de desarrollo de uso común. Al igual que Ruby facilita las tareas complejas y tiene un
marco de referencia llamado Django que facilita la construcción de las aplicaciones web. Python tiene capacidades
de procesamiento estadístico excelente y es una de las herramientas favoritas en el mundo académico.
Un lenguaje es una herramienta que te ayuda a decirle al equipo lo que quieres hacer. Una librería empaqueta las
tareas comunes en un paquete distinto que puede ser utilizado por el desarrollador. ImageMagick es una librería o
Página 20 de 265
biblioteca que permite a los programadores manipular las imágenes en código. ImageMagick también incluye
algunas herramientas de línea de comandos que le permiten procesar las imágenes desde un shell y aprovechan las
capacidades de scripting.
OpenSSL es una librería criptográfica que se utiliza en todo, desde servidores web hasta la línea de comandos.
Proporciona un interfaz estándar para que puedas agregar criptografía en tu programa de Perl, por ejemplo.
En un nivel mucho más bajo está la librería de C. Esto proporciona un conjunto básico de funciones para leer y
escribir a los archivos y pantallas que son utilizadas por las aplicaciones y otros lenguajes por igual.
En la mayoría de los casos la propiedad intelectual del software permanece con la persona o empresa que lo creó.
Los usuarios sólo obtienen una concesión de licencia para utilizar el software. Se trata de una cuestión de derecho
de autor. La transferencia de dinero depende del modelo de negocio del creador. Es la concesión de licencias lo que
realmente distingue un software de código abierto de un software de código cerrado.
Linux pertenece a Linus Torvalds. Él ha colocado el código bajo una licencia GNU Public License versión 2
(GPLv2). Esta licencia, entre otras cosas, dice que el código fuente debe hacerse disponible a quien lo pida y que
puedes hacer cualquier cambio que desees. Una salvedad a esto es que si haces cambios y los distribuyes, debes
poner tus cambios bajo la misma licencia para que otros puedan beneficiarse. GPLv2 dice también que no puedes
cobrar por distribuir el código fuente a menos que sean tus costos reales de hacerlo (por ejemplo, copiar a medios
extraíbles).
En general, si creas algo también consigues el derecho a decidir cómo se utiliza y distribuye. Software libre y de
código abierto (FOSS- Free and Open Source Software) se refiere a un tipo de software donde este derecho ha sido
liberado y tienes el permiso de ver el código fuente y redistribuirlo. Linus Torvalds ha hecho eso con Linux,
aunque creó Linux, no te puede decir que no lo puedes utilizar en tu equipo porque liberó tal derecho a través de la
licencia GPLv2.
Página 21 de 265
La concesión de licencias de software es una cuestión política y no debería sorprendernos que haya muchas
opiniones diferentes. Las organizaciones han salido con su propia licencia que incorpora su particular punto de
vista por lo que es más fácil escoger una licencia existente que idear la tuya propia. Por ejemplo, las universidades
como el Instituto Tecnológico de Massachusetts (MIT) y la Universidad de California han sacado sus licencias, ya
que tienen proyectos como la Apache Foundation. Además, grupos como la Free Software Foundation han creado
sus propias licencias para promover su agenda.
La Free Software Foundation fue fundada en 1985 por Richard Stallman (RMS). El objetivo de la FSF es
promover el Software Libre. El software libre no se refiere al precio, sino a la libertad de compartir, estudiar y
modificar el código fuente subyacente. La visión de la FSF es que el software propietario (software distribuido
bajo una licencia de código cerrado) es malo. FSF también defiende que las licencias de software deben cumplir la
apertura de las modificaciones. Es su punto de vista, si modificas el software libre debes compartir tus cambios.
Esta filosofía específica se llama copyleft.
La FSF también lucha contra las patentes de software y actúa como un perro guardián para las organizaciones de
normativa, expresando cuando una norma propuesta pudiera violar los principios del software libre mediante la
inclusión de elementos como la Administración de derechos digitales (DRM- Digital Rights Management) que
pudieran restringir lo que podrías hacer con el servicio.
La FSF ha desarrollado su propio sistema de licencias, como la GPLv2 y GPLv3 y las versiones de licencias
Lesser2 y 3 GPL (LGPLv2 y LGPLv3). Las licencias menores (lesser) son muy similares a las licencias regulares
excepto que tienen disposiciones para enlazarlos contra un software no libre. Por ejemplo, bajo la licencia GPLv2
no puedes redistribuir el software que utiliza una librería de código cerrado (como un controlador de hardware)
pero la variante menor permite tal acción.
Los cambios entre las versiones 2 y 3 se centran en gran parte en el uso de software libre en un dispositivo con
hardware cerrado que ha sido acuñado como Tivoización. TiVo es una empresa que construye un grabador de
vídeo digital de televisión en su propio hardware y utiliza Linux como base para su software. Mientras que TiVo
había liberado el código fuente para su versión de Linux como se requiere bajo GPLv2, el hardware no ejecutaría
cualquier binario modificado. A los ojos de la FSF esto fue contra el espíritu de la GPLv2, pues añadió una
cláusula específica a la versión 3 de la licencia. Linus Torvalds está de acuerdo con TiVo en este asunto y ha
elegido quedarse con GPLv2.
La Open Source Initiative fue fundada en 1998 por Bruce Perens y Eric Raymond (ESR). Creen que el software
libre también fue políticamente acusado y que eran necesarias licencias menos extremas, particularmente alrededor
de los aspectos de copyleft de las licencias de la FSF. OSI cree que no sólo la fuente debe ser disponible
libremente, pero también cero restricciones se deben aplicar sobre el uso del software sin importar el uso previsto.
A diferencia de la FSF, OSI no tiene su propio conjunto de licencias. En cambio, la OSI tiene un conjunto de
principios y agrega otras licencias a esa lista si cumplen con tales principios, llamados licencias de código abierto.
El software que se ajusta bajo una licencia de Código Abierto es por lo tanto un Software de Código Abierto.
Algunas de las licencias de código abierto pertenecen a la familia BSD de licencias, que son mucho más simples
que la GPL. Ellos simplemente dicen que puedes redistribuir la fuente y los binarios mientras respetes los derechos
Página 22 de 265
de autor y no impliques al creador original a que apruebe tu versión. En otras palabras "haz lo que quieras con este
software, pero no digas que lo escribiste tú." La licencia MIT tiene mucho del mismo espíritu, con diferente
redacción.
Las licencias de la FSF, como la GPLv2, también son licencias de código abierto. Sin embargo, muchas licencias
de software libre como BSD y la MIT no contienen las disposiciones de copyleft y por lo tanto no son aceptables
para la FSF. Estas licencias se llaman licencias de software libre permisiva porque son permisivas en cómo puedes
redistribuir el software. Puedes tomar un software bajo la licencia BSD e incluirla en un producto de software
cerrado siempre que le des atribución adecuada.
Tales términos son convenientes, pero esconden las diferencias entre las dos escuelas de pensamiento. Por lo
menos, si utilizas software FOSS sabes que no tienes que pagar por él y puedes redistribuirlo como quieres.
Cuando se coloca un software en el dominio público, el autor abandona todos los derechos, incluyendo los
derechos de autor para la obra. En algunos países, esto es un valor predeterminado si el trabajo lo ha realizado una
agencia gubernamental. En algunos países, el trabajo con derechos de autor se convierte en dominio público
después de que el autor haya muerto y haya transcurrido un largo periodo de espera.
La organización de Creative Commons (CC) ha creado las Licencias de Creative Commons que tratan de
satisfacer las intenciones detrás de las licencias de software libre para entidades no de software. Las licencias CC
también pueden utilizarse para restringir el uso comercial si tal es el deseo del titular de los derechos de autor. Las
licencias CC son:
• Attribution (CC BY) – al igual que la licencia BSD, puedes utilizar el contenido de la CC para cualquier
uso, pero debes acreditar al titular los derechos de autor
•
• Attribution ShareAlike (CC BY-SA) – una versión copyleft de la licencia de atribución. Los trabajos
derivadas deben compartirse bajo la misma licencia, mucho como en los ideales del Software Libre
•
• Attribution No-Derivs (CC BY-ND) – puedes redistribuir el contenido bajo las mismas condiciones como
CC-BY, pero no lo puedes cambiar
•
Página 23 de 265
• Attribution-NonCommercial (CC BY-NC) – al igual que CC BY, pero no lo puedes utilizar para los fines
comerciales
•
• Attribution-NonCommercial-ShareAlike (CC-BY-NC-SA) – se basa en la licencia CC BY-NC, pero
requiere que los cambios se compartan bajo la misma licencia.
• Attribution-NonCommercial-No-Derivs (CC-BY-NC-ND) – compartes el contenido para que se utilice
con fines no comerciales, pero la gente no puede cambiar el contenido.
•
• No Rights Reservados (CC0) – esta es la versión de Creative Commons en el dominio público.
Las licencias anteriores se pueden resumir como ShareAlike o sin restricciones, o si se permite o no el uso
comercial o las derivaciones.
La forma más sencilla de ganar dinero es vender soporte o garantía para el software. Puedes ganar dinero de la
instalación del software para las personas, ayudando a la gente cuando tienen problemas o corregir errores
cobrando dinero. En realidad, eres un consultor.
También puedes cobrar por un servicio o suscripción que mejora el software. El proyecto de grabadora de vídeo
digital MythTV de fuente abierta es un excelente ejemplo. El software es gratuito, pero puedes pagar por
conectarlo a un servicio de TV para saber la hora concreta de algún programa de televisión.
Puedes empaquetar hardware o agregar un software de código cerrado extra para su venta junto con el software
libre. Los aparatos y sistemas integrados que utilizan Linux pueden ser desarrollados y vendidos. Muchos firewalls
para los consumidores y los dispositivos de entretenimiento siguen este modelo.
También puedes desarrollar un software de código abierto como parte de tu trabajo. Si creas una herramienta para
hacer tu vida más fácil en tu trabajo regular, puedes convencer a tu empleador a que te deje abrir la fuente. Puede
haber una situación en la que trabajas en un software cobrando, pero las licencias de código abierto permitirían a
que tu trabajo ayude, o incluso permita a otras personas contribuir a resolver el mismo problema.
En la década de 1990, Gerald Combs estaba trabajando en un proveedor de servicios de Internet y comenzó a
escribir su propia herramienta de análisis de red porque las herramientas similares eran muy caras en aquel
entonces. Hasta hoy, más de 600 personas han contribuido al proyecto llamado Wireshark. Ahora a menudo se
considera mejor que la oferta comercial y gracias a ello Gerald formó una empresa para dar soporte a Wireshark y
vender productos y apoyo que facilitan su uso. Más adelante la empresa la compró un importante proveedor de red
que apoya su desarrollo.
Otras compañías obtienen valor tan inmenso del software de código abierto que se consideran eficaz contratar a
personas para trabajar en el software a tiempo completo. El motor de búsqueda de Google contrató al creador del
lenguaje Python, e incluso Linus Torvalds fue contratado por la Linux Foundation para trabajar en Linux. La
compañía de teléfonos estadounidense AT&T obtiene tal valor de los proyectos de Ruby y Rails para sus Páginas
Amarillas, que tienen un empleado que no hace nada sino trabajar en estos proyectos.
Página 24 de 265
La última manera en la que la gente hace dinero indirectamente a través de código abierto, es que es una forma
abierta para calificar las habilidades propias. Una cosa es decir que realizas ciertas tareas en tu trabajo, pero
mostrar tu capacidad de creación y compartirlo con el mundo permite a los empleadores potenciales ver la calidad
de tu trabajo. Del mismo modo, las empresas se han dado cuenta que proporcionar concesiones de las partes no
críticas de su código abierto de software interno, atrae el interés de la gente de mayor calibre.
Página 25 de 265
Capítulo 3: El uso de Linux
En modo gráfico puedes tener varios shells abiertos, que resulta muy útil cuando se están realizando tareas en
múltiples equipos remotos. Incluso puedes iniciar la sesión con tu usuario y contraseña a través de una interfaz
gráfica. En la siguiente figura se muestra un ejemplo de un inicio de sesión gráfico.
Página 26 de 265
Después de iniciar la sesión pasarás al escritorio donde puedes cargar las aplicaciones. El modo no gráfico
comienza con una sesión basada en texto que se muestra a continuación. Simplemente se te pedirá tu nombre de
usuario y luego tu contraseña. Si el inicio de sesión tiene éxito pasarás directamente al shell.
En el modo no gráfico no hay ventanas para navegar. A pesar de esto tienes editores de texto, navegadores web y
clientes de correo electrónico, pero son sólo de texto. De este modo UNIX empezó antes que los entornos gráficos
fueran la norma. La mayoría de los servidores también se ejecutarán en este modo, ya que la gente no entra en ellos
directamente, lo que hace que una interfaz gráfica sea un desperdicio de recursos. Aquí hay un ejemplo de la
pantalla que se puede ver después de iniciar la sesión.
Página 27 de 265
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.
Cada escritorio de Linux es diferente, por lo que tienes que buscar en tu menú una opción llamada terminal o x-
term. Las dos son shells gráficos, diferenciadas sobre todo en aspectos más que funcionalidad. Si tienes una
herramienta de búsqueda como Ubuntu Dash, puedes buscar un terminal como se muestra aquí.
Estas herramientas te permiten buscar rápidamente en tu sistema exactamente lo que quieres ejecutar en lugar de
perderte en los menús.
La virtualización es un proceso donde un equipo físico, llamado host, ejecuta múltiples copias de un sistema
operativo, cada una llamada invitado. El host ejecuta un software llamado hipervisor que cambia el control entre
los diferentes invitados, tal como el kernel de Linux funciona para los procesos individuales.
Página 28 de 265
La virtualización funciona porque los servidores pasan la mayor parte de su tiempo inactivo y no necesitan
recursos físicos tales como un monitor y un teclado. Ahora puedes tomar una potente CPU y difundirla alrededor
de varias máquinas virtuales y mantener una distribución más equitativa entre los invitados de lo que es posible en
un sistema de Linux de puro. La principal limitación es por lo general la memoria, con los avances en la tecnología
de hipervisor y la CPU es posible poner más máquinas virtuales en un host que nunca.
En un entorno virtualizado un host puede ejecutar docenas de sistemas operativos invitados, y con el apoyo de la
CPU, los invitados no saben que se están ejecutando en una máquina virtual. Cada invitado obtiene su propia CPU,
RAM y disco virtual y se comunica con la red. Ni siquiera es necesario ejecutar el mismo sistema operativo en
todos los invitados, lo que reduce aún más el número de servidores físicos necesarios.
La virtualización ofrece una manera para que una empresa reduzca su consumo de energía y espacio de centro de
datos frente a una flota equivalente de servidores físicos. Los invitados ahora sólo son configuraciones de software,
así que es fácil proporcionar una nueva máquina para una prueba y destruirla cuando haya pasado su utilidad.
Si es posible ejecutar varias instancias de un sistema operativo en una máquina física y conectarse en la red,
entonces la ubicación de la máquina no importa. El Cloud Computing (Cómputo o Informática en la Nube) toma
este enfoque y te permite tener una máquina virtual en un centro de datos remoto que no posees y sólo pagas por
los recursos que utilizas. Los proveedores de Cloud Computing pueden tomar ventaja de las economías de escala
para ofrecer recursos de computación a mejores precios de lo que costaría adquirir tu propio hardware, espacio y
enfriamiento.
Los servidores virtuales sólo son una faceta de Cloud Computing. También puedes obtener almacenamiento de
archivos, bases de datos o incluso software. La clave en la mayoría de estos productos es que pagas por lo que usas,
por ejemplo una cierta cantidad por giga bytes de datos por mes, en lugar de comprar el hardware y el software
para darle hospedaje tu mismo. Algunas situaciones son más adecuadas para la nube que otros. Preocupaciones de
seguridad y el rendimiento son generalmente los primeros elementos que surgen seguidos por el costo y la
funcionalidad.
Linux juega un papel fundamental en el Cloud Computing. La mayoría de los servidores virtuales se basa en algún
tipo de kernel de Linux, y Linux se suele utilizar para alojar las aplicaciones detrás de los servicios del Cloud
Computing.
• Procesador de textos
• Hoja de cálculo
• Paquete de presentación
• Navegador web
OpenOffice, o el más activo, LibreOffice, se encarga de las tres primeras funciones. El procesador de texto se
utiliza para editar documentos, tales como informes y memos. Las Hojas de cálculo son útiles para trabajar con
números, por ejemplo para resumir datos de ventas y hacer predicciones futuras. El paquete de presentación se
utiliza para crear diapositivas con las características tales como texto, gráficos y vídeo insertado. Las diapositivas
pueden ser impresas o mostradas en una pantalla o un proyector para compartir con una audiencia.
A continuación abajo puedes ver la hoja de cálculo y editor de documentos de LibreOffice. Nota cómo la hoja de
cálculo, LibreOffice Calc, no se limita a filas y columnas de números. Los números pueden ser la fuente de un
Página 29 de 265
gráfico, y puedes escribir fórmulas para calcular valores basados en la información, por ejemplo reunir las tasas de
interés y cantidades para ayudar a comparar las diferentes opciones de préstamo.
Utilizando el Writer de LibreOffice, un documento puede contener texto, gráficos, tablas de datos y mucho más.
Puedes vincular documentos y hojas de cálculo, por ejemplo, para que puedas resumir los datos en forma escrita y
saber que cualquier cambio en la hoja de cálculo se reflejará en el documento.
LibreOffice también puede trabajar con otros formatos de archivo, como Microsoft Office o Adobe Portable
Document Format (PDF). Además, mediante el uso de extensiones, se puede integrar LibreOffice con el software
Wiki para ofrecerle una poderosa solución de intranet.
Linux es un ciudadano de primera clase para los navegadores Firefox y Google Chrome. Como tal, puede esperar
tener el software más reciente disponible para su plataforma y el acceso oportuno a correcciones de errores y
nuevas características. Algunos complementos, como Adobe Flash, no siempre funcionan correctamente ya que
dependen de otra compañía con prioridades diferentes.
Lo más fácil es utilizar una buena y única contraseña donde quiera que vayas, sobre todo en tu máquina local. Una
buena contraseña tiene al menos 10 caracteres y contiene una mezcla de números y letras (tanto mayúsculas y
minúsculas) y símbolos especiales. Utiliza un paquete como KeePassX para generar contraseñas, ya que luego sólo
necesitas tener una contraseña de inicio de sesión a tu equipo y una contraseña para abrir el archivo de KeePassX.
Página 30 de 265
En la parte superior, se puede ver que el sistema está configurado para buscar actualizaciones de forma diaria. Si
hay actualizaciones relacionadas con la seguridad, entonces se te pedirá que las instales inmediatamente. De lo
contrario, recibirás las actualizaciones en lotes cada semana. En la parte inferior de la pantalla puedes ver el cuadro
de diálogo que aparece cuando hay actualizaciones disponibles. Todo lo que tienes que hacer es hacer clic en
Instalar ahora y tu equipo se actualizará!
Por último, tienes que proteger tu equipo de aceptar conexiones entrantes. Firewall es un dispositivo que filtra el
tráfico de red y Linux tiene uno integrado. Si usas Ubuntu, gufw es una interfaz gráfica para "Uncomplicated
firewall" de Ubuntu.
Simplemente cambiando el estado a "on" se bloquea todo el tráfico que llega a tu equipo, a menos que lo hayas
iniciado tú mismo. De manera selectiva puedes permitir que entren algunas cosas haciendo clic en el signo más.
Bajo el capó estás usando iptables que es el sistema firewall integrado. En lugar de introducir comandos iptables
complicados, usas un GUI. Mientras que este GUI te permite construir una política efectiva de un escritorio, éste
apenas araña la superficie de lo que se puede hacer con iptables.
Página 31 de 265
3.7 Protegerte a tí Mismo
Cuando navegas por Internet, dejas una huella digital. Mucha de esta información viene ignorada, pero alguna
viene reunida para recopilar estadísticas de publicidad y otra puede ser utilizada para propósitos maliciosos.
Como regla general, no deberías confiar en los sitios con los que interactúas. Usa contraseñas diferentes en cada
sitio de Internet para que si tal sitio web estuviera hackeado, la contraseña no podría utilizarse para obtener acceso
a otros sitios. Usando anteriormente mencionado KeePassX es la forma más fácil de hacerlo. De la misma forma,
limita la información que proporcionas a los sitios, sólo lo imprescindible. Mientras que dar el nombre de tu madre
y fecha de nacimiento podría ayudarte a desbloquear tus credenciales para la red social en caso de que pierdas tu
contraseña, la misma información puede utilizarse para suplantar la identidad de tu banco.
Las cookies son el mecanismo principal que los sitios web utilizan para darte seguimiento. A veces este
seguimiento es bueno, por ejemplo para dar seguimiento de lo que está en tu cesta de compras o para mantenerte
conectado cuando regreses al sitio.
Cuando navegas por la web, un servidor web puede devolver la cookie que es un pequeño trozo de texto junto con
la página web. Tu navegador lo almacena y envía con cada solicitud al mismo sitio. No envías cookies para
ejemplo.com a sitios en ejemplo.org.
Sin embargo, muchos sitios han incrustado scripts que provienen de terceros, como un mensaje emergente de
anuncio o un píxel de analítica. Si ejemplo.com y ejemplo.org tienen un píxel de analítica, por ejemplo de un
anunciante, entonces esa misma cookie se enviará al navegar por ambos sitios. El anunciante se entera entonces
que has visitado ejemplo.com y ejemplo.org.
Con un alcance suficientemente amplio, como los "Likes" y botones parecidos, un sitio web puede obtener un
entendimiento de cuáles sitios web visitas y averiguar tus intereses y datos demográficos.
Existen diversas estrategias para tratar este asunto. Uno es ignorarlo. La otra es limitar los píxeles de seguimiento
que aceptas, ya sea por bloqueo completo o vaciarlos periódicamente. A continuación abajo se muestra la
configuración de cookies para Firefox. En la parte superior, verás que el usuario ha optado que Firefox no de
permiso al sitio para el seguimiento. Esta es una etiqueta voluntaria enviada en la petición que algunos sitios
distinguirán. A continuación, el navegador recibe una instrucción de no recordar nunca las cookies de terceros y
eliminar cookies regulares (por ejemplo, desde el sitio navegando) después de haber cerrado el Firefox.
Afinando la configuración de privacidad puede hacerte más anónimo en Internet, pero también puede causar
problemas con algunos sitios que dependen de cookies de terceros. Si esto sucede, probablemente tengas que
permitir explícitamente que se guarden algunas cookies.
Página 32 de 265
Aquí también tendrás la posibilidad de olvidar el historial de búsqueda o no seguirlo. Con el historial de búsqueda
eliminado no habrá ningún registro en el equipo local de los sitios que hayas visitado.
Si te preocupa mucho ser anónimo en Internet, puedes descargar y utilizar el Navegador Tor. Tor es el nombre
corto para "The Onion Router" que es una red de servidores públicamente ejecutados que rebotan tu tráfico para
ocultar el origen. El navegador que viene con el paquete es una versión básica que no ejecuta ni siquiera las
secuencias de comandos, por lo que algunos sitios probablemente no funcionarán correctamente. Sin embargo, es
la mejor manera de ocultar tu identidad si es lo que deseas hacer.
Página 33 de 265
Capítulo 4: Competencias de Línea de Comandos
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.
Página 34 de 265
¿Por qué conocer la línea de comando es importante? ¡Flexibilidad y Movilidad! Mediante la comprensión de
los fundamentos de Linux , tienes la capacidad de trabajar en CUALQUIER distribución de Linux. Esto podría
significar una compañía con ambiente mixto o una nueva empresa con una distribución Linux diferente.
El terminal acepta lo que el usuario escribe y lo pasa a un shell. El shell interpreta lo que el usuario ha introducido
en las instrucciones que se pueden ejecutar con el sistema operativo. Si el comando produce una salida, entonces se
muestra este texto en el terminal. Si surgen problemas con el comando, se muestra un mensaje de error.
Un buen ejemplo de un servidor que no requiere una GUI es un servidor web. Los servidores web deben correr tan
rápido como sea posible y una GUI sólo haría lento el sistema.
En los sistemas que arrancan con una GUI, hay comúnmente dos formas de acceder a una terminal, una terminal
basado en GUI y un terminal virtual:
Página 35 de 265
• Una terminal de GUI es un programa dentro del entorno de una GUI que emula la ventana de la terminal.
Las terminales de la GUI pueden accederse a través del sistema de menú. Por ejemplo, en una máquina
CentOS, puedes hacer clic en Applications (o «Aplicaciones» en español) en la barra de menús, luego en
System Tools > (o «Herramientas de Sistema») y, finalmente, en Terminal:
• 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).
Página 36 de 265
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.
• Scripting: La capacidad de colocar los comandos en un archivo y ejecutar el archivo, resultando en todos
los comandos siendo ejecutados. Esta función también tiene algunas características de programación, tales
como las instrucciones condicionales y la habilidad de crear funciones (AKA, subrutinas).
• Los Alias: La habilidad de crear "nicknames" (o «sobrenombres» en español) cortos para más comandos
más largos.
• Las Variables: Las Variables se utilizan para almacenar información para el BASH shell. Estas variables
pueden utilizarse para modificar cómo las funciones y los comandos trabajan y proporcionan información
vital sobre el sistema.
Nota: La lista anterior es sólo un breve resumen de algunas de las muchas funciones proporcionadas por el BASH
shell.
Las opciones se utilizan para modificar el comportamiento básico de un comando y los argumentos se utilizan para
proporcionar información adicional (tal como un nombre de archivo o un nombre de usuario). Cada opción y
argumento vienen normalmente separados por un espacio, aunque las opciones pueden a menudo ser combinadas.
Recuerda que Linux es sensible a mayúsculas y minúsculas. Comandos, opciones, argumentos, variables y
nombres de archivos deben introducirse exactamente como se muestra.
El comando ls proporciona ejemplos útiles. Por sí mismo, el comando ls listará los archivos y directorios
contenidos en el directorio de trabajo actual:
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$
Página 37 de 265
Sobre el comando ls hablaremos en detalle en un capítulo posterior. El propósito de introducir este comando
ahora, es demostrar cómo los argumentos y las opciones funcionan. En este punto no te debes preocupar de lo que
es la salida del comando, más bien centrarte en comprender en qué es un argumento y una opción.
Un argumento lo puedes pasar también al comando ls para especificar contenido de qué directorio hay que listar.
Por ejemplo, el comando ls /etc/ppp listará el contenido del directorio /etc/ppp en lugar del directorio actual:
sysadmin@localhost:~$ ls /etc/ppp
ip-down.d ip-up.d
sysadmin@localhost:~$
Puesto que el comando ls acepta múltiples argumentos, puede listar el contenido de varios directorios a la vez,
introduciendo el comando ls /etc/ppp /etc/ssh:
Página 38 de 265
utilizan una letra, mientras los comandos nuevos utilizan palabras completas para las opciones. Opciones de una
letra son precedidas por un único guión -. Opciones de palabra completa son precedidas por dos guiones --.
Por ejemplo, puedes utilizar la opción -l con el comando ls para ver más información sobre los archivos que se
listan. El comando ls -l lista los archivos contenidos dentro del directorio actual y proporciona información
adicional, tal como los permisos, el tamaño del archivo y otra información:
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.
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:~$
Página 39 de 265
4.4 Historial de los Comandos
Al ejecutar un comando en una terminal, el comando se almacena en "history list" (o «lista de historial» en
español). Esto está diseñado para que más adelante puedas ejecutar el mismo comando más fácilmente puesto que
no necesitarás volver a introducir el comando entero.
Para ver la lista de historial de una terminal, utiliza el comando history (o «historial» en español):
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:~$
Página 40 de 265
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
history 5 Muestra los últimos cinco comandos de la lista del historial
!! Ejecuta el último comando otra vez
!-5 Ejecuta el quinto comando desde la parte inferior de la lista de historial
!ls Ejecuta el comando ls más reciente
Página 41 de 265
4.5 Introduciendo las variables del BASH shell
Una variable del shell BASH es una función que te permite a ti o al shell almacenar los datos. Esta información
puede utilizarse para proporcionar información crítica del sistema o para cambiar el comportamiento del
funcionamiento del shell BASH (u otros comandos).
Las variables reciben nombres y se almacenan temporalmente en la memoria. Al cerrar una ventana de la terminal
o shell, todas las variables se pierden. Sin embargo, el sistema automáticamente recrea muchas de estas variables
cuando se abre un nuevo shell.
Para mostrar el valor de una variable, puedes utilizar el comando echo (o «eco» en español). El comando echo se
utiliza para mostrar la salida en la terminal; en el ejemplo siguiente, el comando mostrará el valor de la variable
HISTSIZE:
La variable HISTSIZE define cuántos comandos anteriores se pueden almacenar en la lista del historial. Para
mostrar el valor de la variable debes utilizar un carácter del signo de dólar $ antes del nombre de la variable. Para
modificar el valor de la variable, no se utiliza el carácter $:
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.
Página 42 de 265
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:~$
Página 43 de 265
Si en tu sistema tienes instalado un software personalizado, puede que necesites modificar la ruta PATH para que
sea más fácil ejecutar estos comandos. Por ejemplo, el siguiente comando agregará el directorio /usr/bin/custom
a la variable PATH:
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:
Página 44 de 265
sysadmin@localhost:~$
Después de exportar variable1 llegará a ser una variable de entorno. Observa que esta vez, se encuentra en la
búsqueda a través de las variables de entorno:
El comando export también puede utilizarse para hacer una variable de entorno en el momento de su creación:
Para cambiar el valor de una variable de entorno, simplemente omite el $ al hacer referencia a tal valor:
Página 45 de 265
4.8 Comando which
Puede haber situaciones donde diferentes versiones del mismo comando se instalan en un sistema o donde los
comandos son accesibles para algunos usuarios y a otros no. Si un comando no se comporta como se esperaba o si
un comando no está accesible pero debería estarlo, puede ser beneficioso saber donde el shell encuentra tal
comando o que versión está utilizando.
Sería tedioso tener que buscar manualmente en cada directorio que se muestra en la variable PATH. En su lugar,
puedes utilizar el comando which (o «cuál» en español) para mostrar la ruta completa del comando en cuestión:
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):
El comando type también puede identificar comandos integrados en el bash (u otro) shell:
Usando la opción -a, el comando type también puede revelar la ruta de otro comando:
El comando type también puede identificar a los aliases para otros comandos:
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
El comando type soporta otras opciones y puede buscar varios comandos al mismo tiempo. Para mostrar sólo una
sola palabra que describe al echo, ll, y a los comandos which, utiliza la opción -t:
Página 47 de 265
4.10 Los Alias
Un alias puede utilizarse para asignar comandos más largos a secuencias más cortas. Cuando el shell ve un alias
ejecutado, sustituye la secuencia más larga antes de proceder a interpretar los comandos.
Por ejemplo, el comando ls -l comúnmente tiene un alias l o ll. Ya que estos comandos más pequeñas son más
fáciles de introducir, también es más rápido ejecutar la línea de comandos ls -l.
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.
Página 48 de 265
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.
Página 49 de 265
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:
En el ejemplo siguiente se mostrarán todos los archivos en el directorio /etc que comienzan con la letra r y
terminan con .conf:
Página 50 de 265
Supongamos que quieres visualizar todos los archivos en el directorio /etc que comienzan con la letra t y que
tienen exactamente 7 caracteres después del carácter de t:
Los comodines pueden utilizarse juntos para encontrar patrones más complejos. El comando echo
/etc/*???????????????????? imprimirá sólo los archivos del directorio /etc con veinte o más caracteres en el
nombre del archivo:
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:
Página 51 de 265
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 comando echo /etc/*[0-9]* mostrará todos los archivos que contienen al menos un número:
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:
Página 52 de 265
4.12.1 Comillas Dobles
Las comillas dobles detendrán al shell de la interpretación de algunos metacaracteres, incluyendo los comodines.
Dentro de las comillas dobles, el asterisco es sólo un asterisco, un signo de interrogación es sólo un signo de
interrogación y así sucesivamente. Esto significa que cuando se utiliza el segundo comando echo más abajo, el
shell BASH no convierte el patrón de globbing en nombres de archivos que coinciden con el patrón:
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:
Página 53 de 265
Por ejemplo, si quieres que el carácter $ simplemente signifique un $, en lugar de actuar como un indicador del
shell para buscar el valor de una variable, puedes ejecutar el segundo comando que se muestra a continuación:
Si colocas una barra diagonal invertida \ antes del otro carácter, tratará al otro carácter como un carácter de
"comillas simples". El tercer comando más abajo muestra cómo utilizar el carácter \, mientras que los otros dos
muestran cómo las variables serían tratadas si las pones entre las comillas dobles y simples:
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:~$
Página 54 de 265
4.12.4 Comilla Invertida
Las comillas invertidas se utilizan para especificar un comando dentro de un comando, un proceso de sustitución
del comando. Esto permite un uso muy potente y sofisticado de los comandos.
Aunque puede sonar confuso, un ejemplo debe hacer las cosas más claras. Para empezar, fíjate en la salida del
comando date:
sysadmin@localhost:~$ date
Mon Nov 2 03:35:50 UTC 2015
Ahora fíjate en la salida de la línea de comandos echo Today is date (o «eco La fecha de hoy es» en español):
En el comando anterior la palabra date (o «fecha» en español) es tratada como texto normal y el shell simplemente
pasa date al comando echo. Pero, probablemente quieras ejecutar el comando date y tener la salida de ese
comando enviado al comando echo. Para lograr esto, deberás ejecutar la línea de comandos echo Today is
`date`:
Página 55 de 265
4.13 Instrucciones de Control
Las instrucciones de control te permiten utilizar varios comandos a la vez o ejecutar comandos adicionales,
dependiendo del éxito de un comando anterior. Normalmente estas instrucciones de control se utilizan en scripts o
secuencias de comandos, pero también pueden ser utilizadas en la línea de comandos.
Por ejemplo, si quieres imprimir los meses de enero, febrero y marzo de 2015, puedes ejecutar cal 1 2015; cal
2 2015; cal 3 2015 en la línea de comandos:
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
Página 56 de 265
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
•
Para entender mejor como funciona esto, consideremos primero el concepto de fracaso y éxito para los comandos.
Los comandos tienen éxito cuando algo funciona bien y fallan cuando algo sale mal. Por ejemplo, considera la
línea de comandos ls /etc/xml. El comando tendrá éxito si el directorio /etc/xml es accesible y fallará cuando
no es accesible.
Por ejemplo, el primer comando tendrá éxito porque el directorio /etc/xml existe y es accesible mientras que el
segundo comando fallará porque no hay un directorio /junk:
Página 57 de 265
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:~$
La manera en que usarías el éxito o fracaso del comando ls junto con && sería ejecutando una línea de comandos
como la siguiente:
En el primer ejemplo arriba, el comando echo fue ejecutado, porque tuvo éxito el comando ls. En el segundo
ejemplo, el comando echo no fue ejecutado debido a que el comando ls falló.
Con la línea vertical doble, si el primer comando se ejecuta con éxito, el segundo comando es omitido. Si el primer
comando falla, entonces se ejecutará el segundo comando. En otras palabras, esencialmente estás diciendo al shell,
"O bien ejecuta este primer comando o bien el segundo".
Página 58 de 265
ls: cannot access /etc/junk: No such file or directory
failed
sysadmin@localhost:~$
Página 59 de 265
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.
«93% de los directores de recursos humano planea contratar a un profesional de Linux en los próximos seis meses. Y
casi 90% mencionó que es difícil encontrar profesionales experimentados en Linux. Esto significa muchas
oportunidades de trabajo para aquellos con habilidades de Linux.»
Página 60 de 265
Si tu distribución usa el comando less, podría estar un poco abrumado por la gran cantidad de «comandos» que están
disponibles. La tabla siguiente proporciona un resumen de los comandos más útiles:
Comando Función
Página 61 de 265
n Buscar el siguiente elemento de la búsqueda
1G Ir a Inicio
G Ir a la final
h Mostrar ayuda
SYNOPSIS (Sinopsis) Proporciona ejemplos de cómo se ejecuta el comando. Información detallada a continuación.
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.
AUTHOR (Autor) El nombre de la persona que creó la página man y (a veces) la manera de contactar a la persona.
REPORTING BUGS Proporciona información sobre cómo reportar problemas con el comando.
(Reportando Errores)
SEE ALSO (Ver Proporciona una idea de dónde puedes encontrar información adicional. También suele incluir
También) otros comandos que están relacionados con este comando.
Página 62 de 265
5.2.4 La sección SYNOPSIS de la Página man
La sección de SYNOPSIS (o «SINOPSIS» en español) de una página man puede ser difícil de entender, pero es muy
importante porque proporciona un ejemplo conciso de cómo utilizar el comando. Por ejemplo, considera la SYNOPSIS
de la página man para el comando cal:
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]]
En estaSYNOPSIS hay dos sintaxis para el comando date. El primero de ellos se utiliza para mostrar la fecha en el
sistema mientras que el segundo se utiliza para fijar la fecha.
Las elipses siguientes a [OPTION], ..., indican que uno o más ítems antes de la opción pueden usarse.
Además, la notación [-u|--utc|--universal] significa que puedes utilizar la opción -u , la opción --utc o la
opción --universal . Normalmente esto significa que las tres opciones hacen lo mismo, pero a veces este formato
(uso del carácter |) sirve para indicar que no se utilicen las opciones combinadas, tal como un operador lógico «o».
Página 63 de 265
5.2.6 Las Páginas man Categorizadas por Secciones
Hasta ahora, hemos estado visualizando las páginas man de comandos. Sin embargo, a veces los archivos de
configuración también tienen sus páginas man. Los archivos de configuración (a veces llamados archivos de sistema)
contienen datos que se utilizan para almacenar información sobre el Sistema Operativo o servicios.
Adicionalmente, existen varios tipos de comandos (comandos de usuario, comandos del sistema y comandos de
administración), así como otras funciones que requieren documentación, como las librerías y los componentes del
Kernel.
Como resultado, hay miles de páginas man en una distribución típica de Linux. Para organizar todas estas páginas, las
páginas se clasifican por secciones, al igual que cada página man se divide en secciones.
Para considerar:
Por defecto, hay nueve secciones de las páginas man:
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:
Página 64 de 265
5.2.6.1 Determinar la Sección
Para determinar a qué sección pertenece una página man específica tienes que ver el valor numérico de la primera
línea de la salida de la página man. Por ejemplo, si ejecutas el comando man cal, verás que el
comando cal pertenece a la primera sección de las páginas man:
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:
Ten en cuenta que en la mayoría de las distribuciones de Linux, el comando whatis hace lo mismo que el
comando man -f. En esas distribuciones, ambos comandos producen la misma salida.
Página 65 de 265
5.2.7 Buscar Páginas man por una Palabra Clave
Desafortunadamente, no siempre te acordarás del nombre exacto de la página man que quieres ver. En estos casos
puedes buscar páginas man que coincidan con una palabra clave mediante el uso de la opción -k del comando man.
Por ejemplo, ¿qué pasa si quieres ver una página que muestra cómo cambiar la contraseña, pero no recuerdas el
nombre exacto? Puedes ejecutar el comando man -k password:
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.
Página 66 de 265
Otra ventaja del comando info sobre las páginas man es que el estilo de escritura de los documentos info es
típicamente más propicio para aprender un tema. Considera que las páginas man son un recurso de referencias y los
documentos info sirven más como una guía de aprendizaje.
File: coreutils.info, Node: ls invocation, Next: dir invocation, Up: Directo\ry listing
The `ls' program lists information about files (of any type, including directories). Op
tions 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.
Página 67 de 265
5.3.2 Cambiando de Posición mientras se Visualiza un
Documento info
Igual que el comando man, puedes obtener un listado de comandos de movimiento escribiendo la letra h al leer la
documentación info:
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
Página 68 de 265
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:
File: coreutils.info, Node: Sorting the output, Next: Details about version s\ort, Prev:
What information is listed, Up: ls invocation
10.1.3 Sorting the output
-------------------------
These options change the order in which `ls' sorts the information it
Página 69 de 265
outputs. By default, sorting is done by character code (e.g., ASCII
order).
`-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.
Página 70 de 265
* 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.
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
Página 71 de 265
-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:~$
Página 72 de 265
Estos archivos de documentación se suelen llamar archivos "readme" (o «leeme» en español), ya que los archivos
tienen nombres como README o readme.txt. La ubicación de estos archivos puede variar según la distribución que
estés utilizando. Ubicaciones típicas incluyen /usr/share/doc y /usr/doc.
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.
Página 73 de 265
Para encontrar cualquier archivo o directorio, puede utilizar el comando locate (o «localizar» en español). Este
comando buscará en una base de datos de todos los archivos y directorios que estaban en el sistema cuando se creó
la base de datos. Por lo general, el comando que genera tal base de datos se ejecuta por la noche.
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:
Página 75 de 265
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.
Página 76 de 265
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:
La mayoría de los usuarios de Linux denominan esta estructura de directorios el sistema de archivos.
Para ver el sistema de archivos raíz, introduce ls /:
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.
Página 78 de 265
nombre de la cuenta de usuario cuyo directorio home quieres consultar. Por ejemplo, ~bob sería igual a /home/bob.
Aquí, vamos a cambiar al directorio home del usuario:
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 ~]$
Página 79 de 265
6.2.4 Cambio de Directorios
Si te quieres cambiar a un directorio diferente, utiliza el comando cd (cambiar directorio). Por ejemplo, el siguiente
comando cambiará el directorio actual a un directorio llamado /etc/sound/events:
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$
Si quieres volver a tu directorio home, puedes introducir el comando cd sin argumentos o usar el comando cd con el
carácter ~ como argumento:
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$
Sin embargo, ¿Qué pasa si estás en el directorio /etc/perl y quieres ir al directorio /etc/perl/Net? Sería tedioso
introducir la ruta completa para llegar a un directorio que es sólo un nivel más abajo de tu ubicación actual. En una
situación como ésta, vas a utilizar una ruta relativa:
Página 80 de 265
sysadmin@localhost:/etc/perl$ cd Net
sysadmin@localhost:/etc/perl/Net$
Una ruta de acceso relativa proporciona direcciones usando tu ubicación actual como un punto de referencia.
Recuerda que esto es diferente de las rutas absolutas, que siempre requieren que utilices el directorio raíz como
punto de referencia.
Existe una técnica útil de ruta de acceso relativa que se puede utilizar para subir un nivel en la estructura de
directorios: el directorio .. . Sin importar en qué directorio estás, el comando .. siempre representa un directorio
arriba que el directorio actual (con la excepción de cuando estás en el directorio /):
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
Página 81 de 265
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» en Un archivo que no es un tipo de archivo especial; también se llama un archivo
español) normal
symbolic link Un archivo que apunta a otro archivo (o «enlace simbólico» en español)
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'
Página 82 de 265
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
sysadmin@localhost:~$
Como puedes ver en la salida anterior, cuando se ejecuta el comando ls, en realidad se ejecuta el comando ls --
color=auto.
En algunos casos, puede que no quieras ver todos los colores (a veces te pueden distraer un poco). Para evitar el uso
de los alias, coloca un carácter de barra invertida \ antes de tu comando:
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates
Videos
sysadmin@localhost:~$ \ls
Desktop Documents Downloads Music Pictures Public Templates
Videos
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.
Página 83 de 265
6.3.3 Listado con Visualización Larga
Existe información sobre cada archivo, llamada metadata (o «metadatos» en español), y visualizarla a veces resulta
útil. Esto puede incluir datos de quién es el dueño de un archivo, el tamaño de un archivo y la última vez que se
modificó el contenido de un archivo. Puedes visualizar esta información mediante el uso de la opción -l para el
comando ls:
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.»
Página 84 de 265
«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.»
«Grupo propietario. Cada archivo es propiedad de un grupo. Esto es importante porque cualquier miembro de este
grupo tendrá acceso especial al archivo basado en los permisos de grupo del 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).»
Página 85 de 265
«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:
Página 86 de 265
Cuando se utiliza el comando ls -d, se refiere al directorio actual y no al contenido dentro de él. Sin otras opciones,
es algo sin sentido, aunque es importante tener en cuenta que al directorio actual siempre se refiere con un solo punto
(.):
sysadmin@localhost:~$ ls -d
.
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
Página 87 de 265
/etc/ppp/peers:
sysadmin@localhost:~$
Ten en cuenta que en el ejemplo anterior, los archivos en el directorio /etc/ppp se listaron primero. Después de eso,
se listan los archivos en el directorio /etc/ppp/peers (no hubo ningún archivo en este caso, pero si hubiera
encontrado cualquier archivo en este directorio, se habría visualizado).
Ten cuidado con esta opción; por ejemplo, ejecutando el comando ls -R / se listarían todos los archivos del sistema
de archivos, incluyendo todos los archivos de cualquier dispositivo USB y DVD en el sistema. Limita el uso de la
opción -R para estructuras de directorio más pequeñas.
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.
Página 88 de 265
-rw------- 1 root root 227 Jan 29 2015 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 179 Jan 29 2015 ssh_host_ecdsa_key.pub
sysadmin@localhost:~$
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.
Página 89 de 265
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:
Cuando el comando ls ve varios argumentos, realiza una operación de listado en cada elemento por separado. En
otras palabras, el comando ls /etc/encript.cfg /etc/environment es esencialmente igual a ls
/etc/encript.cfg; ls /etc/environment .
Ahora considera lo que sucede cuando se ejecuta el comando ls en un archivo, tal como encript.cfg:
sysadmin@localhost:~$ ls /etc/enscript.cfg
/etc/enscript.cfg
sysadmin@localhost:~$
Página 91 de 265
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:~$
Sin embargo, ¿Qué ocurre si el comando ls recibe un nombre de directorio como un argumento? En este caso, la
salida del comando es diferente a que si el argumento es un nombre de archivo:
sysadmin@localhost:~$ ls /etc/event.d
ck-log-system-restart ck-log-system-start ck-log-system-stop
sysadmin@localhost:~$
Si proporcionas un nombre de directorio como argumento del comando ls, el comando mostrará el contenido del
directorio (los nombres de los archivos en el directorio), y no sólo proporcionará el nombre del directorio. Los nombres
de los archivos, que se ven en el ejemplo anterior, son los nombres de los archivos en el directorio /etc/event.d.
¿Por qué ésto es un problema al utilizar los globs? Considera el siguiente resultado:
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:~$
En el ejemplo anterior, parece que el comando ls es simplemente incorrecto. Pero lo que realmente sucedió es que lo
único que coincide con el glob etc/ev * es el directorio /etc/event.d. Por lo tanto, el comando ls muestra sólo
los archivos en ese directorio.
Hay una solución simple a este problema: al utilizar los argumentos glob con el comando ls, utiliza siempre la opción -
d. Cuando utilizas la opción -d, el comando ls no muestra el contenido de un directorio, sino más bien el nombre del
directorio:
sysadmin@localhost:~$ ls -d /etc/e*
/etc/encript.cfg /etc/environment /etc/ethers /etc/event.d /etc/exports
sysadmin@localhost:~$
Página 92 de 265
6.4 Copiar los Archivos
El comando cp se utiliza para copiar los archivos. Requiere especificar un origen y un destino. La estructura del
comando es la siguiente:
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:
Visualiza la salida del comando ls para ver el archivo y visualiza el contenido del archivo utilizando el comando more:
sysadmin@localhost:~$
En el siguiente ejemplo verás que el comando cp destruye el contenido original del archivo ejemplo.txt. Observa
que una vez finalizado el comando cp, el tamaño del archivo es diferente (158 bytes en lugar de 18) del original y los
contenido también son diferentes:
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:
Página 94 de 265
sysadmin@localhost:~$ cp -i /etc/hosts ~/example.txt
cp: overwrite `/home/sysadmin/example.txt'? n
sysadmin@localhost:~$ ls -l example.txt
-rw-r--r-- 1 sysadmin sysadmin 18 Sep 21 15:56 example.txt
sysadmin@localhost:~$ more example.txt
# ~/.bash_logout: executed by bash(1) when login shell exits.
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:~$
Como puedes ver en el ejemplo anterior, el comando cp intentó sobrescribir los cuatro archivos existentes, obligando
al usuario a responder a tres prompts. Si esta situación ocurriera para 100 archivos, puede resultar muy molesto
rápidamente.
Si quieres contestar automáticamente n para cada prompt, utiliza la opción -n. En esencia, significa «sin
sobreescribir».
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
Página 95 de 265
sysadmin@localhost:~$
Donde la salida dice ...omitting directory... (o «omitiendo directorio» en español), el comando cp está
diciendo que no puede copiar este artículo porque el comando no copia los directorios por defecto. Sin embargo, la
opción -r del comando cp copiará ambos, los archivos y los directorios.
Ten cuidado con esta opción: se copiará la estructura completa del directorio. ¡Esto podría resultar en copiar muchos
archivos y directorios!
mv [fuente] [destino]
En el ejemplo siguiente, el archivo hosts que se generó anteriormente se mueve desde el directorio actual al
directorio Videos:
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:~$
Cuando se mueve un archivo, el archivo se elimina de la ubicación original y se coloca en una ubicación nueva. Esto
puede ser algo complicado en Linux porque los usuarios necesitan permisos específicos para quitar archivos de un
directorio. Si no tienes los permisos correctos, recibirás un mensaje de error «Permission denied» (o «Permiso
denegado» en español):
sysadmin@localhost:~$ mv /etc/hosts .
mv: cannot move `/etc/hosts' to `./hosts': Permission denied
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$
Piensa en el ejemplo anterior del mv que significa «mover el archivo newexample.txt desde el directorio actual de
regreso al directorio actual y denominar el nuevo archivo como myexample.txt».
Opción Significado
Página 97 de 265
Opción Significado
Importante: Aquí no hay ninguna opción -r, ya que el comando mv moverá los directorios de forma predeterminada.
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
Página 98 de 265
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
Página 99 de 265
sample.txt
sysadmin@localhost:~$
Importante: Cuando un usuario elimina un directorio, todos los archivos y subdirectorios se eliminan sin proporcionar
pregunta interactiva. Lo mejor es utilizar la opción -i con el comando rm.
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:~$
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:
• El Empaquetamiento - Combina varios archivos en uno solo, lo que elimina la sobrecarga en archivos
individuales y los hace más fácil de transmitir
• Compresión – hace los archivos más pequeños mediante la eliminación de información redundante
Puedes realizar empaquetamiento de varios archivos en un solo archivo y luego comprimirlo, o puedes comprimir un
archivo individual. La primera opción se conoce todavía como empaquetamiento de archivos, mientras la última se
llama solo compresión. Cuando tomas un archivo empaquetado, lo descomprimes y extraes uno o más archivos, lo
estás desempaquetando.
A pesar de que el espacio en disco es relativamente barato, el empaquetamiento y la compresión aún tienen su valor:
• Si quieres que un gran número de archivos sea disponible, tales como el código fuente a una aplicación o un
conjunto de documentos, es más fácil para las personas descargar un archivo empaquetado que descargar los
archivos individuales.
• Los archivos de registro tienen la costumbre de llenar los discos por lo que es útil dividirlos por fecha y
comprimir las las versiones más antiguas.
• Cuando haces copias de seguridad de los directorios, es más fácil mantenerlos todos en un archivo
empaquetado que crear una versión de cada archivo.
• Algunos dispositivos de transmisión, como cintas, se desempeñan mejor enviando una transmisión en
secuencia de datos en lugar de los archivos individuales.
• A menudo puede ser más rápido comprimir un archivo antes de enviarlo a una unidad de cinta o a una red más
lenta y descomprimir en el otro extremo en vez de enviarlo descomprimido.
Como administrador de Linux, debes familiarizarte con las herramientas para el empaquetamiento y compresión de
archivos.
• Lossless (o «sin pérdida» en español): No se elimina ninguna información del archivo. Comprimir un archivo y
descomprimirlo deja algo idéntico al original.
• Lossy (o «con pérdida» en español): Información podría ser retirada del archivo cuando se comprime para que
al descomprimir el archivo de lugar a un archivo que es un poco diferente que el original. Por ejemplo, una
Generalmente los ojos y oídos humanos no notan imperfecciones leves en las imágenes y el audio, especialmente
cuando se muestran en un monitor o suenan a través de los altavoces. La compresión con pérdida a menudo beneficia
a los medios digitales ya que los tamaños de los archivos son más pequeños y las personas no pueden indicar la
diferencia entre el original y la versión con los datos cambiados. Cosas que deben permanecer intactas, como los
documentos, los registros y el software necesitan una compresión sin pérdida.
La mayoría de los formatos de imágenes, como GIF, PNG y JPEG, implementan algún tipo de compresión con
pérdida. Generalmente puedes decidir cuánta calidad quieres conservar. Una calidad inferior resultará en un archivo
más pequeño, pero después de la descompresión puedes notar resultados no deseados tales como los bordes
ásperos o decoloraciones. Una calidad alta se parecerá mucho a la imagen original, pero el tamaño del archivo será
más cercano al original.
Comprimir un archivo ya comprimido no lo hará más pequeño. Esto a menudo se olvida cuando se trata de imágenes,
puesto que ya se almacenan en un formato comprimido. Con la compresión sin pérdida esta compresión múltiple no es
un problema, pero si se comprime y descomprime un archivo varias veces mediante un algoritmo con pérdida
obtendrás algo que es irreconocible.
Linux proporciona varias herramientas para comprimir los archivos, la más común es gzip. A continuación te
mostraremos un archivo de registro antes y después de la compresión.
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
En el ejemplo anterior hay un archivo llamado access_log que tiene 372,063 bytes. El archivo se comprime
invocando el comando gzip con el nombre del archivo como el único argumento. Al finalizar el comando su tarea, el
archivo original desaparece y una versión comprimida con una extensión de archivo .gz se queda en su lugar. El
tamaño del archivo es ahora 26,080 bytes, dando una relación de compresión de 14:1, que es común en el caso de los
archivos de registro.
El comando gzip te dará esta información si se lo pides utilizando el parámetro –l tal como se muestra aquí:
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.
Lo contrario del comando gzip es el comando gunzip. Por otra parte, gzip –d hace la misma cosa (gunzip es sólo
un script que invoca el comando gzip con los parámetros correctos). Cuando el comando gunzip termine su tarea,
podrás ver que el archivo access_log vuelve a su tamaño original.
El comando mysqldump – A da salidas a los contenidos de las bases de datos de MySQL locales a la consola. El
carácter | (barra vertical) dice "redirigir la salida del comando anterior en la entrada del siguiente". El programa para
recibir la salida es gzip, que reconoce que no se dieron nombres de archivo por lo que debe funcionar en modo de
barra vertical. Por último, > database_backup.gz significa "redirigir la salida del comando anterior en un archivo
llamado database_backup.gz. La inspección de este archivo con gzip –l muestra que la versión comprimida es un
7.5% del tamaño original, con la ventaja agregada de que el archivo más grande jamás tuvo que ser escrito a disco.
Hay otro par de comandos que operan prácticamente idénticamente al gzip y gunzip. Éstos son el bzip2 y bunzip2.
Las utilidades del bzip utilizan un algoritmo de compresión diferente (llamado bloque de clasificación de Burrows-
Wheeler frente a la codificación Lempel-Ziv que utiliza gzip) que puede comprimir los archivos más pequeños que
un gzip a costa de más tiempo de CPU. Puedes reconocer estos archivos porque tienen una
extensión .bz o .bz2 en vez de .gz.
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.
La creación de un archivo requiere dos opciones de nombre. La primera, c, especifica el modo. La segunda, f, le dice
a tar que espere un nombre de archivo como el siguiente argumento. El primer argumento en el ejemplo anterior crea
Página 103 de 265
un archivo llamado access_logs.tar. El resto de los argumentos se toman para ser nombres de los archivo de
entrada, ya sea un comodín, una lista de archivos o ambos. En este ejemplo, utilizamos la opción comodín para incluir
todos los archivos que comienzan con access_log.
El ejemplo anterior hace un listado largo de directorio del archivo creado. El tamaño final es 542,720 bytes que es
ligeramente más grande que los archivos de entrada. Los tarballs pueden ser comprimidos para transporte más fácil,
ya sea comprimiendo un archivo con gzip o diciéndole a tar que lo haga con la a opción z tal como se muestra a
continuación:
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.
A la izquierda de la barra vertical está bunzip –c access_logs.tbz, que descomprime el archivo, pero el c envía la
salida a la pantalla. La salida es redirigida a tar -t. Si no especificas que un archivo con –f, entonces el tar leerá la
entrada estándar, que en este caso es el archivo sin comprimir.
Finalmente, puedes extraer el archivo con la marca –x:
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:
Es importante mantener la opción –f al final, ya que el tar asume que lo que sigue es un nombre de archivo. En el
siguiente ejemplo, las opciones f y v fueron transpuestas, llevando al tar a interpretar el comando como una
operación en un archivo llamado "v" (el mensaje relevante viene en itálica).
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:
En el ejemplo anterior, se añaden todos los archivos bajo el directorio logs ya que utiliza la opción –r. La primera
línea de la salida indica que un directorio se agregó al archivo, pero de lo contrario la salida es similar al ejemplo
anterior.
El listado de los archivos en el zip se realiza por el comando unzip y la opción –l (listar):
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.
Traducción texto en imagen. ¿La cabeza en las nubes? Linux impulsa la nube. 76% de las organizaciones habilitadas
en la nube utilizan servidores Linux para la nube. 2013 Reporte Linux de Adopción de Usuarios Finales Empresariales.
La Fundación Linux
#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:
La salida del comando ls se pasa al comando head por el shell en vez de ser impreso a la pantalla. El comando head
toma esta salida (del ls) como "datos de entrada" y luego se imprime la salida del head a la pantalla.
Múltiples barras verticales pueden utilizarse consecutivamente para unir varios comandos. Si se unen tres comandos
con la barra vertical, la salida del primer comando se pasa al segundo comando. La salida del segundo comando se
pasa al tercer comando. La salida del tercer comando se imprime en la pantalla.
Es importante elegir cuidadosamente el orden en que los comandos están unidos con la barra vertical, ya que el tercer
comando sólo verá como entrada, la salida del segundo comando. Los siguientes ejemplos ilustran esta situación
usando el comando nl. En el primer ejemplo, el comando de nl se utiliza para numerar las líneas de la salida de un
comando anterior:
En el ejemplo siguiente, observa que el comando ls es ejecutado primero y su salida se envía al comando nl,
enumerando todas las líneas de la salida del comando ls. A continuación, se ejecuta el comando tail, mostrando las
últimas cinco líneas de la salida del comando nl:
8.3.1 STDIN
La entrada estándar STDIN es la información normalmente introducida por el usuario mediante el teclado. Cuando un
comando envía un prompt al shell esperando datos, el shell proporciona al usuario la capacidad de introducir los
comandos, que a su vez, se envían al comando como STDIN.
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 >.
Este comando no muestra ninguna salida, porque la STDOUT fue enviada al archivo example.txt en lugar de la
pantalla. Puedes ver el nuevo archivo con la salida del comando ls. El archivo recién creado contiene la salida del
comando echo cuando se ve el contenido del archivo con el comando cat.
Es importante tener en cuenta que la flecha sola sobrescribe cualquier contenido de un archivo existente:
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:
En el ejemplo anterior, el STDOUT fue redirigido al archivo output.txt. Por lo tanto, la salida que se muestra no
puede ser STDOUT porque habría quedado en el archivo output.txt. Ya que todos los resultados del comando van
a STDOUT o STDERR, la salida mostrada debe ser STDERR.
El STDERR de un comando puede enviarse a un archivo:
En el comando de arriba, 2> indica que todos los mensajes de error deben enviarse al archivo error.txt.
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:~$
Mientras que en el ejemplo anterior se muestra otra de las ventajas de redireccionar la STDOUT, no aborda el por qué
o cómo puedes dirigir la STDIN. Para entender esto, consideremos primero un nuevo comando llamado tr. Este
comando tomará un conjunto de caracteres y los plasmará en otro conjunto de caracteres.
Por ejemplo, supongamos que quieres poner una línea de comandos en mayúsculas. Puede utilizar el comando tr de
la siguiente manera:
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 <:
Esto es bastante raro porque la mayoría de los comandos aceptan a los nombres de archivo como argumentos. Sin
embargo, para los que no, este método podría utilizarse para que el shell lea desde el archivo en lugar de confiar en el
comando que tienen esta capacidad.
Una última nota: En la mayoría de los casos probablemente quieras tomar la salida resultante y colocarla en otro
archivo:
O en Inglés:
Component Description
[directorio de Aquí el usuario especifica dónde comenzar la búsqueda. El comando find buscará en este directorio y
inicio] todos sus subdirectorios. Si no hay directorio de partida, el directorio actual se utiliza para el punto de
partida
[opción de Aquí el usuario especifica una opción para determinar qué tipo de metadatos hay que buscar; hay
búsqueda] opciones para el nombre de archivo, tamaño de archivo y muchos otros atributos de archivo.
[criterio de Es un argumento que complementa la opción de búsqueda. Por ejemplo, si el usuario utiliza la opción
búsqueda] para buscar un nombre de archivo, el criterio de búsqueda sería el nombre del archivo.
[opción de Esta opción se utiliza para especificar qué acción se debe tomar al encontrar el archivo. Si no se
resultado] proporciona ninguna opción, se imprimirá el nombre del archivo a STDOUT.
Observa que se encontraron dos archivos: /etc/hosts y /etc/avahi/hosts. El resto de la salida eran los
mensajes STDERR porque el usuario que ejecutó el comando no tiene permiso para acceder a ciertos subdirectorios.
Recuerda que puedes redirigir el STDERR a un archivo por lo que no necesitarás ver estos mensajes de error en la
pantalla:
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
- Permite al usuario especificar la profundidad en la estructura de los directorios a buscar. Por ejemplo, -
maxdepth
maxdepth 1 significaría sólo buscar en el directorio especificado y en sus subdirectorios inmediatos.
-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 modificados hace 10 minutos.
-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.
• El comando less: Este comando proporciona una capacidad de paginación muy avanzada. Normalmente es el
pager predeterminado utilizado por comandos como el comando man.
• El comando more: Este comando ha existido desde los primeros días de UNIX. Aunque tenga menos funciones
que el comando less, tiene una ventaja importante: El comando less no viene siempre incluido en todas las
distribuciones de Linux (y en algunas distribuciones, no viene instalado por defecto). El comando more siempre
está disponible.
Cuando utilizas los comandos more o less, te permiten «moverte» en un documento utilizando los comandos de tecla.
Ya que los desarrolladores del comando less basaron el comando en la funcionalidad del comando more, todos los
comandos de tecla disponibles en el comando more también trabajan en el comando less.
En este manual nos centraremos más en el comando más avanzado (less). Sin embargo, resulta útil que te acuerdes
del comando more para cuando el comando less no esté disponible. Recuerda que la mayoría de los comandos de
tecla proporcionados trabajan para ambos comandos.
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
Página 127 de 265
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):
Para iniciar una búsqueda hacia atrás desde tu posición actual, pulsa la tecla ?, después introduce el texto o el patrón
y presiona la tecla Entrar. El cursor se moverá hacia atrás hasta encontrar la primera coincidencia o te informará que
no se puede encontrar el patrón.
Si la búsqueda encuentra más de una coincidencia, entonces con la tecla n te puedes mover a la siguiente
coincidencia y la tecla N te permitirá ir a la coincidencia anterior.
help | head Las primeras diez líneas de la salida del comando help redirigidas por la barra vertical
help | tail Las últimas diez líneas de la salida del comando help redirigidas por la barra vertical
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.
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:
El ejemplo anterior muestra la salida de ejecutar: wc /etc/passwd /etc/passwd-. La salida tiene cuatro columnas: el
número de líneas en el archivo, el número de palabras en el archivo, el número de bytes en el archivo y el nombre de
archivo o total.
Si quieres ver estadísticas específicas, puede utilizar -l para mostrar sólo el número de líneas, -w para mostrar sólo el
número de palabras y -c para mostrar sólo el número de bytes.
El comando wc puede ser útil para contar el número de líneas devueltas por algún otro comando utilizando la barra
vertical. Por ejemplo, si desea saber el número total de los archivos en el directorio /etc, puedes ejecutar ls /etc |
wc -l:
sysadmin@localhost:~$ ls /etc/ | wc -l
136
sysadmin@localhost:~$
Con el comando cut puedes también extraer las columnas de un texto basado en la posición de los caracteres con la
opción -c. Esto puede ser útil para extraer los campos de archivos de base de datos con un ancho fijo. El siguiente
ejemplo muestra sólo el tipo de archivo (carácter #1), los permisos (caracteres #2-10) y el nombre de archivo
(caracteres #50+) de la salida del comando ls -l:
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
grep -v nologin Todas las líneas que no contengan nologin en el archivo /etc/passwd
/etc/passwd
grep -l linux Lista de los archivos en el directorio /etc que contengan linux
/etc/*
grep -i linux Listado de las líneas de los archivos en el directorio /etc que contengan cualquier tipo de
/etc/*
letra (mayúscula o minúscula) del patrón de caracteres linux
grep -w linux Listado de las líneas de los archivos en el directorio /etc que contengan el patrón de la
/etc/*
palabra linux
[ ] Una lista o rango de caracteres que coinciden con un carácter, a menos que el primer carácter sea el
símbolo de intercalación ^, lo que entonces significa cualquier carácter que no esté en la lista
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.
Ten en cuenta que puedes enumerar cada carácter posible [abcd] o proporcionar un rango [a-d] siempre que esté
en el orden correcto. Por ejemplo, [d-a] no funcionaría ya que no es un intervalo válido:
El rango se especifica mediante un estándar denominado la tabla ASCII. Esta tabla es una colección de todos los
caracteres imprimibles en un orden específico. Puedes ver la tabla ASCII con el comando man ascii. Un pequeño
ejemplo:
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.
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
grep -E 'colou?r' 2.txt Haz coincidir colo seguido por cero o un carácter u color colour
grep -E 'd+' 2.txt Coincide con uno o más d caracteres d dd ddd dddd
sysadmin@localhost:~/many$ rm *
bash: /bin/rm: Argument list too long
sysadmin@localhost:~/many$ ls | xargs rm
sysadmin@localhost:~/many$
Traducción Imagen: Linux, la frontera final. Linux es usado en el espacio por la NASA. El Fénix Mars Rover e incluso
en la estación espacial internacional
El script, test.sh, consta de una sola línea que imprime la cadena Hello, World! (o «¡Hola, Mundo!» en español)
en la consola.
Ejectutar un script puede hacerse, ya sea pasándolo como un argumento a tu shell o ejecuándolo directamente:
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!”
Los dos caracteres #! se llaman tradicionalmente el hash y el bang respectivamente, que conduce a la forma
abreviada «shebang» cuando se utilizan al principio de un script.
Por cierto, el shebang (o crunchbang) se utiliza para los scripts shell tradicionales y otros lenguajes basados en texto
como Perl, Ruby y Python. Cualquier archivo de texto marcado como ejecutable se ejecutará bajo el intérprete
especificado en la primera línea mientras se ejecuta el script directamente. Si el script se invoca directamente como
argumento a un intérprete, como sh script o bash script, se utilizará el shell proporcionado,
independientemente de lo que está en la línea del shebang.
Ayuda sentirse cómodo utilizando un editor de texto antes de escribir los scripts shell, ya que se necesitarás crear los
archivos de texto simple. Las herramientas de oficina tradicionales como LibreOffice, que dan salida a archivos que
contienen la información de formato y otra información, no son adecuadas para esta tarea.
#!/bin/sh
^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
El editor nano tiene algunas características que debes conocer. Simplemente escribes con tu teclado, utiliza las flechas
para moverte y el botón suprimir/retroceso para borrar texto. A lo largo de la parte inferior de la pantalla puedes ver
algunos comandos disponibles, que son sensible al contexto y cambian dependiendo de lo que estás haciendo. Si te
encuentras directamente en la máquina Linux, o sea no te conectas a través de la red, puedes utilizar el ratón para
mover el cursor y resaltar el texto.
Para familiarizarte con el editor, comienza a escribir un script shell sencillo dentro del editor nano:
#!/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).
#!/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
El comando read puede aceptar una cadena directo desde el teclado o como parte de la redirección de comandos tal
como aprendiste en el capítulo anterior.
Hay algunas variables especiales además de las establecidas. Puedes pasar argumentos a tu script:
#!/bin/bash
echo "Hello $1"
El signo de dólar seguido de un número N corresponde al argumento Nth pasado al script. Si invocas al ejemplo
anterior con ./test.sh el resultado será Hola Linux. La variable $0 contiene el nombre del script.
Después de que un programa se ejecuta, ya sea un binario o un script, devuelve el exit code (o «código de salida» en
español) que es un número entero entre 0 y 255. Puedes probarlo con la variable $? para ver si el comando anterior
se ha completado con éxito.
Se utilizó el comando grep para buscar una cadena dentro de un archivo con el indicador -q, que significa
«silencioso» (o «quiet» en inglés). El grep, mientras se ejecuta en modo silencioso, devuelve 0, si la cadena se
encontró y 1 en el caso contrario. Esta información puede utilizarse en un condicional para realizar una acción basada
en la salida de otro comando.
Además puedes establecer el código de salida de tu propio script con el comando exit:
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
De los ejemplos anteriores podrías recordar que el código de salida del grep es 0 si se encuentra la cadena. El
ejemplo anterior utiliza esto en una línea para imprimir un mensaje si root está en el archivo passwd, u otro mensaje
si no es así. La diferencia aquí es que en lugar de un fi para cerrar, el bloque if, hay un else. Esto te permite realizar
una acción si la condición es verdadera, y otra si la condición es falsa. El bloque else siempre debe cerrarse con la
palabra clave fi.
Otras tareas comunes son buscar la presencia de un archivo o directorio y comparar cadenas y números. Podrías
iniciar un archivo de registro si no existe, o comparar el número de líneas en un archivo con la última vez que se
ejecutó. El comando if es claramente de ayuda aquí, pero ¿qué comando debes usar para hacer la comparación?
El comando test te da un acceso fácil los operadores de prueba de comparación y archivos. Por ejemplo:
test –x `which ls` sustituir la ubicación de ls y luego (probar) test, si el usuario puede ejecutar
test 1 –ne 1 Más fácil, ejecutar test (probar) si hay desigualdad numérica
test 1 –eq 1 –o 2 –eq 2 -o es OR: cualquiera de las opciones pueden ser igual
Es importante tener en cuenta que el test ve las comparaciones de números enteros y cadenas de manera
distinta. 01 y 1 son iguales por comparación numérica, pero no para comparación de cadenas o strings. Siempre
debes tener cuidado y recordar qué tipo de entrada esperas.
Hay muchas más pruebas, como –gt para mayor que, formas de comprobar si un archivo es más reciente que los
otros y muchos más. Para más información consulta la página test man.
La salida de test es bastante largo para un comando que se usa con tanta frecuencia, por lo que tiene un alias
llamado [ (corchete cuadrado izquierdo). Si incluyes tus condiciones en corchetes, es lo mismo que si ejecutaras
el test. Por lo tanto, estas instrucciones son idénticas.
#!/bin/bash
El código anterior compara el primer argumento pasado al script. Si es hello, se ejecuta el primer bloque. Si no es
así, el script de comandos comprueba si es goodbye e invoca con el comando echo con un diferente mensaje
entonces. De lo contrario, se envía un tercer mensaje. Ten en cuenta que la variable $1 viene entre comillas y se
utiliza el operador de comparación de cadenas en lugar de la versión numérica (-eq).
Las pruebas if/elif/else pueden ser bastante detalladas y complicadas. La instrucción case proporciona una
forma distinta de hacer las pruebas múltiples más fáciles.
#!/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
La instrucción case comienza con la descripción de la expresión que se analiza: case EXPRESSION in. La
expresión aquí es $1 entre comillas.
A continuación, cada conjunto de pruebas se ejecutan como una coincidencia de patrón terminada por un paréntesis
de cierre. El ejemplo anterior primero busca hello o hi; múltiples opciones son separadas por la barra vertical | que
#!/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.
#!/bin/bash
i=0
while [ $i -lt 10 ]; do
echo $i
i=$(( $i + 1))
done
echo "Done counting"
El ejemplo anterior muestra un loop while que cuenta de 0 a 9. Un contador de variables, i, arranca en 0. Luego, un
loop while se ejecuta con un test siendo «is $i less than 10?» (o «¿es $i menor que 10?») ¡Ten en cuenta que el
loop while utiliza la misma notación que la instrucción if.
Dentro del loop while el valor actual de i es mostrado en pantalla, y luego se le añade 1 a través del
comando $((aritmética)) y se asigna de regreso al i. Una vez que i llega a 10, la instrucción while regresa
falso y el proceso continuará después del loop.
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 32 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:
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:~$
La salida al ejecutar este comando free muestra que el sistema fue ejecutado en un sistema que tiene un total de
1.894 megabytes y está utilizando actualmente 356 megabytes.
La cantidad de swap aparece ser aproximadamente 4 gigabytes, aunque nada de esto parece estar en uso. Esto tiene
sentido porque la gran parte de la RAM física está libre, así que en este momento no se necesita utilizar la RAM
virtual.
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)
Ejecutar el comando lspci con la opción -nn muestra un identificador numérico para cada dispositivo, así como la
descripción del texto original:
El comando lspci muestra información detallada sobre los dispositivos conectados al sistema a través del bus PCI.
Esta información puede ser útil para determinar si el dispositivo es compatible con el sistema, tal como se indica por
un Kernel driver o un Kernel module en uso, como se muestra en el último par de líneas de la salida anterior.
sysadmin@localhost:~$ lsusb
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
sysadmin@localhost:~$
La opción detallada, -v, del comando lsusb muestra una gran cantidad de detalles acerca de cada dispositivo:
sysadmin@localhost:~$ lsusb -v
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
root@localhost:~$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/sdc
root@localhost:~$
En el ejemplo siguiente se utiliza el comando fdisk para mostrar la información de la partición en el primer dispositivo
de sd.
Nota: El siguiente comando requiere acceso root
root@localhost:~# fdisk -l /dev/sda
Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000571a2
Página 159 de 265
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 39845887 19921920 83 Linux
/dev/sda2 39847934 41940991 1046529 5 Extended
/dev/sda5 39847936 41940991 1046528 82 Linux swap / Solaris
root@localhost:~#
Importante: Para ejecutar estos comandos tu sistema necesitará acceso a Internet. El comando apt-cache busca
repositorios de estos programas de software en Internet.
Si ya tienes instalada una versión anterior del paquete, entonces se actualizará. De lo contrario se ejecuta una nueva
instalación.
Si quieres actualizar todos los paquetes posibles, tienes que ejecutar el comando sudo apt-get upgrade.
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:
En el ejemplo anterior se muestra que el archivo /usr/bin/who es parte del paquete coreutils.
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.
Página 166 de 265
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.
Mientras que puedes quitar los paquetes de software con el comando rpm, éste no eliminará automáticamente los
paquetes de dependencia.
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.
Para consultar un paquete y obtener información o su estado ejecuta el comando rpm -qi package.
Para determinar si un archivo en particular fue puesto en el sistema de archivos como el resultado de la instalación de
un paquete utiliza el comando rpm -qf /path/to/file.
• El archivo /proc/cmdline puede ser importante porque contiene toda la información que le fue pasada al
kernel cuando fué iniciado.
• El archivo /proc/meminfo contiene información sobre el uso de memoria por el kernel.
• El archivo /proc/modules contiene una lista de módulos que están cargados actualmente en el kernel para
agregar funcionalidad extra.
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.
[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
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
Hay una extensa lista de comandos que se pueden ejecutar dentro del top:
Teclas Significado
ho? 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:
Los tres primeros números de este archivo indican la carga media sobre los intervalos pasados uno, cinco y quince
minutos. El cuarto valor es una fracción que muestra el número de los procesos ejecutando código actualmente en la
CPU 1 y el número total de los procesos 254. El quinto valor es el último valor de PID que ejecutó código en la CPU.
El número reportado como un promedio de carga es proporcional al número de los núcleos de CPU capaces de
ejecutar procesos. En una CPU de un solo núcleo un valor de uno significaría que el sistema está totalmente cargado.
En una CPU de cuatro núcleos un valor de uno significaría que 1/4 o el 25% del sistema está cargado.
Otra razón por la que los administradores mantienen ejecutado el comando top es la capacidad para monitorear el uso
de la memoria en tiempo real. Ambos comandos el top y el free muestran las estadísticas del uso general de la
memoria.
El comando top también puede mostrar el porcentaje de memoria utilizado por cada proceso, así pues, se puede
identificar rápidamente un proceso que está consumiendo una cantidad excesiva de memoria.
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
boot.log Mensajes generados cuando servicios se inician durante el arranque del sistema.
cron Mensajes generados por el demonio crond para las tareas que se deben ejecutar en forma recurrente.
maillog Mensajes producidos por el demonio de correo para mensajes de correo electrónico enviados o recibidos
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.
secure Mensajes de los procesos que requieren autorización o autenticación (por ejemplo, el proceso de inicio de
sesión).
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.
¿Principales ventajas de ser un profesional de Linux? Horarios de trabajo flexibles, teletrabajo, incrementos de
salario por arriba de la norma de la compañía, bonos más grandes.
El dispositivo de red es eth0. Los dispositivos de red se denominan eth0, eth1, etc. Para modificar este dispositivo
de red, haz clic en el nombre del dispositivo y haz clic en el botón Edit (o «editar» en español):
Si seleccionas Manual, puedes cambiar la dirección actual haciendo clic en el área donde actualmente se especifica la
dirección:
Ten en cuenta que si eliges Automatic (DHCP), la ubicación de las Direcciones se verá en gris y no se podrá
modificar:
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:
Si el dispositivo estuviera configurado para ser un cliente DHCP, entonces los valores IPADDR, GATEWAY y DNS1 no se
establecerían. Además, el valor BOOTPROTO se establecería a dhcp.
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
La configuración del servidor de nombres se establece a menudo en la dirección IP del servidor DNS. En el ejemplo
siguiente se utiliza el comando host que vamos a ver más adelante en este capítulo. Ten en cuenta que el servidor de
ejemplo se asocia con la dirección IP 192.168.1.2 por el servidor DNS:
También es común tener varias opciones de servidor de nombres, si un servidor DNS no responde.
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.
/etc/nsswitch.conf Este archivo se puede utilizar para modificar dónde se producen las búsquedas de
nombre de host. Por ejemplo, la configuración hosts : files dns buscaría los
nombres de host primero en el archivo /etc/hosts y después en el servidor DNS. Si
cambias a hosts: dns files, la búsqueda se lleva a cabo primero en el 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:~#
El dispositivo lo se conoce como el dispositivo de loopback (o «bucle invertido» en español). Es un dispositivo de red
especial utilizado por el sistema cuando éste envía datos basados en red a sí mismo.
El comando ifconfig también puede ser utilizado para modificar temporalmente la configuración de red.
Normalmente estos cambios deben ser permanentes, por lo que utilizar el comando ifconfig para hacer tales
cambios es algo bastante raro.
El comando ifconfig se está convirtiendo obsoleto en algunas distribuciones de Linux (en desuso) y está siendo
reemplazado por una forma del comando ip, específicamente ip addr show. Observa que también puedes encontrar
la misma información destacada anteriormente utilizando este comando:
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:~#
Si el comando ping falla, recibirás un mensaje que dice Destination Host Unreachable (o «Host de destino
inalcanzable» en español):
Es importante tener en cuenta que sólo porque el comando ping falle, no significa que el sistema remoto sea
realmente inalcanzable. Algunos administradores configuran sus máquinas para no responder a las solicitudes
de ping.
Esto suele pasar, porque un servidor puede ser atacado por algo que se llama ataque por denegación de servicio. En
este tipo de ataque, un servidor es saturado con un número masivo de paquetes de red. Al ignorar las peticiones
de ping, el servidor es menos vulnerable.
root@localhost:~# netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 137 0 4 0 12 0 0 0 BMRU
lo 65536 0 18 0 0 0 18 0 0 0 LRU
root@localhost:~#
Las estadísticas más importantes de la salida anterior son TX-OK y TX-ERR. Un alto porcentaje de TX-ERR puede
indicar un problema en la red, tal como mucho tráfico de red.
Si quieres utilizar el comando netstat para mostrar la información de enrutamiento, utiliza la opción -r:
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:~#
El comando netstat se utiliza comúnmente para mostrar puertos abiertos. Un puerto es un número único que está
asociado con un servicio proporcionado por un host. Si el puerto está abierto, el servicio está disponible para otros
hosts.
Por ejemplo, puedes iniciar sesión en un host desde otro host utilizando un servicio llamado SSH. El servicio SSH
tiene asignado el puerto #22. Si el puerto #22 está abierto, el servicio está disponible para otros hosts.
Es importante tener en cuenta que el host mismo también debe tener los servicios en ejecución; esto significa que
debe iniciarse el programa que permite a los usuarios remotos conectarse (que por lo general está iniciado en la
mayoría de las distribuciones de Linux).
Para ver una lista de todos los puertos actualmente abiertos, puedes utilizar el siguiente comando:
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:
En algunas distribuciones se puede ver el siguiente mensaje en la página man del comando netstat:
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.
Aunque el comando netstat no se sigue desarrollando, sigue siendo una excelente herramienta para visualizar
información de la red. El objetivo es eventualmente reemplazar el comando netstat por comandos como ss e ip. Sin
embargo, es importante tener en cuenta que esto puede tomar algún tiempo.
El comando netstat viene en este curso ya que está disponible en todas las distribuciones de Linux, todavía es
ampliamente utilizado y es un objetivo del examen de Linux Essentials (los comandos ss e ip no lo son).
;; 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.
Observa que la respuesta incluye la dirección IP de 192.168.1.2, lo que significa que el servidor DNS tiene la
dirección IP asociada a la información de traducción del nombre de host en su base de datos.
Si el servidor DNS no tiene la información solicitada, está configurado para mandar solicitud a otros servidores DNS. Si
ninguno de ellos tiene la información solicitada, recibirás un mensaje de error:
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 8
6400 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
Este error puede indicar que un host no autorizado ha reemplazado al host correcto. Consulta con el administrador del
sistema remoto. Si el sistema fuese recientemente reinstalado, tendría una nueva clave RSA, lo podría estar causando
este error.
En caso de que este mensaje de error es debido a que una máquina remota fue reinstalada, puedes eliminar el
archivo ~/.ssh/known_hosts de tu sistema local (o solo quitar la entrada para esa máquina en específico) e intentar
a conectarte de nuevo:
bob@test:~$ exit
logout
Connection to test closed.
sysadmin@localhost:~#
Advertencia: ¡Ten cuidado al utilizar el comando exit muchas veces, ya que se cerrará la ventana de la terminal en la
que estás trabajando!
“No tengo ninguna experiencia de trabajo en Linux, entonces ¿ Cómo obtengo un trabajo?Constatando tus
habilidades obteniendo un certificado reconocido por la industria que demuestra a los empleadores que tienes las
habilidades de hacer el trabajo.
Puede ser un gran forma de entrar a la primera compañía para que puedas ganar valor con la experiencia en el
trabajo.
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):
name root Es el nombre de la cuenta. Este nombre lo utiliza una persona cuando inicia
sesión en el sistema y cuando la propiedad del archivo viene proporcionada por
el comando ls -l. Por lo general, el sistema utiliza el ID de usuario (véase
abajo) internamente y se proporciona el nombre de cuenta para que a los
usuarios regulares se les haga más fácil referirse a la cuenta.
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.
comment root Este campo puede contener cualquier información sobre el usuario, incluyendo
su nombre real (completo) y otra información útil.
Este campo también se llama el campo GECOS (General Electric
Comprehensive Operating System). El GECOS es un formato predefinido usado
raramente para este campo que define una lista de elementos separada por
comas, incluyendo el nombre completo del usuario, ubicación de la oficina,
número de teléfono e información adicional.
home /root Este campo define la ubicación del directorio home del usuario. Para los
directory 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.TRNNpUdA
gUXUrzDuAPsYs5YHZNAorI1:15020:5:30:7:60:15050:
name sysadmin Este es el nombre de la cuenta, que coincide con el nombre de cuenta en el
archivo /etc/passwd.
password $6$.........rI1 El campo passwd contiene la contraseña cifrada de la cuenta. Esta cadena
muy larga (que está truncada en el ejemplo a la izquierda de esta celda) es un
cifrado unidireccional, lo que significa que no puede "revertirse" para
determinar la contraseña original.
Mientras que los usuarios habituales tienen contraseñas encriptadas en este
campo, las cuentas del sistema tendrán un carácter de * en este campo. Verás
más detalles sobre las cuentas de sistema más adelante en este capítulo.
last 15020 Este campo contiene un número que representa la última vez que la
change contraseña fue cambiada. El número 15020 es el número de días desde el 01
de enero de 1970 (llamada la Época) y el último día en el que la contraseña
de la cuenta fue cambiada.
Este valor se genera automáticamente cuando se modifica la contraseña del
usuario. Este valor es importante ya que se utiliza por característica
de envejecimiento de la contraseña proporcionado por el resto de los campos
de este archivo.
max 5 Este campo se utiliza para obligar a los usuarios a cambiar regularmente sus
contraseñas. Un valor de 30 en este campo significa que el usuario debe
cambiar su contraseña al menos cada 30 días para evitar que su cuenta quede
«bloqueada»
Ten en cuenta que si el campo min se establece en 0, el usuario puede
restablecer inmediatamente su contraseña al valor original, anulando el
propósito de obligar al usuario a cambiar su contraseña cada 30 días. Así
que, si se establece el campo max, normalmente se establece también el
campo min.
Por ejemplo, un min:max de 5:60 se refiere a que el usuario debe cambiar
su contraseña cada 60 días y, después de cambiarla, el usuario debe esperar 5
días antes de que pueda cambiar su contraseña otra vez.
Si el campo max se establece a 99999, el valor máximo posible, entonces el
usuario esencialmente nunca debe cambiar su contraseña (porque 99999 días
son aproximadamente 274 años).
expire 15050 Este campo representa el número de días a partir del 01 de enero del 1970 y
el día en el que la cuenta «vencerá». Una cuenta vencida se bloqueará, no se
borra, lo que significa que el administrador puede restablecer la contraseña
para desbloquear la cuenta.
reserved Actualmente este campo no se utiliza y está reservado para su uso futuro.
Los usuarios regulares no pueden ver el contenido del archivo /etc/shadow por razones de seguridad. Para ver el
contenido de este archivo, debes iniciar la sesión como administrador (la cuenta root).
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=unconfin
ed_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
En el archivo /etc/shadow, las cuentas del sistema tendrán típicamente el carácter * en lugar del campo de
contraseña:
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
group_name mail Este campo contiene el nombre del grupo. Igual que en el caso de los
nombres de usuario, para las personas es más fácil recordar los
nombres de grupo. El sistema utiliza típicamente IDs de grupos (GID)
en lugar de nombres de grupo.
GID 12 Cada grupo está asociado con un ID de grupo único (GID) que se coloca
en este campo.
user_list mail,postfix Este último campo se utiliza para indicar quién es un miembro del
grupo. Mientras que la pertenencia a un grupo primario se define
en el archivo /etc/passwd, los usuarios que se asignan a los
grupos adicionales tendrían su nombre de usuario en este campo
del archivo /etc/group.
En este caso, los usuarios mail y postfix son miembros
secundarios del grupo mail.
Es muy común para un nombre de usuario aparecer también
como un nombre del grupo. También es común que un usuario
pertenezca a un grupo con el mismo nombre.
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:
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.
Ya que la cuenta root se utiliza de forma predeterminada con el comando su, los siguientes dos comandos son
maneras equivalentes de iniciar un shell como usuario root:
su - root
su -
Después de presionar Entrar para ejecutar uno de estos comandos, el usuario debe proporcionar la contraseña del
usuario root para iniciar el shell como usuario root. Si no sabes la contraseña de la cuenta a la que te estás moviendo,
entonces el comando su fallará.
Después de usar el shell iniciado con el comando su para realizar las tareas administrativas necesarias, vuelve a tu
shell original (y a la cuenta de usuario original) mediante el comando exit.
sysadmin@localhost:~$ su -
Password:
root@localhost:~# id
uid=0(root) gid=0(root) groups=0(root)
root@localhost:~# exit
logout
sysadmin@localhost:~$ id
uid=1001(sysadmin) gid=1001(sysadmin) groups=1001(sysadmin),4(adm),27(sudo)
sysadmin@localhost:~$
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.
Utilizando el comando visudo se abrirá el archivo de configuración /etc/sudoers para editar. Configuraciones
avanzadas del comando sudo se pueden realizar a través de este archivo, pero están más allá del alcance de este
curso. Básicamente, en este archivo se realizan las entradas para especificar qué usuario (usuarios) y en cuáles de las
máquinas pueden utilizar el comando sudo para ejecutar los comandos como otro usuario.
Esta entrada predeterminada...
...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)
username root Esta columna indica el nombre del usuario que inició la 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».
terminal tty2 Esta columna indica en qué ventana de terminal está trabajando el usuario.
Si el nombre de la terminal inicia con tty , entonces esto es una indicación
de un inicio de sesión local, está es una terminal de línea de comandos
regular.
Si el nombre de la terminal inicia con pts, entonces esto indica que el
usuario está usando una pseudo terminal o corriendo un proceso que actúa
como la terminal. Esto puede significar que el usuario tiene una aplicación de
terminal corriendo en X Windows, como gnome-terminal o xterm o pueden
haber usado un protocolo de red para conectarse al sistema,
como ssh o telnet.
Si quieres visualizar la información sobre el estado del sistema, el comando who puede hacerlo utilizando varias
opciones. Por ejemplo, la opción -b mostrará la última vez que el sistema se inició (fue arrancado) y la opción -
r mostrará el tiempo en el cual el sistema haya alcanzado un cierto nivel ejecució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
La primera línea de la salida del comando w es idéntica a la comando uptime. Muestra la hora actual, cuánto tiempo el
sistema ha estado funcionando, el número total de inicios de sesión actuales (usuarios) y el promedio de la carga en el
sistema en los últimos 1, 5 y 15 minutos. El promedio de carga es el uso de la CPU donde un valor de 100 significaría
un uso completo de la CPU durante ese periodo de tiempo.
La tabla siguiente describe el resto de la salida del comando 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.
IDLE 43:44 Cuánto tiempo el usuario ha estado inactivo desde la ejecución del último comando.
JCPU 0.01s El tiempo total de cpu (s=segundos) utilizado por todos los procesos (programas)
ejecutados desde el inicio de sesión.
¿Quién es LPI? El Linux Professional Institute (o «Instituto Profesional de Linux» en español) es una organización
comprometida en ayudar miembros de la comunidad de Linux y de código abierto, crecer en sus oportunidades
profesionales, ofreciendo recursos profesionales y certificaciones de habilidades.
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:
Si no se proporciona la opción -g, el comando groupadd proporcionará automáticamente un GID para el grupo nuevo.
Para lograr esto, el comando groupadd ve el archivo /etc/group y utiliza un número que es de un valor mayor que el
mayor número GID actual. La ejecución de los comandos siguientes ilustra esto:
• 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
Después del comando groupmod anterior, el archivo index.html tiene un nombre de propietario de grupo diferente.
Sin embargo, todos los usuarios que estaban en el grupo sales están ahora en el grupo clerks, así pues, todos los
usuarios aún pueden acceder el archivo index.html. Una vez más, esto es porque el grupo se define por el GID, no
por el nombre del grupo.
Por otro lado, si cambias el GID para un grupo, entonces todos los archivos que fueron asociados a ese grupo ya no
estarán asociados a ese grupo. De hecho, todos los archivos que fueron asociados a ese grupo ya no estarán
asociados con ningún nombre de grupo. Por el contrario, estos archivos serán propiedad de un GID solamente tal
como se muestra a continuación:
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
Página 218 de 265
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
GROUP 100 En las distribuciones que no usan UPG, este será el grupo principal de
forma predeterminada para un usuario nuevo, si no se ha especificado
uno con el comando useradd. Este normalmente es el grupo de «users»
(«usuarios» en español) con un GID de 100.
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 -g para el comando useradd permite utilizar un grupo
principal 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.
SKEL /etc/skel El valor SKEL determina qué directorio «esqueleto» tendrá su contenido
copiado en el directorio home de los usuarios nuevos. El contenido de
este directorio se copia en el directorio home del usuario nuevo y el
nuevo usuario recibe la propiedad de los nuevos archivos.
Esto proporciona a los administradores una manera fácil de «rellenar»
una nueva cuenta de usuario con los archivos de configuración clave.
La opción -k para el comando useradd permite utilizar un
directorio SKEL diferente al predeterminado, cuando se crea una nueva
cuenta de usuario.
Para modificar uno de los valores por defecto del useradd, el archivo /etc/default/useradd puede editarse con
un editor de texto. Otra técnica (más segura) es usar el comando useradd -D.
Por ejemplo, si quieres permitir a los usuarios con una contraseña caducada seguir iniciando la sesión con un máximo
de treinta días, puedes ejecutar lo siguiente:
El ejemplo anterior representa un típico archivo /etc/login.defs de la distribución CentOS 6 con sus valores. La
siguiente tabla describe cada uno de estos valores:
MAIL_DIR /var/mail/spool El directorio en el que se crea el archivo mail spool del usuario.
PASS_MAX_DAYS 99999 Esta configuración determina el número máximo de días en los que
un usuario podrá utilizar la misma contraseña. Puesto que por
defecto viene configurado el valor de 99999 días o más de 200 años,
significa que los usuarios nunca tienen que cambiar su contraseña.
Las organizaciones con políticas eficaces para el mantenimiento de
contraseñas seguras comúnmente cambian este valor a 60 o 30 días.
Esta configuración afecta a la configuración por defecto del
archivo /etc/shadow resaltado abajo:
bob:pw:15020:5:30:7:60:15050:
PASS_MIN_LEN 5 Esto indica el número mínimo de caracteres que debe contener una
contraseña.
UID_MAX 60000 Un UID técnicamente podría tener un valor de más de 4 billones. Para la
máxima compatibilidad se recomienda dejarlo en su valor
predeterminado de 60000.
GID _MIN 500 El GID_MIN determina el primer GID que se asignará a un grupo
ordinario. Cualquier grupo con un GID menor que este valor, ya sea para
un grupo del sistema o bien para el grupo de root.
GID _MAX 60000 Un GID igual que un UID técnicamente podría tener un valor de más de 4
billones. Cualquier valor que utilices para tu UID_MAX debes utilizar
para GID_MAX para soportar UPG.
CREATE_HOME yes Este valor determina si se crea o no un nuevo directorio para el usuario,
al crear su cuenta.
UMASK 077 Este UMASK funciona en el momento que se crea el directorio home
del usuario; determinará cuáles serán los permisos predeterminados
de este directorio. Utilizando el valor predeterminado
de 077 para UMASK significa que sólo el usuario propietario tendrá
algún tipo de permiso para acceder a su directorio.
UMASK se cubrirá en detalle en un capítulo posterior.
USERGROUPS_ENAB yes En las distribuciones que cuentan con un grupo privado para cada
usuario, como se muestra en este ejemplo CentOS,
el USERGROUPS_ENAB tendrá un valor de yes. Si no se utiliza la UPG en
la distribución, entonces esto tendrá un valor no.
ENCRYPT_METHOD SHA512 El método de cifrado que se utiliza para cifrar las contraseñas de los
usuarios en el archivo /etc/shadow. El valor
de ENCRYPT_METHOD anula la configuración
de MD5_CRYPT_ENAB (véase el siguiente renglón).
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.
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:~#
• 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.
Sin embargo, el hecho de requerir a un usuario que cambie su contraseña a menudo podría plantear
problemas de seguridad, incluyendo:
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.
-d LAST_DAY --lastday LAST_DAY Fijar la fecha del último cambio de contraseña a LAST_DAY
-I INACTIVE --inactive Configurar la cuenta para permitir acceso INACTIVE días después de que la
INACTIVE
contraseña caduque.
-m MIN_DAYS --mindays MIN_DAYS Definir el número mínimo de días antes de que se pueda cambiar la
contraseña a MIN_DAY
-M MAX_DAYS --maxdays MAX_DAYS Definir el número máximo de días antes de que se pueda cambiar la
contraseña a MAX_DAY
-W WARN_DAYS --warndays Establecer el número de días antes de que caduque una contraseña para
WARN_DAYS
mostrar una advertencia a WARN_DAYS
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:
-f INACTIVE --inactive INACTIVE Configurar la cuenta para permitir acceso INACTIVE días después de que
la contraseña caduque.
-G GROUPS --groups GROUPS Establecer grupos adicionales a una lista especificada en GROUPS.
Varias de estas opciones son importantes debido a la forma en la que afectan la administración de usuarios. Puede ser
muy complicado cambiar el UID del usuario con la opción -u, ya que los archivos pertenecientes al usuario quedarán
huérfanos. Por otra parte, especificando un nuevo nombre de inicio de sesión para el usuario con la opción -l no
resulta en archivos huérfanos.
Borrar un usuario con el comando userdel (véase la sección siguiente) puede resultar en archivos huérfanos o
eliminados del usuario del sistema. En vez de eliminar la cuenta, otra opción es bloquear la cuenta con la opción -
L del comando usermod. El bloqueo de una cuenta evita que la cuenta se utilice, pero sigue siendo propietario de los
archivos.
Hay algunas cosas importantes que debes saber sobre el manejo de los grupos suplementarios. Si utilizas la opción -
G sin la opción -a, debes listar todos los grupos a los que perteneciera el usuario. Usando solamente la opción -
G puede accidentalmente quitar un usuario de todos los anteriores grupos suplementarios a los que pertenece.
Si utilizas la opción -a sin la opción -G, solamente tienes que listar los grupos nuevos a los que perteneciera el
usuario. Por ejemplo, si el usuario jane pertenece actualmente a los grupos wheel y research, entonces para agregar
su cuenta al grupo de desarrollo, ejecuta el siguiente comando:
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.
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:
El comando newgrp abre un shell nuevo; mientras el usuario permanece en ese shell, el grupo primario no cambiará.
Para cambiar el grupo principal hacia el original, el usuario podría abandonar el shell nuevo ejecutando el
comando exit. Por ejemplo:
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
Se requieren privilegios administrativos para cambiar permanentemente el grupo primario del usuario. El usuario root
ejecutaría el comando usermod -g groupname username.
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:
Si un usuario intenta modificar la propiedad de grupo de un archivo que no posee, recibirá un mensaje de error:
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
Página 236 de 265
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:
- Un archivo normal que puede estar vacío, contener texto o datos binarios.
d Un archivo de directorio que contiene los nombres de otros archivos y enlaces a los mismos.
l Un enlace simbólico es un nombre de archivo que hace referencia (apunta) a otro archivo.
b Un archivo de bloque es el que se refiere a un dispositivo de hardware de bloque donde los datos se leen en
bloques de datos.
c Un archivo de caracteres es aquel que se refiere a un dispositivo de hardware de caracteres, donde se leen los
datos un byte a la vez.
p Una archivo «pipe» («barra vertical» en español) funciona de forma similar al símbolo de barra vertical
(«pipe» en inglés), lo que permite a la salida de un proceso comunicarse con otro proceso por el archivo
«pipe», donde se utiliza la salida de un proceso como entrada para el otro proceso.
s Un archivo de socket permite que se comuniquen dos procesos, donde se permite a ambos procesos enviar o
recibir datos.
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:
r El proceso puede leer el contenido del archivo, es Los nombres de archivo en el directorio se pueden
decir, los contenidos se pueden ver y copiar. enumerar, pero otros detalles no están disponibles.
w El proceso puede escribir en este archivo, por lo que Los archivos se pueden agregar a un directorio o quitar
los cambios se pueden guardar. Ten en cuenta que del mismo. Ten en cuenta que el permiso w requiere el
el permiso w realmente requiere el permiso r en un permiso x en el directorio para que funcione
archivo para que funcione correctamente. correctamente.
x El archivo se puede ejecutar o correr como un El usuario puede utilizar el comando cd para «entrar»
proceso. al directorio y utilizar el directorio en una ruta de
acceso para acceder a los archivos y, potencialmente,
a los subdirectorios de este directorio.
La información importante viene resaltada. El primer cuadro representa el directorio / con un usuario propietario root,
un grupo propietario root y los permisos rwxr-xr-x. El segundo cuadro representa el directorio /data, un directorio
que está bajo el directorio /. El tercer cuadro representa el archivo abc.txt, que se almacena en el directorio /data.
También debes entender que si eres el propietario del archivo/directorio, entonces sólo los permisos de propiedad de
usuario se utilizarán para determinar el acceso a ese archivo/directorio.
Si no eres el propietario, pero eres un miembro del grupo que posee el archivo/directorio, entonces sólo los permisos
de propiedad de grupo se utilizarán para determinar el acceso a ese archivo o directorio.
Si no eres el propietario y tampoco eres un miembro del grupo de archivos o directorios, entonces los permisos serían
«otros».
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.
Sin embargo, ten en cuenta que para ver los datos de los archivos (ls -l) requiere tambien el permiso x en el
directorio. Así que mientras el usuario root y los miembros del grupo root tienen este acceso en el directorio /data,
otros usuarios no pueden ejecutar ls -l /data.
Lección aprendida: El permiso r permite a un usuario ver un listado del directorio.
Respuesta: Verdadero
Explicación: Como se mencionó anteriormente, para acceder a un archivo, el usuario debe tener acceso al directorio.
El acceso al directorio sólo requiere el permiso x; aunque el permiso de r sería útil para listar los archivos en un
directorio, no se necesita para «entrar» en el directorio y acceder a los archivos dentro del directorio.
Cuando se ejecuta el comando more /data/abc.txt, se comprueban los siguientes permisos: el permiso x en el
directorio /, el permiso x en el directorio data y el permiso r en el archivo abc.txt. Puesto que el usuario bob tiene
todos estos permisos, el comando se ejecuta con éxito.
Lección aprendida: El permiso x se necesita para «entrar» a un directorio, pero no se necesita el permiso r en el
directorio, a menos, que quieras listar el contenido del directorio.
Respuesta: Falso
Explicación: Recuerda que si eres el propietario de un archivo, entonces sólo los permisos que son validados son los
del usuario propietario. En esta caso, sería --- para bob en el archivo /data/abc.txt.
En este caso, los miembros del grupo de bob y «otros» tienen más permisos sobre el archivo que los que tiene bob.
Lección aprendida: No proporciones permisos para el grupo propietario y «otros» sin aplicar al menos el mismo nivel
de acceso para el propietario del archivo.
Importante: Para cambiar los permisos de un archivo, necesitas ser el propietario del archivo o iniciar la sesión como
el usuario root.
Si quieres modificar algunos de los permisos actuales, el método simbólico probablemente será más fácil de usar. Con
este método especifícas que permisos quieres cambiar en el archivo y los permisos de otros permanecen siendo como
son.
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)
Usando una combinación de números del 0 al 7, cualquier combinación de permisos posible para leer, escribir y
ejecutar se pueden especificar por un conjunto de permisos individuales. Por ejemplo:
7 rwx
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:
archivo rw-rw-rw-
directorios rwxrwxrwx
Los permisos que se establecen inicialmente en un archivo cuando se crea no pueden exceder rw-rw-rw-. Para
tener el permiso de ejecución para un archivo, primero tienes que crear el archivo y luego cambiar los permisos.
El comando umask se puede utilizar para mostrar el valor umask actual:
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
(valor predeterminado)
Umask -027
Resultado 640
La umask 027 significa que, por defecto los archivos nuevos recibirían los permisos 640 o rw-r----- tal como se
demuestra a continuación:
Página 247 de 265
sysadmin@localhost:~$ umask 027
sysadmin@localhost:~$ touch sample
sysadmin@localhost:~$ ls -l sample
-rw-r-----. 1 sysadmin sysadmin 0 Oct 28 20:14 sample
Debido a que los permisos predeterminados para los directorios son diferentes que para los archivos, una
umask 027 daría lugar a diferentes permisos iniciales sobre los nuevos directorios:
(valor predeterminado)
Umask -027
Resultado 750
La umask 027 significa que, por defecto los directorios nuevos recibirían los permisos 750 o rwxr-x----- tal como
se demuestra a continuación:
La nueva umask sólo se aplicará a un archivo y los directorios creados durante esa sesión. Cuando arranque un nuevo
shell, la umask por defecto será efectiva de nuevo.
Cambiar permanentemente la umask requiere la modificación del archivo .bashrc que se encuentra en el directorio
home del usuario.
Es bueno ser buscado. 75% de los profesionales de Linux han recibido una llamada de un reclutador en los últimos 6
Meses. Casi la mitad recibieron más de 6 llamadas.
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
Observa el resultado del comando ls anterior; el permiso setuid está representado por s en los permisos de
propietario, donde normalmente se esperaría el permiso de ejecución.
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.
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
Ten en cuenta que el grupo tty tiene permiso de escritura en los archivos anteriores, mientras que los usuarios que
no están en el grupo tty ( «otros») no tienen permisos en estos archivos. Sin el permiso setgid, el
comando /usr/bin/wall fallaría.
Entonces, ¿Por qué el administrador configuraría un directorio setgid? En primer lugar, ten en cuenta las siguientes
cuentas de usuario:
Estos tres usuarios necesitan trabajar en un proyecto conjunto. Se acercan al administrador para solicitar un directorio
compartido en el que puedan trabajar juntos, pero que nadie más pueda acceder a sus archivos. El administrador hace
lo siguiente:
Como resultado, bob, sue y tim pueden acceder al directorio /home/team y agregar archivos. Sin embargo, hay un
problema potencial: cuando bob crea un archivo en el directorio /home/team, los detalles del nuevo archivo se ven
así:
Desafortunadamente, mientras sue y tim pueden acceder al directorio /home/team, no pueden hacer nada con el
archivo de bob. Sus permisos para ese archivo son los permisos de «otros» (---).
Si el administrador estableciera el permiso setgid al directorio /home/team, entonces, cuando bob crea el archivo, se
vería de la siguiente manera:
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):
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
Debido a que tanto el archivo passwd como el mypasswd tienen el mismo número de inodo, en realidad, son el mismo
archivo. Puedes acceder a los datos del archivo utilizando cualquiera de los dos nombres de archivo.
Al ejecutar el comando ls -l, el número que aparece para cada archivo entre los permisos de usuario y el propietario
es la cuenta de enlaces:
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
sysadmin@localhost:~$ ls -l /etc/grub.conf
lrwxrwxrwx. 1 root root 22 Feb 15 2011 /etc/grub.conf -> ../boot/grub/grub.conf
sysadmin@localhost:~$ ls -i file.original
278772 file.original
sysadmin@localhost:~$ find / -inum 278772 2> /dev/null
/home/sysadmin/file.hard.1
/home/sysadmin/file.original
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:
En el ejemplo anterior, se intentó crear un enlace físico entre un archivo en el sistema de archivos /boot y el sistema
de archivos /; éste falló porque cada uno de estos sistemas de archivos tiene un conjunto único de números de inodo
que no se pueden utilizar fuera del sistema de archivos.
Sin embargo, debido a que un enlace simbólico apunta a otro archivo con un nombre de ruta, se puede crear un
vínculo simbólico a un archivo en otro sistema de archivos:
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
El estándar FHS define cuatro jerarquías de directorios utilizados en la organización de los archivos del sistema de
archivos. El nivel superior o jerarquía root viene seguido por:
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/lib Las librerías de soporte para los archivos ejecutables en los directorios /usr/bin y /usr/sbin
/usr/libexec Los programas ejecutables utilizados por otros programas y no directamente por los usuarios
/usr/sbin Los binarios del sistema para su uso por el administrador en modo multiusuario
La jerarquía /usr/local sirve para la instalación del software que no se origina con la distribución. A menudo, este
directorio se utiliza para software que se complia a partir del código fuente. Los directorios de tercer nivel comunes que
se encuentran bajo el directorio /usr/local se describen en la siguiente tabla:
/usr/local/include Los archivos que necesitan ser incluidos con el fin de compilar el código fuente
local
/usr/local/lib Los archivos de la librería de soporte para los archivos ejecutables en los
directorios /usr/local/bin y /usr/local/sbin
/usr/local/sbin Los binarios locales para uso del administrador del sistema
/usr/local/share Ubicación para almacenar las páginas man, páginas de información, y otra
información de aplicaciones locales
/usr/local/src La ubicación en la que menudo se coloca el código fuente de software para ser
compilado localmente