Está en la página 1de 244

LINUX ESSENTIAL

2. Operating System
Un sistema operativo es un software que corre en un dispositivo informático que administra el
hardware y el software que componen un sistema informático. También programan programas para
correr en multitarea compartiendo el procesador.

2.1.2 Puntos de decisión

Role
La primera decisión al especificar cualquier sistema informático es el rol de la maquina,
¿productividad, familiar, etc., ofrecerá servicios remotos a usuarios?.

Los servidores por lo general son administrados por la CLI, sin embargo los Desktop se usan por
GUI (Interfaz gráfica)

Function
Determinar la función de la máquina, ¿usa software o tiene funciones especificas? ¿Cuál es el skill-
set (conjunto de habilidades) del equipo que administra la máquina?

Life Cycle

La vida útil del servicio y la tolerancia al riesgo deben determinarse. Los upgrade de los SO y de
SW se realizan periódicamente, a esto se le llama release cycle. Los proveedores solo soportan
viejas versiones de software por un determinado tiempo antes de no ofrecer ninguna actualización,
esto se llama maintenance cicle o life cicle.

En un entorno empresarial, “release cycle” y “maintenance cycle” se consideran críticos porque


lleva tiempo y es caro hacer grandes upgrades. En cambio el hardware se cambia para tener un
mayor rendimiento, los recursos involucrados suelen ser más costosos que el hardware.

Hay una gran cantidad de trabajo involucrado en la actualización de un servidor debido a


configuraciones especializadas, parches de software de aplicación y pruebas de usuario, por lo que
una organización proactiva buscará maximizar su retorno de la inversión en capital humano y
monetario.
Los centros de datos modernos están abordando este desafío a través de la virtualización. En un
entorno virtual, una máquina física puede alojar docenas, o incluso cientos de máquinas virtuales,
disminuyendo los requisitos de espacio y energía, además de proporcionar la automatización de
muchas de las tareas realizadas previamente manualmente por los administradores de sistemas.
Los programas de secuencias de comandos permiten crear, configurar, implementar y eliminar
máquinas virtuales de una red sin la necesidad de intervención humana. Por supuesto, un humano
todavía necesita escribir el script y monitorizar estos sistemas, al menos por ahora.

Stability

Las versiones de software pueden ser categorizadas como beta o stable, dependiendo de donde están
en el release cycle (ciclo de versión). Cuando una versión tiene muchas características nuevas que
no se han probado, se conoce como beta. Después de ser probado en campo, esto cambia a stable.

Los usuarios que necesitan las últimas funciones pueden decidir usar la beta. Esto a menudo se
realiza en la fase de implementación y proporciona la capacidad de solicitar funciones que no están
disponible en la versión estable.

Los servidores de producción usan versiones estables a menos que necesiten características que no
estén disponibles, y el riesgo de ejecutar código que no haya sido probado exhaustivamente sea
mayor que la utilidad proporcionada.

El software de código abierto suele lanzarse muy pronto en su proceso de desarrollo, esto
proporciona comentarios para correcciones en el código.

Por el contrario el software propietario a menudo se mantendrá en secreto durante la mayor parte de
su desarrollo, y sólo llegará a la fase beta cuando esté casi listo para su lanzamiento.

Compatibility

Backward compatibility es el termino que se refiere a la capacidad de la compatibilidad de los


sistemas operativos con software creados para versiones anteriores. Esto suele preocupar cuando es
necesario actualizar el sistema operativo, pero la actualización del software de una aplicación o es
costosa o no está disponible.

La normal del desarrollo de software de código abierto es la compatibilidad con versiones


anteriores. Mantener y versionar las bibliotecas de funciones ayuda. Por lo general, un biblioteca
que utilizada por uno o más programas se versiona como una nueva versión cuando existen cambios
significativos, y manteniendo sus funciones anteriores.

Cost

La virtualización y subcontratación de servicios es la nueva oferta IT. Es más rápido contratar y


pagar por lo que uses que construir y exceder de la capacidad.
2.3 Apple macOS
A menudo los usuarios de macOS requieren menos soporte que las implementaciones estándar de
Microsoft. Para los usuarios la elección de la aplicación que van a usar determina la elección del sistema
operativo.

El hardware de Apple al estar estrechamente integrado con el sistema operativo y su insistencia en el


cumplimiento de los estándares en la programación de aplicaciones les brinda a los creativos
profesionales (editores de video, producción de gráficos,etc…) una plataforma estable para realizar
muchas funciones de computación intensa con menos preocupaciones por la compatibilidad.

2.4 Linux
Una distribución de Linux es un paquete de software que está compuesto por el Core de Linux, utilidades,
herramientas de administración e incluso algún software de aplicación en un paquete que también incluye
los medios para actualizar el software central e instalar aplicaciones adicionales.

La distribución se encarga de configurar el almacenamiento, construir el núcleo, instalar los controladores


de hardware, así como también de instalar aplicaciones y utilidades para crear un sistema informático
completamente funcional. Los desarrolladores también incluyen herramientas para administrar el sistema,
un administrador de paquete para agregar y eliminar software, así como programas para proporcionar
parches de seguridad y funcionalidad.

Los gobiernos y las grandes empresas pueden preferir elegir distribuciones con soporte comercial porque
pagar por otro nivel de soporte puede ser mejor que arriesgarse a grandes interrupciones. Las
preocupaciones sobre seguridad se abordan a través de la comunidad de código abierto que busca
vulnerabilidades en los cambios que se realicen en el kernel, aportando informes y soluciones a una escala
mucho mayor que los proveedores de código cerrado.

Los proveedores de aplicaciones eligen un subconjunto de distribuciones a soportar. Las diferentes


distribuciones tienen diferentes versiones de bibliotecas de clave y es dificil para una empresa admitir
todas estas versiones diferentes.

Life Cycle
Las distribuciones de Linux pueden clasificarse en dos categorías principales:

• Entusiastas; Tienen un ciclo de actualización rápido, no es compatible con la empresa y no puede


contener (o descartar) funciones o software en la próxima versión que está en la actual. E.g.
Tumbleweed OpenSuse. El proyecto Fedora de Red Hat utiliza un método similar de desarrollo
y de ciclo de lanzamiento, al igual que Ubuntu Desktop.
• Empresariales; Son lo contrario ya que se aseguran de ser estables y consistentes, y ofrecen
soporte de nivel empresarial durante periodos prolongados, de 5 a 13 años en el caso de Suse.
Las distribuciones empresariales son mucho menores, ofrecidas principalmente por Red Hat,
Canonical y Suse.
El software de aplicación se puede escribir para una sola versión de una distribución, esto
provoca que los usuarios tengan que permanecer en un sistema operativo más tiempo y menos
seguro. Se considera que que algunas versiones de Linux tengan soporte a largo plazo, 5 años o
más (LTS) , mientras que otras sólo son compatibles con 2 años o menos.

Stability
Algunas distribuciones ofrecen versiones estable, testing e inestable. La primera fase es
iunstable, después de depurar errores y que las aplicaciones continúen en el sistema, pasa a testing
para probarla, y por último a stable.

Otras distribuciones como Fedora lanza versiones beta para minimizar los errores. Fedora se
considera la version beta de Red Hat. Las características se agregan o se cambian en Fedora antes de
llegar a la distribución de Red Hat.

Open SUSE y SLES (Open SUSE Enterprise System) son similares, la edición comunitaria
se usa como campo de pruebas para las características y funciones que eventualmente se cambiará a
la version empresarial. La migración de funciones y características suele ser más fácil porque las
bases de código de distribución son casi identicas.

Cost
La distribución puede ser de costo cero, pero pagar por el soporte puede valer la pena
dependiendo de las necesidades y capacidades de la organización.

2.4.1 Linux Distributions

Red Hat

Comenzó como una distribución simple que introdujo el “Red Hat Package Administrator (RPM)”,
Administrador de Paquetes de Red Hat. Red Hat se centró en aplicaciones de servidor, como
servicio web y de archivos, y lanzo Red Hat Enterprise Linux (RHEL), que era un servicio en pago
de lanzamiento largo. El ciclo de lanzamiento dicta la frecuencia con la que se actualiza el software.
Una empresa puede valorar la estabilidad y preferir ciclos de lanzamiento largos, mientras que un
aficionado o startup prefiere el último software y optar por un ciclo de lanzamiento corto. Para
satisfacer al último grupo Red Hat patrocina el proyecto Fedora, que crea un escritorio personal con
el último software, y tiene los cimientos de la versión empresarial. CentOS y otros similares
(Scientific Linux) son en gran medida compatibles con RHEL e integran algunos software más
nuevos, pero no ofrecen el soporte pagado que Red Hat ofrece.
Scientific Linux , basada en Red Hat, es una distribución patrocinada por Fermilab y tiene uso
especifico, computación cientifica. Entre alguna de sus aplicaciones están los aceleradores de
partículas, incluido el gran Colisionador de Hadrones (Large Hadron Collider) en el CERN

SUSE

Orginalmente derivado de Slackware, fue una de las primeras distribuciones completas de Linux,
tiene muchas similitudes con Red Hat.
SUSE Linux Enterprise contiene código patentado y se vender como producto de un servidor,
OpenSUSE es una versión abierta y gratuita con múltiples paquetes de escritorio similar a CentOS y
Linux Mint 1.

Debian

Debian creó su propio sistema de gestión de paquetes basado en el formato de archivo .deb . Ubuntu
es la distribución más popular derivada de Debian. Es la creación de Canonical, una compañía que
se creo para impulsar el crecimiento de Ubuntu y ganar dinero con el soporte. Ubuntu tiene varias
variaciones para servidor y escritorio, y varias aplicaciones especializadas. También ofrece una
versión LTS que se mantiene actualizada durante 3 años en escritorio y 5 años en servidores, lo que
brinda a los desarrolladores y a las empresas en las que trabajan con confianza para construir
soluciones basadas en una distribución estable.
Linux Mint se inicio como una bifurcación de Ubuntu Linux. Existen varias versiones, todas
gratuitas, pero alguna incluyen códecs patentados, que no pueden distribuirse sin restricciones de
licencia en ciertos paises.

Android

Linux es el núcleo y muchos de los comandos son parte del paquete GNU. Es por eso que algunas
personas insistan en usar GNU/Linux en vez de Linux solamente.
Android, patrocinada por Google, es la distribución Linux más popular del mundo. Android usa la
maquina virtual Dalvik con Linux, proporcionando una plataforma robusta para dispositivos
móviles. Sin embargo, al carecer de los paquetes que tradicionalmente se distribuyen en Linux
(como GNU y Xorg), Android generalmente es incompatible con las distribuciones de Linux
escritorio.
Esta incompatibilidad significa que un usuario de Red Hat o Ubuntu no pueden descargar software
de la tienda de Google Play. Del mismo modo, un emulador de terminal en Android carece de
muchos de los comandos de sus homólogos en Linux. Sin embargo, es posible utilizar BusyBox con
Android para permitir que la mayoría de los comandos funcionen.

Otros

Raspbian es una distribución especializada y optimizada de Linux para hardware de Raspberry Pi .


Esta combinación ha tenido un uso significativo en la capacitación de programadores y diseñadores
de hardware en todos los niveles. Su bajo costo y facilidad de uso lo han convertido en el favorito
de educadores, hay proyectos de monitoreo ambiental, diseño de circuitos, aprendizaje automático,
robótica, etc.
Linux From Scratch (LFS) es más una herramienta de aprendizaje que una distribución funcional.
Este proyecto consiste en un libro en linea y un código fuente, con “instrucciones paso a paso” para
construir una distribución Linux personalizada desde el código fuente. Esta “distribución” encarna
el verdadero espíritu de Linux por el cuál los usuarios pueden modificar cualquier aspecto del
sistema operativo y aprender como funcionan todas las piezas juntas. También es un buen punto de
partida para cualquiera que necesite una funcionalidad especializada o una construcción ultra
compacta para un proyecto de sistema integrado.

2.4.2 Embedded Systems

Linux comenzó como algo que solo se ejecutaría en una computadora como la de Linus Torvald:
una PC Intel 386 con un controlador de disco duro específico, pero como cualquiera podía agregar o
cambiar Linux, la gente comenzó a crear soporte para otro hardware. Finalmente, Linux comenzó a
admitir otros chips con énfasis en el tamaño pequeño y el bajo consumo de energía.
Debido a esta flexibilidad, un número significativo de fabricantes de dispositivos ha utilizado Linux
como sistema operativo para sus productos de hardware. Hoy llamamos a estos sistemas integrados
porque están diseñados para realizar una tarea específica en hardware optimizado solo para ese
propósito. Estos sistemas abarcan una tremenda diversidad de dispositivos que se utilizan hoy en
día, desde teléfonos celulares hasta televisores y electrodomésticos inteligentes, hasta sistemas de
monitoreo remoto para tuberías y fábricas.
A medida que Linux evolucionó, se desarrollaron chips de procesador especializados para
dispositivos industriales y de consumo para aprovechar sus capacidades. El soporte para Linux se
ha vuelto tan omnipresente que es posible crear prototipos y lanzar nuevos dispositivos al mercado
utilizando componentes estándar. El auge de las computadoras baratas, pequeñas y adaptables de
una sola placa, como la Raspberry Pi, ha brindado a los experimentadores y empresarios en todo el
mundo herramientas para construir rápidamente soluciones personalizadas, con tecnología de
Linux, que hubieran requerido meses de trabajo por parte de equipos especializados hace solo unos
años.
Si bien los consumidores están familiarizados con los dispositivos de entretenimiento integrados de
Linux, como las grabadoras de video digital (DVR) y los "televisores inteligentes", el impacto real
de Linux integrado apenas comienza a darse cuenta. Internet de las cosas (IoT) se está
intensificando con dispositivos baratos y ubicuos que se implementan en todo, desde pozos
petroleros hasta granjas de generación solar. Estas redes de sensores y controladores inteligentes
permiten a los ingenieros ajustar los procesos críticos en tiempo real mientras monitorean e
informan a las estaciones de control central. A medida que se monitorean más procesos y se
integran más datos con el aprendizaje automático y la inteligencia artificial (IA), podemos anticipar
ganancias en eficiencia, seguridad y productividad solo soñadas por generaciones pasadas.

3.1 Navigating the Linux Desktop

Para ser administrador de sistemas Linux, es necesario sentirse cómodo con Linux como sistema
operativo de escritorio y tener dominio de las habilidades básicas de Tecnología de Información y
Comunicación (TIC). El uso de Linux para tareas de productividad, en lugar de depender de los
sistemas Windows o Macintosh, acelera el aprendizaje al trabajar con herramientas de Linux a
diario. Los administradores de sistemas hacen mucho más que administrar servidores; a menudo se
les pide que ayuden a los usuarios con problemas de configuración, que recomienden software
nuevo y que actualicen la documentación, entre otras tareas.
La mayoría de las distribuciones de Linux permiten a los usuarios descargar un paquete de
instalación de "escritorio" que se puede cargar en una llave USB. Esta es una de las primeras cosas
que deben hacer los aspirantes a administradores de sistemas; descargue una distribución principal y
cárguela en una PC antigua. Este proceso es bastante sencillo y hay tutoriales disponibles en línea.
El escritorio de Linux debe ser familiar para cualquiera que haya usado una PC o Macintosh con
íconos para seleccionar diferentes programas y una aplicación de "configuración" para configurar
cosas como cuentas de usuario, redes WiFi y dispositivos de entrada. Después de familiarizarse con
la interfaz gráfica de usuario de Linux (GUI) o escritorio, el siguiente paso es aprender a realizar
tareas desde la línea de comandos.
3.1.1 Getting the comand line

En los sistemas que se inician en una GUI, hay dos formas comunes de acceder a la línea de
comandos: un terminal basado en GUI y un terminal virtual:
Un terminal GUI es un programa dentro del entorno GUI que emula una ventana de terminal. Se
puede acceder a los terminales GUI a través del sistema de menús. Por ejemplo, en una máquina
CentOS, puede hacer clic en Aplicaciones en la barra de menú, luego en Herramientas del sistema>
y, finalmente, en Terminal.
Se puede ejecutar un terminal virtual al mismo tiempo que una GUI, pero requiere que el usuario
inicie sesión a través del terminal virtual antes de poder ejecutar comandos (como lo harían antes de
acceder a la interfaz GUI).
Cada distribución de escritorio de Linux es ligeramente diferente, pero el terminal de la aplicación o
el X-Term abrirá una ventana de terminal desde la GUI. Si bien existen diferencias sutiles entre los
términos consola y sesiones de la ventana de terminal, todas son iguales desde el punto de vista de
los administradores y requieren el mismo conocimiento de los comandos para usar.

Las tareas de línea de comandos ordinarias son programas de inicio, análisis de scripts y edición de
archivos de texto utilizados para la configuración del sistema o la aplicación. La mayoría de los
servidores se inician directamente en una terminal, ya que una GUI puede requerir muchos recursos
y generalmente no es necesaria para realizar operaciones basadas en el servidor.

3.2 Applications

El Kernel (núcleo) del sistema operativo es como un controlador de tránsito aéreo en un aeropuerto,
y las aplicaciones son los aviones bajo su control. El kernel decide qué programa obtiene qué
bloques de memoria, inicia y elimina las aplicaciones, y maneja la visualización de texto o gráficos
en un monitor.

Las aplicaciones realizan solicitudes al núcleo y, a cambio, reciben recursos, como memoria, CPU y
espacio en disco. Si dos aplicaciones solicitan el mismo recurso, el núcleo decide cuál lo obtiene y,
en algunos casos, elimina otra aplicación para guardar el resto del sistema y evitar un bloqueo.

El núcleo también extrae algunos detalles complicados de la aplicación. Por ejemplo, la aplicación
no sabe si un bloque de almacenamiento de disco está en una unidad de estado sólido, un disco duro
metálico giratorio o incluso un recurso compartido de archivos de red. Las aplicaciones solo
necesitan seguir la interfaz de programación de aplicaciones (API) del núcleo y, por lo tanto, no
tienen que preocuparse por los detalles de implementación. Cada aplicación se comporta como si
tuviera un gran bloque de memoria en el sistema; el kernel mantiene esta ilusión al reasignar
bloques de memoria más pequeños, compartir bloques de memoria con otras aplicaciones o incluso
intercambiar bloques intactos al disco.
El kernel también maneja el cambio de aplicaciones, un proceso conocido como multitarea
(multitasking). Un sistema informático tiene una pequeña cantidad de unidades centrales de
procesamiento (CPU) y una cantidad finita de memoria. El núcleo se encarga de descargar una tarea
y cargar una nueva si hay más demanda que recursos disponibles. Cuando una tarea se ha ejecutado
durante un período de tiempo específico, la CPU la pausa para que otra pueda ejecutarse. Si la
computadora realiza varias tareas a la vez, el núcleo decide cuándo cambiar el foco entre tareas.
Con las tareas cambiando rápidamente, parece que la computadora está haciendo muchas cosas a la
vez

Cuando nosotros, como usuarios, pensamos en aplicaciones, tendemos a pensar en procesadores de


texto, navegadores web y clientes de correo electrónico, sin embargo, hay una gran variedad de
tipos de aplicaciones. El núcleo no diferencia entre una aplicación orientada al usuario, un servicio
de red que se comunica con una computadora remota o una tarea interna. De esto, obtenemos una
abstracción llamada proceso. Un proceso es solo una tarea que el núcleo carga y rastrea. Una
aplicación puede incluso necesitar múltiples procesos para funcionar, por lo que el núcleo se
encarga de ejecutar los procesos, iniciarlos y detenerlos según lo solicitado, y distribuir los recursos
del sistema.

3.2.1 Major Applications

El kernel de Linux puede ejecutar una amplia variedad de software en muchas plataformas de
hardware. Una computadora puede actuar como un servidor, lo que significa que principalmente
maneja datos en nombre de otros, o como un escritorio, lo que significa que un usuario interactúa
con ella directamente. La máquina puede ejecutar software o usarse como máquina de desarrollo en
el proceso de creación de software. Una máquina puede incluso adoptar múltiples roles ya que
Linux no hace distinción; se trata simplemente de configurar qué aplicaciones se ejecutan.

Una ventaja resultante es que Linux puede simular casi todos los aspectos de un entorno de
producción, desde el desarrollo hasta las pruebas, hasta la verificación en hardware reducido, lo que
ahorra costos y tiempo. Un administrador de Linux podría ejecutar las mismas aplicaciones de
servidor en una computadora de escritorio o un servidor virtual económico que son administrados
por grandes proveedores de servicios de Internet. Por supuesto, una computadora de escritorio no
sería capaz de manejar el mismo volumen que lo haría un proveedor importante, pero casi cualquier
configuración puede simularse sin la necesidad de un potente hardware o licencia de servidor.

El software de Linux generalmente cae en una de tres categorías:


1. Server Applications (Aplicaciones de servidor):

Software que no tiene interacción directa con el monitor y el teclado de la máquina en la que
se ejecuta. Su propósito es servir información a otras computadoras, llamadas clientes. A
veces, las aplicaciones del servidor pueden no comunicarse con otras computadoras, sino
que solo se quedan allí y procesan los datos.

2. Desktop Applications (Aplicaciones de escritorio):


Navegadores web, editores de texto, reproductores de música u otras aplicaciones con las
que los usuarios interactúan directamente. En muchos casos, como un navegador web, la
aplicación está hablando con un servidor en el otro extremo e interpretando los datos. Este
es el lado "cliente" de una aplicación cliente / servidor.
3. Tools (Herramientas):
Existe una categoría de software flexible que facilita la administración de los sistemas
informáticos. Las herramientas pueden ayudar a configurar pantallas, proporcionar un shell
de Linux en el que los usuarios escriben comandos o incluso herramientas más sofisticadas,
llamadas compiladores, que convierten el código fuente en programas de aplicación que la
computadora puede ejecutar.

La disponibilidad de las aplicaciones varía según la distribución. A menudo, los proveedores de


aplicaciones eligen un subconjunto de distribuciones para soportar. Las diferentes distribuciones
tienen diferentes versiones de bibliotecas de claves, y es difícil para una empresa admitir todas estas
versiones diferentes. Sin embargo, algunas aplicaciones, como Firefox y LibreOffice, son
ampliamente compatibles y están disponibles para todas las distribuciones principales.

La comunidad de Linux ha presentado muchas soluciones creativas para aplicaciones de escritorio y


de servidor. Estas aplicaciones, muchas de las cuales constituyen la columna vertebral de Internet,
son fundamentales para comprender y utilizar el poder de Linux.

La mayoría de las tareas informáticas pueden llevarse a cabo mediante cualquier número de
aplicaciones en Linux. Hay muchos navegadores web, servidores web, servidores de bases de datos
y editores de texto para elegir. La evaluación del software de la aplicación es una habilidad
importante que debe aprender el aspirante a administrador de Linux. Determinar los requisitos de
rendimiento, estabilidad y costo son solo algunas de las consideraciones necesarias para un análisis
exhaustivo.

Linux sobresale en la ejecución de aplicaciones de servidor debido a su confiabilidad y eficiencia.


La capacidad de optimizar los sistemas operativos del servidor con los componentes que solo se
necesitan permite a los administradores hacer más con menos, una característica que adoran tanto
las startups como las grandes empresas por igual.
3.2.2.1 Web Server

Uno de los primeros usos de Linux fue para servidores web. Un servidor web aloja contenido para
páginas web, que son vistas por un navegador web utilizando el Protocolo de transferencia de
hipertexto (HTTP) o su sabor cifrado, HTTPS. La página web en sí puede ser estática o dinámica.
Cuando el navegador web solicita una página estática, el servidor web envía el archivo tal como
aparece en el disco. En el caso de un sitio dinámico, el servidor web envía la solicitud a una
aplicación que genera el contenido.
Uno de los primeros usos de Linux fue para servidores web. Un servidor web aloja contenido para
páginas web, que son vistas por un navegador web utilizando el Protocolo de transferencia de
hipertexto (HTTP) o su sabor cifrado, HTTPS. La página web en sí puede ser estática o dinámica.
Cuando el navegador web solicita una página estática, el servidor web envía el archivo tal como
aparece en el disco. En el caso de un sitio dinámico, el servidor web envía la solicitud a una
aplicación que genera el contenido.
Apache es el servidor web dominante en uso hoy en día. Apache fue originalmente un proyecto
independiente, pero desde entonces el grupo ha formado la Apache Software Foundation y mantiene
más de cien proyectos de software de código abierto. Apache HTTPD es el demonio (Daemon), o
programa de aplicación de servidor, que "atiende" solicitudes de páginas web.
Otro servidor web es NGINX, que tiene su sede en Rusia. Se centra en el rendimiento haciendo uso
de núcleos UNIX más modernos y solo hace un subconjunto de lo que Apache puede hacer. Más del
65% de los sitios web funcionan con NGINX o Apache.

3.2.2.2 Private Cloud Server (Servidores en la nube privada)

A medida que los individuos, las organizaciones y las empresas comienzan a mover sus datos a la
nube, existe una creciente demanda de software de servidor privado en la nube que se pueda
implementar y administrar internamente.
“The ownCloud Project” fue lanzado por Frank Karlitschek para proporcionar software para
almacenar, sincronizar y compartir datos de servidores privados en la nube. Está disponible en una
licencia estándar open source GNU AGPLv3 y una versión empresarial que lleva una licencia
comercial.
“The Nextcloud Project” fue bifurcado de ownCloud en 2016 por Karlitschek y ha estado creciendo
constantemente desde entonces. Se proporciona bajo GNU AGPLv3 y tiene como objetivo "un
proceso de desarrollo abierto y transparente".
Ambos proyectos se centran en proporcionar software de nube privada que satisfaga las necesidades
de organizaciones grandes y pequeñas que requieren seguridad, privacidad y cumplimiento
normativo. Si bien varios otros proyectos apuntan a servir a los mismos usuarios, estos dos son, con
mucho, los más grandes en términos de implementación y miembros del proyecto.
3.2.2.3 Servidores de bases de datos

Las aplicaciones de servidor de bases de datos forman la columna vertebral de la mayoría de los
servicios en línea. Las aplicaciones web dinámicas extraen y escriben datos en estas aplicaciones.
Por ejemplo, un programa web para rastrear estudiantes en línea podría consistir en un servidor
front-end que presenta un formulario web. Cuando los datos se ingresan en el formulario, se
escriben en una aplicación de base de datos como MariaDB. Cuando los instructores necesitan
acceder a la información del alumno, la aplicación web consulta la base de datos y devuelve los
resultados a través de la aplicación web.

MariaDB es una bifurcación desarrollada por la comunidad del sistema de gestión de bases de datos
relacionales MySQL. Es solo uno de los muchos servidores de bases de datos utilizados para el
desarrollo web, ya que los diferentes requisitos dictan la mejor aplicación para las tareas requeridas.

Una base de datos almacena información y también permite una fácil recuperación y consulta.
Algunas otras bases de datos populares son Firebird y PostgreSQL. Puede ingresar cifras de ventas
sin procesar en la base de datos y luego usar un lenguaje llamado Lenguaje de consulta estructurado
(SQL) para agregar las ventas por producto y fecha para producir un informe.

3.2.2.4 Servidores de correo electrónico

El correo electrónico siempre ha sido un uso generalizado para servidores Linux. Cuando se trata de
servidores de correo electrónico, siempre es útil observar las 3 tareas diferentes requeridas para
obtener correo electrónico entre personas:
• Mail Transfer Agent (MTA), Agente de Transferencia de correo:
El MTA más conocido (software que se utiliza para transferir mensajes electrónicos a otros
sistemas) es Sendmail. Postfix es otro popular y pretende ser más simple y seguro que
Sendmail.
• Mail Delivery Agent (MDA), Agente de entrega de correo:
También es conocido por Local Delivery Agent”, se encargará de almacenar el correo
electrónico en el buzón del usuario. Usualmente se invoca desde el MTA final en la cadena.

• POP/IMAP Server , Servidor POP/IMAP:

Los protocolos POP (Post Office Protocol) e IMAP (Internet Message Access Protocol) son
dos protocolos de comunicación que permiten que un cliente de correo electrónico que se
ejecuta en su computadora se comunique con un servidor remoto para recoger el correo
electrónico.
Dovecot es un servidor POP/IMAP popular debido a su facilidad de uso y bajo mantenimiento.
Cyrus IMAP es otra opción. Algunos servidores POP / IMAP implementan su propio formato de
base de datos de correo para el rendimiento e incluyen el MDA si se desea la base de datos
personalizada. Las personas que utilizan formatos de archivo estándar (como todos los correos
electrónicos en un archivo de texto) pueden elegir cualquier MDA.

Existen varias diferencias significativas entre el mundo de software de código cerrado y el de


código abierto, una de ellas es la inclusión de otros proyectos como componentes de un proyecto o
paquete. En el mundo de código cerrado, Microsoft Exchange se envía principalmente como un
paquete / paquete de software que incluye todos los componentes necesarios o aprobados, todos de
Microsoft, por lo que hay pocas opciones, si es que hay alguna, para realizar selecciones
individuales. En el mundo del código abierto, se pueden incluir o intercambiar de manera modular
muchas opciones para los componentes del paquete, y de hecho, algunos paquetes de software o
suites son solo un conjunto bien empaquetado de componentes que, de lo contrario, serían
individuales y funcionarían juntos de manera armoniosa.

3.2.2.5 File Sharing (Compartir archivos)

Para compartir archivos centrados en Windows, Samba es el claro ganador. Samba permite que una
máquina Linux se vea y se comporte como una máquina Windows para que pueda compartir
archivos y participar en un dominio de Windows. Samba implementa los componentes del servidor,
como hacer que los archivos estén disponibles para compartir y ciertas funciones del servidor de
Windows, y también el cliente final para que una máquina Linux pueda consumir un archivo
compartido de Windows.
The Netatalk Project permite que una máquina Linux funcione como un servidor de archivos
Apple Macintosh. El protocolo nativo para compartir archivos para UNIX / Linux se denomina
Network File System, Sistema de archivos de red (NFS). NFS generalmente es parte del núcleo, lo
que significa que se puede montar (hacer accesible) un sistema de archivos remoto como un disco
normal, haciendo que el acceso a los archivos sea transparente para otras aplicaciones.
A medida que una red de computadoras se vuelve más sustancial, aumenta la necesidad de un
directorio. Uno de los sistemas de directorio de red más antiguos es el Sistema de nombres de
dominio (DNS). Se utiliza para convertir un nombre como https://www.icann.org/ a una dirección
IP como 192.0.43.7, que es un identificador único de una computadora en Internet. DNS también
contiene información global como la dirección del MTA para un nombre de dominio dado. Una
organización puede querer 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
mantiene el servidor DNS más popular, simplemente llamado BIND (Berkeley Internet Name
Domain) después del nombre del proceso que ejecuta el servicio.
El DNS se centra principalmente en los nombres de las computadoras y las direcciones IP y no es
fácil de buscar. Han surgido otros directorios para almacenar información como cuentas de usuario
y roles de seguridad. El Lightweight Directory Access Protocol (LDAP) es un sistema de directorio
común que también alimenta el Active Directory de Microsoft. En LDAP, un objeto se almacena en
un árbol, y la posición de ese objeto en el árbol se puede utilizar para obtener información sobre el
objeto y lo que almacena. Por ejemplo, un administrador de Linux puede estar almacenado en una
rama del árbol llamada "Departamento de TI", que está debajo de una rama llamada "Operaciones".
Por lo tanto, se puede encontrar todo el personal técnico buscando en la rama "Departamento de
TI". OpenLDAP es el programa dominante utilizado en la infraestructura de Linux.
Una última pieza de infraestructura de red para analizar aquí se llama Protocolo de configuración
dinámica de host (DHCP). Cuando una computadora se inicia, necesita una dirección IP para la red
local para que pueda identificarse de manera única. El trabajo de DHCP es escuchar las solicitudes
y asignar una dirección gratuita del grupo de DHCP. Internet Software Consortium también
mantiene el servidor DHCP ISC, que es el servidor DHCP de código abierto más común.
La Fundación Mozilla salió con Thunderbird, un cliente de correo electrónico de escritorio con
todas las funciones. Thunderbird se conecta a un servidor POP o IMAP, muestra el correo
electrónico localmente y lo envía a través de un servidor SMTP externo.

Otros clientes de correo electrónico notables son Evolution (GNOME) y Kmail (KDE). La
estandarización a través de POP e IMAP y formatos de correo electrónico locales significa que es
fácil cambiar entre clientes de correo electrónico sin perder datos.

3.2.3.2 Creative

Para los tipos creativos, hay Blender, GIMP (Programa de manipulación de imágenes GNU) y
Audacity que manejan la creación de películas en 3D, la manipulación de imágenes en 2D y la
edición de audio, respectivamente. Han tenido varios grados de éxito en los mercados profesionales.
Blender se usa para todo, desde películas independientes hasta películas de Hollywood, por
ejemplo. GIMP admite la manipulación de fotos de alta calidad, la creación de obras de arte
originales, elementos de diseño gráfico y es extensible a través de secuencias de comandos en
varios idiomas. Audacity es una herramienta de edición de audio gratuita y de código abierto que
está disponible en múltiples sistemas operativos.

3.3.1 Shell

Linux ofrece una variedad de shells para elegir, que en su mayoría difieren en cómo y qué se puede
personalizar, y la sintaxis del lenguaje de scripting incorporado. Las dos familias principales son el
shell Bourne y el shell C. La concha Bourne lleva el nombre de su creador Stephen Bourne de Bell
Labs. El shell C se llama así porque su sintaxis toma mucho prestado del lenguaje C. Como ambas
cáscaras fueron inventadas en la década de 1970, hay versiones más modernas, Bourne Again Shell
(Bash) y tcsh (pronunciado como tee-cee-shell). Bash es el shell predeterminado en la mayoría de
los sistemas, aunque tcsh también suele estar disponible.

Los programadores han tomado características favoritas de Bash y tcsh y han creado otros shells,
como el shell Korn (ksh) y el shell Z (zsh). La elección de los shell es principalmente personal; Los
usuarios que se sienten cómodos con Bash pueden operar efectivamente en la mayoría de los
sistemas Linux. Otros shells pueden ofrecer características que aumentan la productividad en casos
de uso específicos.

3.3.2 Text Editors


La mayoría de los sistemas Linux ofrecen una selección de editores de texto que se usan
comúnmente en la consola para editar archivos de configuración. Las dos aplicaciones principales
son Vi (o el Vim más moderno) y Emacs. Ambas son herramientas notablemente poderosas para
editar archivos de texto; difieren en el formato de los comandos y en cómo se escriben los
complementos para ellos. Los complementos pueden ser desde resaltar la sintaxis de proyectos de
software hasta calendarios integrados.

Tanto Vi como Emacs son complejos y tienen una curva de aprendizaje empinada, que no es útil
para la edición simple de un pequeño archivo de texto. Por lo tanto, Pico y Nano están disponibles
en la mayoría de los sistemas y proporcionan una edición de texto muy básica.
Consider This
El editor Nano se desarrolló como un editor de código abierto completamente basado en Pico, ya
que la licencia de Pico no es una licencia de código abierto y prohíbe realizar cambios y distribuirlo.

Si bien Nano es simple y fácil de usar, no ofrece el amplio conjunto de funciones de edición y
vinculación de teclas más avanzadas que un editor como Vi. Sin embargo, los administradores
deben esforzarse por adquirir cierta familiaridad básica con Vi, ya que está disponible en casi todos
los sistemas Linux existentes. Al restaurar un sistema Linux dañado mediante la ejecución en el
modo de recuperación de la distribución, Vi puede ser una herramienta crítica, y el mejor momento
para aprender Vim o cualquier editor es antes de que lo necesite desesperadamente para reparar un
sistema dañado.

3.4 Gestión de paquetes

Todos los sistemas Linux necesitan agregar, eliminar y actualizar software. En el pasado, esto
significaba descargar el código fuente, configurarlo, compilarlo y copiar archivos en cada sistema
que requería actualización. Afortunadamente, las distribuciones modernas usan paquetes, que son
archivos comprimidos que agrupan una aplicación y sus dependencias (o archivos requeridos), lo
que simplifica enormemente la instalación al crear los directorios correctos, copiar los archivos
adecuados en ellos y crear elementos necesarios como enlaces simbólicos. .

Un administrador de paquetes se encarga de realizar un seguimiento de los archivos que pertenecen


a cada paquete e incluso de descargar actualizaciones de los repositorios, generalmente un servidor
remoto que comparte las actualizaciones apropiadas para una distribución. En Linux, hay muchos
sistemas de gestión de paquetes de software diferentes, pero los dos más populares son los de
Debian y Red Hat.

3.4.1 Gestión de paquetes Debian

La distribución de Debian y sus derivados, como Ubuntu y Mint, utilizan el sistema de gestión de
paquetes de Debian. En el corazón de la gestión de paquetes de Debian se encuentran los paquetes
de software que se distribuyen como archivos que terminan en la extensión .deb.

La herramienta de nivel más bajo para administrar estos archivos es el comando dpkg. Este
comando puede ser complicado para los usuarios principiantes de Linux, por lo que Advanced
Package Tool, apt-get (un programa front-end para la herramienta dpkg), facilita la administración
de paquetes. Las herramientas de línea de comando adicionales que sirven como front-end para
dpkg incluyen aptitude y front-end GUI como Synaptic and Software Center.

3.4.2 Gestión de paquetes RPM

La base de estándares de Linux, que es un proyecto de la Fundación Linux, está diseñada para
especificar (a través de un consenso) un conjunto de estándares que aumentan la compatibilidad
entre sistemas Linux conformes. Según la base de estándares de Linux, el sistema de gestión de
paquetes estándar es RPM.

RPM utiliza un archivo .rpm para cada paquete de software. Este sistema es lo que las
distribuciones derivadas de Red Hat, incluidos Centos y Fedora, utilizan para administrar el
software. Varias otras distribuciones que no se derivan de Red Hat, como SUSE, OpenSUSE y
Arch, también usan RPM.

Al igual que el sistema Debian, los sistemas de gestión de paquetes RPM rastrean las dependencias
entre paquetes. El seguimiento de las dependencias asegura que cuando se instala un paquete, el
sistema también instala los paquetes necesarios para que funcione correctamente. Las dependencias
también aseguran que las actualizaciones y eliminaciones de software se realicen correctamente.

La herramienta de back-end más utilizada para RPM Package Management es el comando rpm. Si
bien el comando rpm puede instalar, actualizar, consultar y eliminar paquetes, las herramientas
front-end de la línea de comandos como yum y up2date automatizan el proceso de resolución de
problemas de dependencia.

Nota

Un programa o aplicación back-end interactúa directamente con un programa front-end o es


"llamado" por un programa intermedio. Los programas de fondo no interactuarían directamente con
el usuario. Básicamente, hay programas que interactúan con personas (front-end) y programas que
interactúan con otros programas (back-end).
También hay herramientas de front-end basadas en GUI como Yumex y Gnome PackageKit que
también facilitan la administración de paquetes RPM.

Algunas distribuciones basadas en RPM han implementado el estilo de administración de paquetes


ZYpp (o libzypp), principalmente openSUSE y SUSE Linux Enterprise, pero también distribuciones
móviles MeeGo, Tizen y Sailfish.

El comando zypper es la base del método ZYpp, y presenta comandos en inglés cortos y largos para
realizar funciones, como zypper en packagename, que instala un paquete que incluye las
dependencias necesarias.

La mayoría de los comandos asociados con la gestión de paquetes requieren privilegios de root. La
regla general es que si un comando afecta el estado de un paquete, se requiere acceso
administrativo. En otras palabras, un usuario normal puede realizar una consulta o una búsqueda,
pero para agregar, actualizar o eliminar un paquete requiere que el comando se ejecute como
usuario root.

3.5 Development Languages

No debería sorprender que, dado que el software se basa en las contribuciones de los
programadores, Linux tiene un excelente soporte para el desarrollo de software. Los shells están
diseñados para ser programables, y hay editores potentes incluidos en cada sistema. También hay
muchas herramientas de desarrollo disponibles, y muchos lenguajes de programación modernos
tratan a Linux como un ciudadano de primera clase.

Los lenguajes de programación de computadoras proporcionan una manera para que un


programador ingrese instrucciones en un formato más legible para los humanos, y para que esas
instrucciones eventualmente se traduzcan en algo que la computadora entienda. Los lenguajes de
programación se dividen en dos tipos: interpretados o compilados. Un lenguaje interpretado traduce
el código escrito en código de computadora a medida que se ejecuta el programa, y un lenguaje
compilado se traduce de una vez.

Linux en sí mismo fue escrito en un lenguaje compilado llamado C. El beneficio principal de C es


que el lenguaje en sí se asigna al código de máquina generado de manera que un programador
experto pueda escribir código que sea pequeño y eficiente. Cuando la memoria de la computadora
se midió en kilobytes, esto fue muy importante. Incluso con grandes tamaños de memoria hoy en
día, C sigue siendo útil para escribir código que debe ejecutarse rápidamente, como un sistema
operativo.

C se ha extendido a lo largo de los años. Existe C ++, que agrega soporte de objetos a C (un estilo
diferente de programación), y Objective C que tomó otra dirección y está siendo muy utilizado en
los productos de Apple.

El lenguaje Java da un giro diferente al enfoque compilado. En lugar de compilar el código de la


máquina, Java primero imagina una CPU hipotética llamada Java Virtual Machine (JVM) y luego
compila todo el código para eso. Cada computadora host ejecuta el software JVM para traducir las
instrucciones JVM (llamadas bytecode) en instrucciones nativas. Java es un lenguaje orientado a
objetos.

La traducción adicional con Java podría hacerle pensar que sería lento. Sin embargo, la JVM es
relativamente simple, por lo que se puede implementar de forma rápida y confiable en cualquier
cosa, desde una computadora potente hasta un dispositivo de baja potencia que se conecta a un
televisor. ¡Un archivo Java compilado también se puede ejecutar en cualquier computadora que
implemente la JVM!

Otro beneficio de compilar en un objetivo intermedio es que la JVM puede proporcionar servicios a
la aplicación que generalmente no estarían disponibles en una CPU. Asignar memoria a un
programa es un problema complejo, pero está integrado en la JVM. Como resultado, los fabricantes
de JVM pueden centrar sus mejoras en la JVM en su conjunto, por lo que cualquier progreso que
hagan estará disponible instantáneamente para las aplicaciones.

Los idiomas interpretados, por otro lado, se traducen al código de máquina a medida que se
ejecutan. La potencia adicional de la computadora que se gasta en esto a menudo se puede recuperar
mediante la mayor productividad que gana el programador al no tener que dejar de trabajar para
compilar. Los idiomas interpretados también tienden a ofrecer más funciones que los idiomas
compilados, lo que significa que a menudo se necesita menos código. El intérprete de lenguaje en sí
mismo generalmente está escrito en otro lenguaje como C, ¡y algunas veces incluso en Java! Esto
significa que se está ejecutando un lenguaje interpretado en la JVM, que se traduce en tiempo de
ejecución al código de máquina real.
JavaScript es un lenguaje de programación interpretado de alto nivel que es una de las tecnologías
centrales en la red mundial. Es similar pero fundamentalmente diferente de Java, que es un lenguaje
de programación completamente orientado a objetos propiedad de Oracle. JavaScript es un lenguaje
de secuencias de comandos multiplataforma para agregar elementos interactivos a las páginas web,
que se usa ampliamente en Internet. Mediante el uso de bibliotecas de JavaScript, los
programadores web pueden agregar todo, desde animaciones simples hasta complejas aplicaciones
del lado del servidor para usuarios de Internet. JavaScript evoluciona continuamente para satisfacer
las necesidades de seguridad y funcionalidad de los usuarios de Internet y es capaz de ser lanzado
bajo una Licencia GNU GPL.
El término orientado a objetos se refiere a la programación que abstrae acciones y procesos
complejos para que el usuario final solo se ocupe de tareas básicas. Para visualizar este concepto,
piense en una máquina que realiza un conjunto complejo de tareas simplemente presionando un
botón.

Perl es un lenguaje interpretado. Perl fue desarrollado originalmente para realizar manipulación de
texto. Con los años, se ganó el favor de los administradores de sistemas y continúa siendo mejorado
y utilizado en todo, desde la automatización hasta la creación de aplicaciones web.

PHP es un lenguaje que se creó inicialmente para crear páginas web dinámicas. Un archivo web es
leído por un servidor web como Apache. Las etiquetas especiales en el archivo indican que partes
del código deben interpretarse como instrucciones. El servidor web reúne todas las diferentes partes
del archivo y lo envía al navegador web. Las principales ventajas de PHP son que es fácil de
aprender y está disponible en casi cualquier sistema. Debido a esto, muchos proyectos populares se
basan en PHP. Los ejemplos notables incluyen WordPress (para bloguear), cactus (para monitoreo)
e incluso partes de Facebook.

Ruby es otro idioma que fue influenciado por Perl y Shell, junto con muchos otros idiomas. Hace
que las tareas de programación complejas sean relativamente fáciles, y con la inclusión del marco
Ruby on Rails, es una opción popular para construir aplicaciones web complejas. Ruby es también
el lenguaje que impulsa muchas de las herramientas de automatización líderes como Chef y
Puppet, que hacen que la administración de una gran cantidad de sistemas Linux sea mucho más
simple.

Python es otro lenguaje de script que es de uso general. Al igual que Ruby, facilita las tareas
complejas y tiene un marco llamado Django que facilita la creación de aplicaciones web. Python
tiene excelentes capacidades de procesamiento estadístico y es un favorito en la academia.

Un lenguaje de programación de computadora es solo una herramienta que hace que sea más fácil
decirle a la computadora lo que quiere que haga. Una biblioteca agrupa tareas comunes en un
paquete distinto que el desarrollador puede utilizar. ImageMagick es una de esas bibliotecas que
permite a los programadores manipular imágenes en código. ImageMagick también se entrega con
algunas herramientas de línea de comandos que permiten a los programadores procesar imágenes
desde un shell y aprovechar las capacidades de secuencias de comandos allí.
OpenSSL es una biblioteca criptográfica que se utiliza en todo, desde servidores web hasta la línea
de comandos. Proporciona una interfaz estándar para agregar criptografía a un script de Perl, por
ejemplo.
En un nivel mucho más bajo está la C Library. C Library proporciona un conjunto básico de
funciones para leer y escribir en archivos y pantallas, y es utilizada tanto por aplicaciones como por
otros lenguajes.
3.6 Seguridad

Los administradores y usuarios de computadoras son cada vez más conscientes de las
preocupaciones de privacidad tanto en su vida personal como profesional. Las violaciones de datos
de alto perfil han estado en las noticias con demasiada frecuencia recientemente, y el costo de estos
robos puede llegar a millones de dólares para las instituciones que son víctimas de ataques de
piratas informáticos y ransomware. Muchas veces, la causa de estas infracciones es simplemente un
error humano, como abrir un correo electrónico sospechoso o ingresar contraseñas en una página de
inicio de sesión falsa.

Las cookies son el mecanismo principal que utilizan los sitios web para rastrearlo. A veces, este
seguimiento es bueno, como para realizar un seguimiento de lo que hay en su carrito de compras o
para mantenerlo conectado cuando regrese al sitio.

Mientras navega por la web, un servidor web puede enviar la cookie, que es un pequeño texto, junto
con la página web. Su navegador almacena esta información y la envía de vuelta con cada solicitud
al mismo sitio. Normalmente, las cookies solo se envían de vuelta al sitio desde el que se
originaron, por lo que una cookie de example.com no se enviaría a example.org.

Sin embargo, muchos sitios tienen scripts incrustados que provienen de terceros, como un anuncio
publicitario o un píxel de Google Analytics. Si example.com y example.org tienen un píxel de
seguimiento, como uno de un anunciante, se enviará la misma cookie al navegar en ambos sitios.
Luego, el anunciante sabe que ha visitado example.com y example.org.

Con un alcance lo suficientemente amplio, como la ubicación en sitios de redes sociales con
botones "Me gusta" y similares, un sitio web puede comprender qué sitios web frecuentas y
descubrir tus intereses y datos demográficos.

Hay varias estrategias para lidiar con esto. Una es ignorarlo. El otro es limitar los píxeles de
seguimiento que acepta, ya sea bloqueándolos por completo o eliminándolos periódicamente.

Los navegadores suelen ofrecer configuraciones relacionadas con cookies; los usuarios pueden
optar por que el navegador le diga al sitio que no realice un seguimiento. Esta etiqueta voluntaria se
envía en la solicitud y algunos sitios la aceptarán. El navegador también se puede configurar para
que no recuerde las cookies de terceros y elimine las cookies normales (como las del sitio en el que
está navegando) después de cerrar.

Ajustar la configuración de privacidad puede hacerlo más anónimo en Internet, pero también puede
causar problemas con algunos sitios que dependen de cookies
de terceros. Si esto sucede, es posible que deba permitir explícitamente que se guarden algunas
cookies.
3.6.1 Password Issues

La buena gestión de contraseñas es esencial para la seguridad en cualquier entorno informático. El


administrador de sistemas Linux es a menudo la persona responsable de establecer y hacer cumplir
las políticas de contraseña para los usuarios en todos los niveles. El usuario más privilegiado en
cualquier sistema Linux es root; esta cuenta es el administrador principal y se crea cuando se instala
el sistema operativo. A menudo, los administradores deshabilitarán el acceso de root como la
primera línea de defensa contra la intrusión, ya que los piratas informáticos intentarán obtener
acceso de root para tomar el control del sistema.

Hay muchos niveles de acceso y varios medios de administración de contraseñas en un sistema


Linux. Cuando se crean usuarios, se les otorgan diferentes permisos de inicio de sesión según los
grupos a los que están asignados. Por ejemplo, los administradores pueden crear y administrar
usuarios, mientras que los usuarios normales no pueden. Los servicios que se ejecutan en sistemas
como bases de datos también pueden tener permisos de inicio de sesión con sus propias contraseñas
y privilegios. Además, existen contraseñas específicas para acceder a los sistemas de forma remota
a través de SSH, FTP u otros programas de administración.

La administración de todas estas cuentas y las contraseñas que las acompañan es una parte
complicada y necesaria de la función de administrador de sistemas. Las contraseñas deben ser lo
suficientemente complejas como para que los piratas informáticos no las adivinen fácilmente, pero
fáciles de recordar para los usuarios. Cada vez más usuarios y administradores están recurriendo a
programas de administrador de contraseñas para almacenar credenciales de inicio de sesión en
forma cifrada. Otra tendencia es la autenticación de dos factores (2FA), una técnica en la que una
contraseña se complementa con un segundo "factor", a menudo un código de acceso enviado al
teléfono del usuario u otros dispositivos. Mantenerse al día con las tendencias de seguridad actuales,
al tiempo que garantiza la facilidad de acceso de los usuarios autorizados, es un desafío continuo
que debe cumplirse.

3.6.2 Protecting Yourself

A medida que navega por la web, deja una huella digital. Gran parte de esta información se ignora;
algunos de ellos se recopilan para recopilar estadísticas para publicidad, y otros se pueden usar con
fines maliciosos.

Lo más fácil que puede hacer es usar una contraseña buena y única donde quiera que vaya,
especialmente en su máquina local. Una buena contraseña tiene al menos 10 caracteres y contiene
una combinación de números, letras (mayúsculas y minúsculas) y símbolos especiales. Use un
administrador de contraseñas como KeePassX para generar contraseñas, y luego solo necesita
tener una contraseña de inicio de sesión en su máquina y una contraseña para abrir su archivo
KeePassX.

Además, limite la información que proporciona a los sitios solo a lo que se necesita. Si bien
proporcionar el nombre de soltera y la fecha de nacimiento de su madre puede ayudar a desbloquear
el inicio de sesión de su red social si pierde su contraseña, la misma información puede usarse para
suplantarlo en su banco.

Después de eso, asegúrese de buscar actualizaciones periódicamente. El sistema se puede configurar


para buscar actualizaciones regularmente. Si hay actualizaciones relacionadas con la seguridad, es
posible que se le solicite inmediatamente que las instale.

Finalmente, debe proteger su computadora de aceptar conexiones entrantes. Un firewall es un


dispositivo que filtra el tráfico de red, y Linux tiene uno incorporado. Si está utilizando Ubuntu,
entonces Gufw es una interfaz gráfica para el firewall sin complicaciones (UFW) de Ubuntu.
Debajo del capó, está usando iptables, que es el sistema de firewall incorporado. En lugar de
ingresar comandos complicados de iptables, usa una GUI. Si bien esta GUI le permite crear una
política efectiva para un escritorio, apenas rasca la superficie de lo que iptables puede hacer.
3.6.3 Privacy tools

El uso de herramientas de privacidad modernas, tanto a nivel de servidor como de usuario, puede
ayudar a evitar intrusiones en el sistema y acceso no autorizado a los datos.

La buena noticia es que Linux es por defecto uno de los sistemas operativos más seguros jamás
creados. Muchas de las vulnerabilidades que afectan a otros sistemas operativos simplemente no
funcionarán en Linux debido a la arquitectura subyacente. Sin embargo, todavía hay muchas
debilidades conocidas que los piratas informáticos pueden aprovechar, por lo que el administrador
de sistemas proactivo es inteligente al implementar herramientas de privacidad que protegen a sus
usuarios, así como a los sistemas que utilizan.

El cifrado es probablemente la herramienta de privacidad más conocida y más ampliamente


implementada actualmente en uso. Los administradores implementan cifrado con claves de
autenticación en casi todos los sistemas que se comunican con el mundo exterior. Un ejemplo bien
conocido es el estándar de Protocolo seguro de transferencia de hipertexto (HTTPS) utilizado en
servidores web para garantizar que los datos transmitidos entre los usuarios y los recursos en línea
no puedan ser interceptados mientras viajan en Internet abierto.

Las redes privadas virtuales (VPN) han sido utilizadas por las empresas para conectar sus servidores
y empleados remotos durante muchos años. Ahora están ganando popularidad entre los usuarios
comunes que buscan proteger su privacidad en línea. Funcionan creando un canal de comunicación
encriptado entre dos sistemas, por lo que los datos transmitidos entre ellos son codificados por un
algoritmo que solo los sistemas conocen.

El proyecto Tor lleva mucho tiempo involucrado en la creación de herramientas de privacidad como
es el navegador Tor que funciona retransmitiendo las solicitudes de Internet a través de una red de
servidores que impide que los sitios web y otros conozcan la identidad de la persona que realiza la
solicitud.

Estas herramientas evolucionan constantemente y elegir cuáles son apropiadas para los usuarios y
los sistemas involucrados es una parte esencial de la función del administrador de sistemas.

3.7 The Cloud

Cloud computing (La computación en la nube) ha revolucionado la forma en que accedemos a la


tecnología. A medida que aumenta la velocidad y la conectividad a Internet, se hace más fácil mover
los recursos informáticos a ubicaciones remotas donde se puede acceder, manipular y compartir
contenido en todo el mundo. Las organizaciones consideran cada vez más la nube como esencial
para sus negocios y operaciones. La migración de las aplicaciones y procesos de TI de una
organización a servicios en la nube, conocida como cloud adoption (adopción en la nube), se está
convirtiendo rápidamente en una decisión comercial estratégica para muchos. Con cloud adoption
aumentando significativamente en todo el mundo, la computación en la nube no es el eslogan que
alguna vez fue. Cloud compunting es vista como una de las principales tecnologías disruptivas de
la próxima década que transformará significativamente las empresas, las economías y las vidas a
nivel mundial.

Físicamente, una nube se puede describir como recursos informáticos de uno o varios centros de
datos externos a los que se puede acceder a través de Internet. La nube se basa en los beneficios de
un centro de datos y proporciona soluciones informáticas a las organizaciones que necesitan
almacenar y procesar datos, y les permite delegar la administración de la infraestructura de TI a un
tercero. Los datos y recursos que las organizaciones almacenan en la nube pueden incluir datos,
servidores, almacenamiento, alojamiento de aplicaciones, análisis y muchos otros servicios.

Un modelo de implementación en la nube proporciona una base de cómo se construye, gestiona y


accede a la infraestructura en la nube. Hay cuatro modelos principales de implementación en la
nube:

Public Cloud (Nube pública): una nube pública es una infraestructura de nube implementada por
un proveedor para ofrecer servicios en la nube al público en general y a las organizaciones a través
de Internet. En el modelo de nube pública, puede haber múltiples inquilinos (consumidores) que
comparten recursos comunes en la nube. Es muy probable que muchos de nosotros hayamos
accedido a los recursos de la nube pública en algún momento a través de proveedores como
Amazon, Google y otros proveedores populares de la nube pública.

Private Cloud (Nube privada): es una infraestructura de nube que se configura para el uso
exclusivo de una organización en particular. En comparación con una nube pública, una nube
privada ofrece a las organizaciones un mayor grado de privacidad y control sobre la infraestructura,
las aplicaciones y los datos de la nube. Se puede alojar en servidores administrados por la empresa
que lo está utilizando o a través de un proveedor de nube privada administrada como Rackspace o
IBM.

Comunity Cloud (Nube comunitaria): es una infraestructura de nube que está configurada para el
uso exclusivo de un grupo de organizaciones con objetivos o requisitos comunes. Las
organizaciones que participan en la comunidad generalmente comparten el costo del servicio en la
nube de la comunidad. Esta opción puede ser más costosa que la nube pública; sin embargo, puede
ofrecer un mayor nivel de control y protección contra amenazas externas que una nube pública.
Hybrid Cloud (Nube híbrida): se compone de dos o más nubes individuales, cada una de las cuales
puede ser una nube privada, comunitaria o pública. Una nube híbrida puede cambiar con el tiempo a
medida que las nubes de componentes se unen y se van. El uso de dicha tecnología permite la
portabilidad de datos y aplicaciones. También permite a las empresas aprovechar recursos externos
mientras retiene el control de recursos sensibles.
3.7.1 Linux en la nube

Linux juega un papel fundamental en la computación en la nube. Alimenta el 90% de la carga de


trabajo en la nube pública, la mayoría de los servidores virtuales se basan en alguna versión del
kernel de Linux, y Linux a menudo se usa para alojar las aplicaciones detrás de los servicios de
computación en la nube. Entonces, ¿qué hace que Linux sea único para habilitar la computación en
la nube?

Flexibilidad

La computación en la nube brinda la capacidad de aprovisionar recursos de TI rápidamente y en


cualquier momento. Esta agilidad permite un rápido desarrollo y experimentación que, a su vez,
facilita la innovación que es esencial para la investigación y el desarrollo, el descubrimiento de
nuevos mercados y oportunidades de ingresos, la creación de nuevos segmentos de clientes y el
desarrollo de nuevos productos.

Como resultado, la computación en la nube debe compensar el hecho de que cada organización
tiene un conjunto único de requisitos de recursos en evolución.

Linux se destaca aquí porque es altamente adaptable. Para empezar, Linux es modular por diseño y
está en el centro de un enorme ecosistema de aplicaciones de código abierto que ofrece infinitas
opciones de configuración para adaptarse a diversos sistemas y casos de uso. Además de eso, Linux
se escala de manera eficiente, lo que le permite ejecutar cualquier cosa, desde un pequeño sensor
remoto hasta una granja de servidores completa.

Accesibilidad

En un entorno tradicional, se accede a los recursos de TI desde dispositivos dedicados, como una
computadora de escritorio o una computadora portátil. En la computación en la nube, las
aplicaciones y los datos residen centralmente y se accede desde cualquier lugar a través de una red
desde cualquier dispositivo, como escritorio, móvil o thin client (es una computadora o software
cliente, en un entorno de red cliente-servidor), y hay una versión de Linux para cada uno de estos
dispositivos.
Cost-Effective

The cloud computing es atractiva ya que tiene el potencial para que los consumidores reduzcan sus
costos de TI. En la computación en la nube, los consumidores pueden escalar de manera unilateral y
automática los recursos de TI para satisfacer la demanda de carga de trabajo, eliminando así la
sobrecarga de los recursos subutilizados. Además, se reducen los gastos asociados con la
configuración, administración, espacio, energía y enfriamiento de TI.
Los proveedores de la nube absorben estos costos de infraestructura, pero deben seguir siendo una
alternativa de bajo costo. Elegir Linux es una de las soluciones más rentables que los proveedores
pueden implementar. Linux es uno de los sistemas operativos más eficientes, y el kernel de Linux es
completamente gratuito, al igual que muchas aplicaciones asociadas, utilidades y componentes de
software adicionales.
Las organizaciones empresariales y gubernamentales pueden optar por pagar distribuciones
respaldadas comercialmente, que son aún más rentables en comparación con los competidores con
licencia. Las distribuciones no comerciales que admiten la computación en la nube también son una
opción viable para muchas organizaciones.
Los proveedores no solo pueden transferir estos ahorros a los clientes, sino que ofrecer soluciones
basadas en Linux puede ser más barato para que el cliente las implemente. Configurar Linux en sus
propios sistemas elimina las costosas tarifas de licencia de usuario potencialmente asociadas con los
sistemas operativos de la competencia.

Manageability

Si bien Linux comenzó como un sistema operativo de nicho, su amplia presencia en la industria de
TI ha convertido el uso y la administración de Linux en una habilidad necesaria para los
profesionales de TI. Cada vez es más fácil para los proveedores y consumidores de la nube adquirir
el talento necesario o reasignar a los miembros existentes del equipo.
La naturaleza de Linux, construida en el lenguaje de programación C, también se presta a
herramientas de administración automatizadas. Una parte importante de los servidores Linux que
operan en la nube son creados y administrados por programas de administración automatizados en
lugar de operadores humanos. Este proceso libera a los administradores para supervisar las
operaciones informáticas en lugar de configurar y actualizar los sistemas manualmente.

Security

Cuando se utiliza una solución en la nube, especialmente una nube pública, una organización puede
tener preocupaciones relacionadas con la privacidad, las amenazas externas y la falta de control
sobre los recursos y datos de TI.
Linux puede ayudar a compensar estos problemas porque es uno de los sistemas operativos más
seguros y confiables disponibles. Linux es de código abierto, lo que significa que su código
fuente está disponible para que cualquiera pueda obtenerlo, revisarlo y modificarlo. Esto
también significa que el código puede ser inspeccionado para detectar vulnerabilidades y problemas
de compatibilidad, lo que resulta en un gran esfuerzo de la comunidad para rectificar estos
problemas y mantener la sólida reputación de Linux.

Virtualization
Linux es un sistema operativo multiusuario, lo que significa que muchos usuarios diferentes pueden
trabajar en el mismo sistema simultáneamente y, en su mayor parte, no pueden hacer nada para
dañar a otros usuarios. Sin embargo, esto tiene limitaciones: los usuarios pueden acumular espacio
en el disco o ocupar demasiada memoria o recursos de la CPU y hacer que el sistema sea lento para
todos. Compartir el sistema en modo multiusuario también requiere que todos se ejecuten como
usuarios sin privilegios, por lo que permitir que cada usuario ejecute su propio servidor web, por
ejemplo, es un desafío.

La virtualización es el proceso en el que una computadora física, llamada host, ejecuta múltiples
copias de un sistema operativo, cada copia llamada invitado. Estas imágenes de invitados pueden
preconfigurarse para funciones específicas para permitir un despliegue rápido, a menudo
automáticamente. El sistema host ejecuta un software llamado hipervisor que cambia los recursos
entre los distintos invitados al igual que lo hace el kernel de Linux para procesos individuales. Con
hipervisores de bare metal, el hipervisor se ejecuta directamente en el hardware de la computadora
en lugar de en la parte superior de un sistema operativo, liberando más recursos para las imágenes
de los invitados.

La virtualización funciona porque los servidores pasan la mayor parte del tiempo inactivos y no
necesitan recursos físicos como un monitor y un teclado. Con el software de compañías como
VMWare y Openbox, ahora puede tomar una CPU potente y, al usarla para ejecutar varias
máquinas virtuales, los administradores pueden optimizar el uso de los recursos físicos y reducir
drásticamente los costos en comparación con el modelo de centro de datos de una máquina y un
sistema operativo anterior. La principal limitación es generalmente la memoria, sin embargo, con
los avances en la tecnología de hipervisor y CPU, es posible colocar más máquinas virtuales en un
host que nunca.

Contenedores y Despliegues de Metal Desnudo

Con el auge de las tecnologías de contenedorización como Docker y Kubernetes, ahora se está
escribiendo un software de aplicación que se ejecuta en un entorno sin servidor. Esencialmente, los
programadores están creando software que realiza una única función de un sistema (como
procesamiento o almacenamiento de bases de datos) que se ejecuta en un contenedor. Estos
contenedores están organizados en módulos que se ejecutan dentro de un nodo y pueden
comunicarse entre sí y con el mundo exterior si es necesario. Los nodos, a su vez, están organizados
y controlados por un nodo maestro que proporciona servicios a cada componente dentro de la
estructura. Construir aplicaciones de esta manera desacopla cada uno de los componentes de los
demás y de la sobrecarga de ejecutar un sistema operativo. Dado que cada pieza del rompecabezas
puede ser destruida y recreada automáticamente por el nodo maestro, ya no necesitan ser tan
robustos como el software que se ejecuta en la parte superior de un sistema operativo. Aunque estas
nuevas arquitecturas de programación están evitando en muchos aspectos la necesidad de un
sistema operativo tradicional, la tecnología subyacente que los hace funcionar sigue siendo Linux.
Por lo tanto, trabajar en Linux trabajará cada vez más dentro de un equipo de desarrollo que recurre
a las disciplinas de programación, diseño de bases de datos, redes y administración de sistemas para
crear los sistemas del futuro.

4.1 Introducción

Los proyectos de software toman la forma de código fuente, que es un conjunto de instrucciones
informáticas legibles por humanos. Dado que la computadora no entiende directamente el código
fuente, un compilador debe compilarlo en las instrucciones de la máquina. El compilador es un
programa especial que reúne todos los archivos de código fuente y genera instrucciones que se
pueden ejecutar en la computadora, como el kernel de Linux.
Históricamente, el software comercial se ha vendido bajo una licencia de código cerrado, lo que
significa que los usuarios tienen derecho a usar el código de la máquina, también conocido como
binario o ejecutable, pero no pueden ver el código fuente. A menudo, la licencia establece
explícitamente que los usuarios no pueden intentar realizar ingeniería inversa del código de la
máquina al código fuente para descubrir qué hace.

A considerar
El código fuente compilado en programas binarios es un método para crear programas y ejecutar
instrucciones informáticas. Otro son los muchos tipos de lenguajes interpretados, como PERL,
Python e incluso secuencias de comandos BASH, donde el código no se compila, sino que se
alimenta a un programa de interpretación, generalmente un ejecutable binario que comprende e
implementa las instrucciones contenidas en el código fuente o las secuencias de comandos
El desarrollo de Linux es muy similar al aumento del software de código abierto. Al principio había
shareware, programas disponibles gratuitamente donde los usuarios no necesariamente tenían
acceso al código fuente. Había muchas cosas buenas sobre esto, pero también era problemático
porque los programas maliciosos podían disfrazarse de juegos, protectores de pantalla y utilidades
de aspecto inocente.

El código abierto toma una vista del software centrada en la fuente. La filosofía de código abierto es
que los usuarios tienen derecho a obtener el código fuente del software y a expandir y modificar
programas para su propio uso. Esto también significaba que el código podía ser inspeccionado por
puertas traseras, virus y spyware. Al crear una comunidad de desarrolladores y usuarios, la
responsabilidad por errores, vulnerabilidades de seguridad y problemas de compatibilidad se
convirtió en una responsabilidad compartida. Esta nueva comunidad global de entusiastas de la
informática se vio potenciada por la creciente disponibilidad de servicios de Internet más rápidos y
la red mundial.
Hay muchas variantes diferentes de código abierto, pero todos están de acuerdo en que los usuarios
deben tener acceso al código fuente. Donde difieren es en cómo uno puede, o debe, redistribuir los
cambios.
Linux ha adoptado esta filosofía con gran éxito. Dado que Linux se escribió en el lenguaje de
programación C y reflejaba el diseño y la funcionalidad de los sistemas UNIX ya establecidos, se
convirtió naturalmente en un foro donde las personas podían desarrollar y compartir nuevas ideas.
Liberados de las limitaciones de las plataformas de hardware y software patentadas, un gran número
de programadores muy hábiles han podido contribuir a las diversas distribuciones, haciendo que el
software sea a menudo más robusto, estable, adaptable y, francamente, mejor que el propietario o
cerrado.
Es comprensible que las grandes organizaciones sospechen del uso de software creado de esta
nueva manera, pero con el tiempo se dieron cuenta de que sus mejores programadores estaban
trabajando en proyectos de código abierto basados en Linux en su tiempo libre. Pronto, los
servidores Linux y los programas de código abierto comenzaron a superar a los costosos sistemas
patentados que ya están en funcionamiento. Cuando llegó el momento de actualizar el hardware
obsoleto, los mismos programadores, ingenieros y administradores de sistemas que habían
comenzado a trabajar en Linux como pasatiempo pudieron convencer a sus jefes de que probaran
Linux. El resto es, como se dice, historia.
Antes del desarrollo de Linux, muchas aplicaciones corporativas y científicas se ejecutaban en
sistemas UNIX propietarios. A las empresas, universidades y gobiernos que administran grandes
granjas de servidores les gustó la estabilidad y la relativa facilidad de desarrollo de aplicaciones que
ofrecían estas plataformas
UNIX se creó inicialmente en 1969. En su cuarta edición, en 1973, se había reescrito en el lenguaje
de programación C que aún hoy es prominente. En 1984, la Universidad de California Berkeley
lanzó 4.2BSD que introdujo TCP / IP, la especificación de red que sustenta Internet. A principios de
la década de 1990, cuando comenzó el desarrollo de Linux, diferentes compañías que desarrollaban
sistemas operativos UNIX se dieron cuenta de que sus sistemas debían ser compatibles, y
comenzaron a trabajar en la especificación X / Open que todavía se usa hoy en día.
A lo largo de los años, los informáticos y las organizaciones que los emplean se han dado cuenta del
beneficio de los sistemas que proporcionan herramientas familiares y formas consistentes de
realizar tareas específicas. La estandarización de las interfaces de programación de aplicaciones
(API) permite que los programas escritos para un sistema operativo UNIX o Linux específico sean
portados (convertidos) relativamente fáciles de ejecutar en otro. Por lo tanto, si bien los sistemas
UNIX patentados todavía se usan en todo el mundo en entornos donde se prefieren soluciones
"certificadas", la industria, la academia y los gobiernos que las utilizan valoran la interoperabilidad
de estos sistemas junto con las computadoras Linux.
La importancia de las organizaciones de estándares no puede ser exagerada. Grupos como el IEEE
(Instituto de Ingenieros Eléctricos y Electrónicos) y POSIX (Interfaz de sistema operativo portátil),
permiten a profesionales de diferentes compañías e instituciones colaborar en especificaciones que
hacen posible que diferentes sistemas operativos y programas trabajen juntos. No importa si un
programa es de código cerrado o abierto, simple o complejo, si está escrito de acuerdo con estos
estándares, otros podrán usarlo y modificarlo en el futuro. Cada innovación en informática se basa
en el trabajo de otros que vinieron antes. El software de código abierto es una colaboración de
diferentes personas con diferentes necesidades y antecedentes, todos trabajando juntos para hacer
algo mejor de lo que cualquiera de ellos podría haber hecho individualmente. Los estándares son lo
que hace esto posible, y las muchas organizaciones que los crean, mantienen y promueven son parte
integral de la industria.

4.2 Open Source Licensing

Cuando hablamos de comprar software, hay tres componentes distintos:

Ownership : ¿Quién posee la propiedad intelectual detrás del software?


Money Transfer : ¿cómo cambia el dinero de manos, si es que lo hace?
Licensing : ¿Qué obtienes? ¿Qué puedes hacer con el software? ¿Se puede usar en una sola
computadora? ¿Se lo puedes dar a alguien más?

En la mayoría de los casos, la propiedad del software permanece con la persona o empresa que lo
creó. Los usuarios solo reciben una licencia para usar el software; Esta es una cuestión de derecho
de autor. La transferencia de dinero depende del modelo de negocio del creador. Es la licencia que
diferencia el software de código abierto del software de código cerrado.

Dos ejemplos contrastantes harán que las cosas comiencen.

Con Microsoft Windows, Microsoft Corporation posee la propiedad intelectual. La licencia en sí, el
Acuerdo de licencia de usuario final (EULA), es un documento legal personalizado en el que debe
hacer clic para indicar su aceptación para instalar el software. Microsoft mantiene el código fuente y
distribuye solo copias binarias a través de canales autorizados. Para la mayoría de los productos de
consumo, puede instalar el software en una computadora y no puede hacer copias del disco que no
sea para una copia de seguridad. No está permitido realizar ingeniería inversa del software. Paga
por una copia del software, que le proporciona actualizaciones menores pero no actualizaciones
importantes.

Linux es propiedad de Linus Torvalds. Ha colocado el código bajo una licencia llamada GNU
General Public License versión 2 (GPLv2). Esta licencia, entre otras cosas, dice que el código
fuente debe estar disponible para cualquiera que lo solicite y que cualquier persona puede realizar
cambios. Una advertencia a esto es que si alguien hace cambios y los distribuye, deben poner los
cambios bajo la misma licencia para que otros puedan beneficiarse. GPLv2 también dice que a
nadie se le permite cobrar por distribuir el código fuente aparte de los costos reales de hacerlo
(como copiarlo a un medio extraíble).

En general, cuando alguien crea algo, también tiene derecho a decidir cómo se usa y distribuye. El
software libre y de código abierto ,Free and Open Source Software (FOSS) ,se refiere al software
en el que se ha renunciado a este derecho; cualquiera puede ver el código fuente y redistribuirlo.
Linus Torvalds lo ha hecho con Linux: aunque creó Linux, no puede prohibir que alguien lo use en
su computadora porque lo ha renunciado a través de la licencia GPLv2.

La licencia de software es un problema político, por lo tanto, no debería sorprendernos que haya
muchas opiniones diferentes. Las organizaciones han creado su propia licencia que incorpora sus
puntos de vista particulares, por lo que es más fácil elegir una licencia existente que crear la suya.
Por ejemplo, universidades como el Instituto Tecnológico de Massachusetts (MIT) y la Universidad
de California han presentado licencias, al igual que proyectos como la Fundación Apache. Además,
grupos como la Free Software Foundation han creado sus propias licencias para ampliar su agenda.

4.2.1 La Fundación del Software Libre

Dos grupos pueden considerarse las fuerzas más influyentes en el mundo del código abierto: la Free
Software Foundation y la Open Source Initiative.
Solo unos años después del desarrollo del proyecto GNU, Richard Stallman fundó la Free Software
Foundation (FSF) en 1985 con el objetivo de promover el software libre. En este contexto, la
palabra "Free" no se refiere al precio, sino a la libertad de compartir, estudiar y modificar el código
fuente subyacente. Según su sitio web, la FSF cree que los usuarios deberían tener "control sobre la
tecnología que utilizamos en nuestros hogares, escuelas y negocios".
La FSF también aboga por que las licencias de software deben imponer la apertura de las
modificaciones. En su opinión, si alguien modifica el software libre, se le debe solicitar que
comparta los cambios que haya realizado cuando lo vuelva a compartir. Esta filosofía específica se
llama copyleft. Según la FSF, "copyleft es un método general para hacer que un programa (u otro
trabajo) sea gratuito (en el sentido de libertad, no" zero price"), y que también requiere que todas
las versiones modificadas y extendidas del programa sean gratuitas" .
La FSF también aboga contra las patentes de software y actúa como un perro guardián para las
organizaciones de estándares, al hablar sobre cuándo un estándar propuesto podría violar los
principios del software libre al incluir elementos como la Gestión de Derechos Digitales Digital
Rigths Management (DRM) que restringen lo que se puede hacer con programas compatibles.
La FSF ha desarrollado su propio conjunto de licencias que cualquiera puede usar de forma gratuita
según la Licencia Pública General General Public License(GPL) original de GNU. La FSF
actualmente mantiene la Licencia pública general GNU versión 2 General Public License(GPL
v2) y la versión 3 (GPLv3), así como las Licencias públicas generales menores Lesser General
Public Licenses GNU versión 2 (LGPLv2) y versión 3 (LGPLv3). Se pretende que estas licencias
se incluyan en el código fuente real para garantizar que todas las variantes y modificaciones futuras
del programa original continúen teniendo la misma libertad de uso que el original. La licencia GPL
y sus variantes son herramientas legales poderosas para avanzar en la causa del software libre en
todo el mundo. Lo que comenzó en 1983 como el deseo de un hombre de compartir y mejorar el
software al permitir que otros cambien, terminó cambiando el mundo.

Considera esto

Los cambios entre GPLv2 y GPLv3 se centraron en gran medida en el uso de software libre en un
dispositivo de hardware cerrado que ha sido acuñado Tivoization. TiVo es una compañía que
construye una grabadora de video digital de televisión en su propio hardware y utiliza Linux como
base para su software. Si bien TiVo lanzó el código fuente a su versión de Linux como lo requiere
GPLv2, el hardware no ejecutará ningún binario modificado. A los ojos de la FSF, esto iba en
contra del espíritu de la GPLv2, por lo que agregaron 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 optado por quedarse con
GPLv2.

4.2.2 La Iniciativa de Código Abierto

La Open Source Initiative (OSI) fue fundada en 1998 por Bruce Perens y Eric Raymond. Creían
que la Free Software Foundation estaba demasiado cargada políticamente y que eran necesarias
licencias menos extremas, particularmente en torno a los aspectos copyleft de las licencias FSF.
OSI cree que la fuente no solo debe estar disponible gratuitamente, sino que no se deben imponer
restricciones al uso del software, sin importar el uso previsto. A diferencia de la FSF, la OSI no
tiene su propio conjunto de licencias. En cambio, el OSI tiene un conjunto de principios y agrega
licencias a esa lista si cumplen con esos principios, llamados open source licenses. El software que
se ajusta a una licencia de código abierto es, por lo tanto, open source software.
Un tipo de Open Source License es el BSD (Berkeley Software Distribution) y sus derivados, que
son mucho más simples que GPL. Actualmente hay dos licencias "BSD" reales aprobadas por OSI,
una cláusula 2 y una cláusula 3. Estas licencias establecen que puede redistribuir la fuente y los
archivos binarios siempre que mantenga avisos de derechos de autor y no implica que el creador
original respalde su versión. En otras palabras, "do what you want with this software, just don’t say
you wrote it “(haz lo que quieras con este software, simplemente no digas que lo escribiste). Según
la FSF, la licencia original de BSD tenía un grave defecto ya que requería que los desarrolladores
agregaran una cláusula que reconociera a la Universidad de California, Berkeley, en cada anuncio
de software con licencia de este tipo. Mientras otros copiaban esta simple licencia, incluyeron el
reconocimiento de sus propias instituciones, lo que condujo a más de 75 reconocimientos en
algunos casos.
Las licencias FSF, como GPLv2, también son licencias de código abierto. Sin embargo, muchas
licencias de código abierto como BSD y MIT no contienen las disposiciones de copyleft y, por lo
tanto, no son aceptables para la FSF. Estas licencias se denominan permissive free software licenses
(licencias de software libre permisivas) porque son permisivas en cómo puede redistribuir el
software. Puede tomar software con licencia BSD e incluirlo en un producto de software cerrado
siempre que otorgue la atribución adecuada.

La comunidad ha comenzado a referirse a ellos colectivamente como software libre y de código


abierto Free and Open Source Software (FOSS). Debido a la ambigüedad de la palabra “free”,
decidieron definirlo como Free/Libre/Open Source Software (FLOSS).

4.2.3 Creative Commons

Las licencias FOSS están relacionadas principalmente con el software. La gente ha colocado obras
como dibujos y planos bajo licencias FOSS, pero esta no era la intención.
Cuando el software se ha colocado en el dominio público, el autor ha renunciado a todos los
derechos, incluidos los derechos de autor sobre el trabajo. En algunos países, este es el valor
predeterminado cuando el trabajo lo realiza una agencia gubernamental. En algunos países, el
trabajo protegido por derechos de autor se convierte en dominio público después de que el autor
fallece y ha transcurrido un largo período de espera.
La organización Creative Commons (CC) ha creado las licencias Creative Commons que intentan
abordar las intenciones detrás de las licencias FOSS para entidades que no son de software. Las
licencias CC también pueden usarse para restringir el uso comercial si ese es el deseo del titular de
los derechos de autor. Las licencias CC se componen del siguiente conjunto de condiciones que el
creador puede aplicar a su trabajo:
• Attribution (BY): todas las licencias CC requieren que se dé crédito al creador, sin que ello
implique que el creador aprueba el uso.
• ShareAlike (SA): esto permite que otros copien, distribuyan, realicen y modifiquen el
trabajo, siempre que lo hagan bajo los mismos términos.
• NonCommercial (NC): permite a otros distribuir, mostrar, realizar y modificar el trabajo
para cualquier propósito que no sea comercial.
• NoDerivatives (ND): esto permite a otros distribuir, mostrar y realizar solo copias
originales de la obra. Deben obtener el permiso del creador para modificarlo.

Estas condiciones se combinan para crear las seis licencias principales que ofrece Creative
Commons:
• Attribution (CC BY): al igual que la licencia BSD, puede usar el contenido para cualquier
uso, pero debe acreditar al titular de los derechos de autor.
• Attribution ShareAlike (CC BY-SA) : una versión copyleft de attribution license. Las
obras derivadas deben compartirse bajo la misma licencia, al igual que en los ideales del
Software Libre.
• Attribution NoDerivs (CC BY-ND): puede redistribuir el contenido en las mismas
condiciones que CC-BY, pero no puede cambiarlo.
• Attribution-NonCommercial (CC BY-NC): al igual que CC BY, pero no puede usarlo con
fines comerciales.
• Attribution-NonCommercial-ShareAlike (CC BY-NC-SA): se basa en la licencia CC BY-
NC pero requiere que sus cambios se compartan bajo la misma licencia.
• Attribution-NonCommercial-NoDerivs (CC BY-NC-ND): está compartiendo el contenido
para ser utilizado con fines no comerciales, pero las personas no pueden cambiar el
contenido.
• No Rights Reserved (CC0): esta es la versión Creative Commons del dominio público.
4.3 Modelos de negocio de código abierto

Si todo este software es gratuito, ¿cómo puede alguien ganar dinero con él?

Primero, debe comprender que no hay nada en la GPL que prohíba la venta de software. De hecho,
el derecho a vender software es parte de la licencia GPL. Nuevamente, recuerde que la palabra libre
se refiere a libertad, no a precio. Se alienta a las empresas que agregan valor a estos programas
gratuitos a que ganen tanto dinero como puedan y que vuelvan a poner esas ganancias en el
desarrollo de más y mejor software.

Una de las formas más simples de ganar dinero es vender soporte o garantía en torno al software.
Empresas como Canonical, el desarrollador de Ubuntu y Redhat se han convertido en grandes
empresas al crear distribuciones y herramientas de Linux que permiten a los usuarios comerciales
administrar sus empresas y ofrecer productos y servicios a sus clientes.

Muchos otros proyectos de código abierto también se han expandido a negocios sustanciales. En la
década de 1990, Gerald Combs trabajaba en un proveedor de servicios de Internet y comenzó a
escribir su propia herramienta de análisis de red porque herramientas similares en ese momento eran
costosas. Más de 600 personas han contribuido al proyecto, llamado Wireshark. Ahora se considera
a menudo mejor que las ofertas comerciales y llevó a que se formara una empresa para vender
productos y soporte. Al igual que muchos otros, esta empresa fue comprada por una empresa más
grande que apoya su continuo desarrollo.

Empresas como Tivo han empaquetado hardware o agregan software de código cerrado adicional
para vender junto con el software gratuito. Los dispositivos y sistemas integrados que usan Linux
son un negocio multimillonario y abarcan todo, desde DVR para el hogar hasta cámaras de
seguridad y dispositivos de fitness portátiles. Muchos firewalls de consumo y dispositivos de
entretenimiento siguen este modelo.

Hoy en día, tanto los empleadores grandes como los pequeños tienen individuos y, a veces, grupos
enteros dedicados a trabajar en proyectos de código abierto. Las empresas de tecnología compiten
por la oportunidad de influir en proyectos que darán forma al futuro de sus industrias. Otras
empresas dedican recursos a proyectos que necesitan para uso interno. A medida que se hacen más
negocios con recursos en la nube, la oportunidad para los programadores de código abierto continúa
expandiéndose.
5.1 Introducción

La mayoría de los sistemas operativos de consumo están diseñados para proteger al usuario de los
entresijos de la CLI. La comunidad de Linux es diferente, ya que celebra positivamente la CLI por
su potencia, velocidad y capacidad para realizar una amplia gama de tareas con una sola instrucción
de línea de comandos.
Además, al aprender la CLI, un usuario puede ser fácilmente productivo casi instantáneamente en
CUALQUIER versión o distribución de Linux, reduciendo la cantidad de tiempo necesaria para
familiarizarse con un sistema debido a las variaciones en una GUI.
¿Por qué es importante conocer la línea de comando? ¡Flexibilidad y movilidad! Al comprender la
base de Linux, tiene la capacidad de trabajar en CUALQUIER distribución de Linux. Esto podría
significar una empresa con un entorno mixto o una nueva empresa con una distribución de Linux
diferente.

5.2 Shell

Una vez que un usuario ha ingresado un comando, el terminal acepta lo que ha escrito y lo pasa a un
shell. El shell es el intérprete de línea de comandos que traduce los comandos ingresados por un
usuario en acciones que debe realizar el sistema operativo. Si el comando genera un resultado, el
texto se muestra en el terminal. Si se encuentran problemas con el comando, se muestra un mensaje
de error.
El entorno Linux permite el uso de muchos shells diferentes, algunos de los cuales han existido
durante muchos años. El shell más utilizado para las distribuciones de Linux se llama Bash shell.
Bash proporciona muchas características avanzadas, como el historial de comandos y la edición en
línea, que permite al usuario volver a ejecutar fácilmente comandos ejecutados previamente o una
variación de ellos mediante una edición simple.
Otras características de Bash:
• Scripting: Secuencia de comandos, la capacidad de colocar comandos en un archivo y luego
interpretar, usar Bash para ejecutar el contenido. Esta característica también tiene algunas
características de programación, como conditional statements (declaraciones condicionales)
y la capacidad de crear funciones (AKA Subroutines)
• Aliases: Crear apodos cortos para comandos largos

• Variables: Se utilizan para almacenar información para el Bash Shell y para el usuario.
Estas variables su pueden usar para modificar como funcionan los comandos y las
funciones, así como para proporcionar información vital del sistema.
Cuando se ejecuta una aplicación de terminal y aparece un shell, que muestra una parte importante
de la interfaz: prompt. El mensaje no solo indica que se pueden ejecutar comandos, sino que
también transmite información útil al usuario. El aviso es totalmente configurable y puede ser tan
escaso o completo como sea práctico y útil.

La estructura del prompt. puede variar entre distribuciones, pero generalmente contiene
información sobre el usuario y el sistema. A continuación se muestra una estructura de aviso común:

sysadmin@localhost:~$

sysadmin → Es el usuario ;
localhost → Es el sistema ;
~ → Directorio actual

El símbolo ~ se utiliza como abreviatura para el directorio home del usuario. Normalmente, el
directorio de home para el usuario está bajo el director / home.

Un command es un software que cuando se ejecuta en la CLI realiza una acción en la computadora.
Para escribir un command el primer paso es escribir el nombre del command.

Muchos comandos pueden usarse por si mismos, pero otros necesitan opciones y argumentos.
El formato típico para un comando es el siguiente:

command [options] [arguments]

options : Se utilizan para modificar el comportamiento del comando


arguments : Se utilizan para proporcionar información adicional

Cada opción y argumento normalmente están separados por un espacio, aunque a menudo se
pueden combinar.
Linux distingue entre mayúsculas y minúsculas. Los command, options, arguments, variables y
file names deben ingresarse exactamente como se muestran.

5.3.1 Arguments
Se puede usar un argumento para especificar algo sobre lo que el comando debe actuar. Si el
comando ls recibe el nombre de un directorio como argumento, enumera el contenido de ese
directorio. En el siguiente ejemplo, el directorio / etc / ppp se usa como argumento; el resultado
resultante es una lista de archivos contenidos en ese directorio:

sysadmin@localhost:~$ ls /etc/ppp
Ip-down.d ip-up.d
El comando ls también acepta múltiples argumentos. Para enumerar los contenidos de los
directorios /etc/ppp y /etc/ssh, páselos a ambos como argumentos:
sysadmin@localhost:~$ ls /etc/ppp /etc/ssh
/etc/ppp
Ip-down.d ip-up.d
/etc/ssh
moduli ssh_host_dsa_key.pub ssh_host_rsa_key sshd_configssh_config
ssh_host_ecdsa_key ssh_host_rsa_key.pub
ssh_host_dsa_key ssh_host_ecdsa_key.pub ssh_import_id

5.3.2 Options
Las opciones se pueden usar con comandos para expandir o modificar el comportamiento de un
comando. Por ejemplo, el uso de la opción -l del comando ls da como resultado una lista larga, que
proporciona información adicional sobre los archivos que se enumeran, 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 20:13 Desktop
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 20:13 Documents
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 20:13 Downloads
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 20:13 Music
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 20:13 Pictures
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 20:13 Public
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 20:13 Templates
drwxr-xr-x 1 sysadmin sysadmin 0 Jan 29 20:13 Videos

A menudo, el carácter se elige para ser mnemotécnico para su propósito, como elegir la letra l por
largo o r por reversa. De manera predeterminada, el comando ls imprime los resultados en orden
alfabético y, al agregar la opción -r, imprime los resultados en orden alfabético inverso.

sysadmin@localhost:~$ ls -r
Videos Templates Public Pictures Music Downloads Documents Desktop

En la mayoría de los casos, las opciones se pueden usar junto con otras opciones. Se pueden dar
como opciones separadas, como en -l -r, o combinadas, como en -lr. La combinación de estas dos
opciones daría como resultado una salida de listado larga en orden alfabético inverso:
El orden de las opciones no altera el resultado
sysadmin@localhost:~$ ls -lr
total 32
drwxr-xr-x 2 sysadmin sysadmin 4096 Oct 31 20:13 Videos
drwxr-xr-x 2 sysadmin sysadmin 4096 Oct 31 20:13 Templates
drwxr-xr-x 2 sysadmin sysadmin 4096 Oct 31 20:13 Public
drwxr-xr-x 2 sysadmin sysadmin 4096 Oct 31 20:13 Pictures
drwxr-xr-x 2 sysadmin sysadmin 4096 Oct 31 20:13 Music
drwxr-xr-x 2 sysadmin sysadmin 4096 Oct 31 20:13 Downloads
drwxr-xr-x 4 sysadmin sysadmin 4096 Oct 31 20:13 Documents
drwxr-xr-x 2 sysadmin sysadmin 4096 Oct 31 20:13 Desktop

Por defecto la opción -l del comando ls, muestra el tamaño de los archivos en bytes.
sysadmin@localhost:~$ ls -l /usr/bin/perl
-rwxr-xr-x 2 root root 10376 Feb 4 2018 /usr/bin/perl

Si se agrega la opción -h el resultado que se muestra esta en formato legible para humanos
sysadmin@localhost:~$ ls -lh /usr/bin/perl
-rwxr-xr-x 2 root root 11K Feb 4 2018 /usr/bin/perl

Las opciones son a menudo letras simples; sin embargo, a veces también son palabras o frases. Por
lo general, los comandos más antiguos usan letras simples, mientras que los comandos más nuevos
usan palabras completas para las opciones. Las opciones de una letra están precedidas por un solo
guión - carácter, como la opción -h. Las opciones de palabras completas están precedidas por dos
guiones: caracteres. La opción -h también tiene una forma equivalente de palabra completa; the –
human-readable.
sysadmin@localhost:~$ ls -l --human-readable /usr/bin/perl
-rwxr-xr-x 2 root root 11K Feb 4 2018 /usr/bin/perl

5.3.3 Historia

Cuando se ejecuta un comando en el terminal, se almacena en una lista de historial. Esto está
diseñado para facilitar la ejecución del mismo comando, eliminando más tarde la necesidad de
volver a escribir todo el comando.

Al presionar la flecha hacia arriba ↑ se muestra el comando anterior en la línea de solicitud. El


historial completo de los comandos ejecutados en la sesión actual se puede mostrar presionando
Arriba varias veces para retroceder en el historial de los comandos que se han ejecutado. Al
presionar la tecla Intro se ejecuta nuevamente el comando que se muestra.

Cuando se encuentra el comando deseado, las teclas de flecha izquierda ← y flecha derecha →
pueden colocar el cursor para editar. Otras teclas útiles para editar incluyen las teclas Inicio, Fin,
Retroceso y Eliminar.
Para ver la lista de historial de una terminal, use el comando de historial:
sysadmin@localhost:~$ date
Wed Dec 12 04:28:12 UTC 2018
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ cal 5 2030
May 2030
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 2030
4 history

Si el comando deseado está en la lista que genera el comando de historial, se puede ejecutar
escribiendo un signo de exclamación (!). carácter y luego el número al lado del comando, por
ejemplo, para ejecutar el comando cal nuevamente:
sysadmin@localhost:~$ history
1 date
2 ls
3 cal 5 2030
4 history

sysadmin@localhost:~$ !3
May 2030
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
Si el comando de historial pasa un número como argumento, genera ese número de comandos
previos de la lista de historial. Por ejemplo, para mostrar los últimos tres comandos:
sysadmin@localhost:~$ history 3
6 date
7 ls /home
8 history 3

Para ejecutar el enésimo comando desde la parte inferior de la lista del historial, escriba ! -N y
presione Entrar. Por ejemplo, para ejecutar el tercer comando desde la parte inferior de la lista del
historial, ejecute lo siguiente:
sysadmin@localhost:~$ !-3
date
Wed Dec 12 04:31:55 UTC 2018

Para ejecutar el comando más reciente: Introducir doble signo de exclamación → !!

sysadmin@localhost:~$ date
Wed Dec 12 04:31:55 UTC 2018
sysadmin@localhost:~$ !!
date
Wed Dec 12 04:31:55 UTC 2018

Para ejecutar la iteración más reciente de un comando específico, escriba “ ! “ seguido por el
nombre del comando y presiona Enter. Por ejemplo, para ejecutar el comando ls más reciente:

sysadmin@localhost:~$ ! ls
ls /home
sysadmin

5.4 Variables

Una variable es una característica que permite al usuario o al shell almacenar datos. Estos datos se
pueden usar 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. Hay dos tipos de variables utilizadas en el shell Bash:
local y environment.

5.4.1 Local Variables

Las variables locales o de shell existen solo en el shell actual y no pueden afectar a otros comandos
o aplicaciones. Cuando el usuario cierra una ventana de terminal o shell, se pierden todas las
variables. A menudo se asocian con tareas basadas en el usuario y están en minúsculas por
convención.

Para establecer el valor de una variable, use la siguiente expresión de asignación. Si la variable ya
existe, el valor de la variable se modifica. Si el nombre de la variable aún no existe, el shell crea una
nueva variable local y establece el valor:
variable = value

sysadmin@localhost:~$ variable1=’Something'

El comando echo se usa para mostrar la salida en el terminal. Para mostrar el valor de la variable,
use un signo de dólar $ carácter seguido del nombre de la variable como argumento para el
comando echo:

sysadmin@localhost:~$ variable1=’Something'
sysadmin@localhost:~$ echo $variable1
’Something'

5.4.1 Environment Variables


Las environment variables, también llamadas global variables , están disponibles en todo el
sistema, en todos los shells utilizados por Bash al interpretar comandos y realizar tareas. El sistema
recrea automáticamente las variables de entorno cuando se abre un nuevo shell. Los ejemplos
incluyen las variables PATH, HOME y HISTSIZE. La variable HISTSIZE define cuántos
comandos se pueden almacenar en la lista del historial. El comando en el ejemplo a continuación
muestra el valor de la variable HISTSIZE y de como cambiar su valor.

sysadmin@localhost:~$ echo HISTSIZE


1000
sysadmin@localhost:~$ HISTSIZE=500

Cuando se ejecuta sin argumentos, el comando env genera una lista de las variables de entorno.
Debido a que la salida del comando env puede ser bastante larga, los siguientes ejemplos utilizan
una búsqueda de texto para filtrar esa salida.

En un ejemplo anterior, la variable1 se creó como una variable local, por lo que la siguiente
búsqueda en las variables de entorno no genera resultados:

sysadmin@localhost:~$ env | grep variable1

La pipa (pipe) | El carácter pasa la salida del comando env al comando grep, que busca la salida.
El comando export se utiliza para convertir una variable local en una variable de entorno.

sysadmin@localhost:~$ env | grep variable1


sysadmin@localhost:~$ export variable1
sysadmin@localhost:~$ env | grep variable1
variable1=’Something’

El comando export también se puede utilizar para convertir una variable en una variable de entorno
después de su creación utilizando la expresión de asignación como argumento:

sysadmin@localhost:~$ export variable2=’else’


sysadmin@localhost:~$ env | grep variable2
variable2=’else’

Para cambiar el valor de una variable de entorno, use la expresión de asignación:

sysadmin@localhost:~$ variable1=$variable1’ ‘$variable2


sysadmin@localhost:~$ echo $variable1
Something else

Las variables exportadas pueden ser eliminadas con el comando unset:

sysadmin@localhost:~$ unset variable2

5.4.3 Path variable

Una de las variables de shell Bash más importantes para comprender es la variable PATH. Contiene
una lista que define en qué directorios busca el shell para buscar comandos. Si se ingresa un
comando válido y el shell devuelve un error "comando no encontrado", es porque el shell Bash no
pudo ubicar un comando con ese nombre en ninguno de los directorios incluidos en la ruta. El
siguiente comando muestra la ruta del shell actual:

sysadmin@localhost:~$ echo $PATH


/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Cada directorio en la lista está separado por dos puntos: carácter. Según la salida anterior, la ruta
contiene los siguientes directorios. El shell verificará los directorios en el orden en que aparecen:

/home/sysadmin/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games

Cada uno de estos directorios está representado por una ruta. Una ruta es una lista de directorios
separados por el carácter /. Si piensa en el sistema de archivos como un mapa, las rutas son las
direcciones de directorio, que incluyen instrucciones de navegación paso a paso; se pueden usar
para indicar la ubicación de cualquier archivo dentro del sistema de archivos. Por ejemplo,
/home/sysadmin es una ruta al home directory:

Si se instala un software personalizado en el sistema, puede ser necesario modificar la RUTA para
facilitar la ejecución de estos comandos. Por ejemplo, lo siguiente agregará y verificará 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

Al actualizar la variable PATH, siempre incluya la ruta actual, para no perder el acceso a los comandos
ubicados en esos directorios. Esto se puede lograr agregando $ PATH al valor en la expresión de
asignación. Recuerde que un nombre de variable precedido por un signo de dólar representa el valor
de la variable.
5.5 Command Types

Una forma de aprender más sobre un comando es observar de dónde viene. El comando type se
puede usar para determinar información sobre el tipo de comando.
type command
Hay varias fuentes diferentes de comandos dentro del shell de su CLI, incluidos internal
commands, external commands, aliases y functions

También llamados comandos integrados, los comandos internos están integrados en el propio shell.
Un buen ejemplo es el comando cd (change directory) ya que es parte del Bash shell. Cuando un
usuario escribe el comando cd, el shell Bash ya se está ejecutando y sabe cómo interpretarlo, por lo
que no es necesario iniciar ningún programa adicional.

El comando type identifica el comando cd como un comando interno:


sysadmin@localhost:~$ type cd
cd is a shell builtin

5.5.2 Comandos externos

Los comandos externos se almacenan en archivos que busca el shell. Si un usuario escribe el
comando ls, el shell busca a través de los directorios que se enumeran en la variable PATH para
intentar encontrar un archivo llamado ls que pueda ejecutar.

Si un comando no se comporta como se esperaba o si un comando no es accesible, debería ser


beneficioso saber dónde el shell encuentra el comando o qué versión está utilizando. Sería tedioso
tener que buscar manualmente en cada directorio que aparece en la variable PATH. En su lugar, use
el comando which para mostrar la ruta completa al comando en cuestión:

sysadmin@localhost:~$ which ls
/bin/ls
sysadmin@localhost:~$ which cal
/usr/bin/cal

Los comandos externos también se pueden ejecutar escribiendo la ruta completa al comando. Por
ejemplo, para ejecutar el comando ls:
sysadmin@localhost:~$ bin/ls
Para comandos externos, el comando type muestra la ubicación del comando:
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ type cal
cal is /usr/bin/cal

En algunos casos, la salida del comando type puede diferir significativamente de la salida del
comando which:

sysadmin@localhost:~$ type echo


Echo is a shell builtin
sysadmin@localhost:~$ which echo
/bin/echo

El uso de la opción « -a » del comando type muestra todas las ubicaciones que contienen el
comando al que se llama:

sysadmin@localhost:~$ type -a echo


echo is a shell builtin
echo is /bin/echo

5.5.3 Alias

Se puede usar un alias para asignar comandos más largos a secuencias de teclas más cortas. Cuando
el shell ve que se está ejecutando un alias, sustituye la secuencia más larga antes de proceder a
interpretar los comandos.

Por ejemplo, el comando ls -l suele tener un alias de l o ll. Debido a que estos comandos más
pequeños son más fáciles de escribir, se vuelve más rápido ejecutar la línea de comando ls -l.

Para determinar qué alias están establecidos en el shell actual, use el comando alias:

sysadmin@localhost:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
Los alias de los ejemplos anteriores fueron creados por archivos de inicialización. Estos archivos
están diseñados para hacer que el proceso de creación de alias sea automático.

Se pueden crear nuevos alias utilizando el siguiente formato, donde name es el nombre que se le
dará alias y command es el comando que se ejecutará cuando se ejecute el alias.

alias name = “command” → alias mycal = “cal 2020”

Por ejemplo, el comando cal 2019 muestra el calendario para el año 2019. Suponga que termina
ejecutando este comando con frecuencia. En lugar de ejecutar el comando completo cada vez, puede
crear un alias llamado mycal y ejecutar el alias, como se muestra en el siguiente gráfico:

sysadmin@localhost:~$ alias mycal=”cal 2019”


January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 1 2 1 2
6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9
13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16
20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23
27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30
31

Los alias creados de esta manera solo persisten mientras el shell está abierto. Una vez que se cierra
el shell, se pierden los nuevos alias. Además, cada shell tiene sus propios alias, por lo que los alias
creados en un shell no estarán disponibles en un nuevo shell abierto.

El comando type puede identificar alias a otros comandos:

sysadmin@localhost:~$ type cal


ll is aliased to `ls -alF'
sysadmin@localhost:~$ type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls

5.5.4 Functions

Las funciones también se pueden construir utilizando los comandos existentes para crear nuevos
comandos o para anular los comandos integrados en el shell o los comandos almacenados en los
archivos. Los alias y las funciones normalmente se cargan desde los archivos de inicialización
cuando se inicia el shell por primera vez.
5.6 Quoting

Las comillas se utilizan en toda la administración de Linux y en la mayoría de los lenguajes de


programación para que el sistema sepa que la información contenida en las comillas debe ignorarse
o tratarse de una manera muy diferente de lo que normalmente se trataría. Hay tres tipos de comillas
que tienen un significado especial para el shell Bash: comillas dobles (double quotes “ “), comillas
simples (simple quotes ‘ ‘ )y comillas inversas (reverse quotes ` ` ). Cada conjunto de comillas
alerta al shell para que no trate el texto dentro de las comillas de la manera normal.

5.6.1 Double Quotes

Las comillas dobles impiden que el shell interprete algunos metacaracteres (caracteres especiales),
incluidos los caracteres globales.

Los caracteres Glob, (Glob character or wild card) también llamados comodines, son símbolos que
tienen un significado especial para el shell; son interpretados por el propio shell antes de que intente
ejecutar cualquier comando. Los Glob character incluyen el asterisco *, the question mark ? , y
los corchetes (the brackets)[], entre otros.

Globbing se cubrirá con mayor detalle más adelante en el curso.*

Entre comillas dobles, un asterisco es solo un asterisco, un signo de interrogación es solo un signo
de interrogación, y así sucesivamente, lo cual es útil cuando desea mostrar algo en la pantalla que
normalmente es un carácter especial para el shell. En el comando echo a continuación, el shell Bash
no convierte el patrón global en nombres de archivo que coinciden con el patrón:

sysadmin@localhost:~$ echo "The glob characters are *, ? and [ ]"


The glob characters are *, ? and [ ]

En el siguiente se muestra que el valor de la variable PATH no ha cambiado.


sysadmin@localhost:~$ echo "The path is $PATH"
The path is /usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr

Ejemplo double quotes:


sysadmin@localhost:~$ echo D*
Desktop Documents Downloads
sysadmin@localhost:~$ echo “D*”
D*
5.6.2 Simple Quotes

Las comillas simples evitan que el intérprete interprete caracteres especiales, incluidos globs,
variables, sustitución de comandos y otros metacaracteres que aún no se han discutido.Por ejemplo,
para hacer que el carácter $ simplemente signifique un $, en lugar de actuar como un indicador para
que el shell busque el valor de una variable, ejecute el segundo comando que se muestra a
continuación:

sysadmin@localhost:~$ echo The car costs $100


The car costs 00
sysadmin@localhost:~$
echo 'The car costs $100'
33333

5.6.3 Backslash Character

También existe una técnica alternativa para citar esencialmente un solo carácter. Considere el
siguiente mensaje:
El servicio cuesta $1 y la ruta es $PATH

Si esta oración se coloca entre comillas dobles, $1 y $PATH se consideran variables.

sysadmin@localhost:~$ echo “The services costs $1 and the path is $PATH”


The service costs and the path is /usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/u
sysadmin@localhost:~$
echo 'The car costs $100'

Si se coloca entre comillas simples, $1 y $PATH no se consideran variables.

sysadmin@localhost:~$ echo ‘The services costs $1 and the path is $PATH’


The service costs $100 and the path is $PATH

Pero, ¿qué pasa si quieres que $ PATH sea tratado como una variable y $ 1 no?
En este caso, use una backslash \ delante del signo de dólar $ para evitar que el shell lo interprete.
El siguiente comando demuestra el uso del carácter \:

sysadmin@localhost:~$ echo The service costs \$1 and the path is $PATH
The service costs $1 and the path is /usr/bin/custom:/home/sysadmin/bin:/usr/local/sbin:/usr/local/bin:/usr/sbi
5.6.4 Backquotes

Las Backquotes, or backticks (comillas inversas), se utilizan para especificar un comando dentro
de un comando, un proceso llamado command substitution (substitucion de comando). Esto
permite el uso potente y sofisticado de comandos.

Si bien puede sonar confuso, un ejemplo debería aclarar las cosas. Para comenzar, observe el
resultado del comando de fecha:

sysadmin@localhost:~$ date
Mon Nov 4 03:35:50 UTC 2018

Now, note the output of the echo command:

sysadmin@localhost:~$ echo Today is date


Today is date

En el comando anterior, la palabra date se trata como texto normal y el shell pasa la date al
comando echo. Para ejecutar el comando date y enviar el resultado de ese comando al comando
echo, coloque el comando date entre dos caracteres de comillas inversas

sysadmin@localhost:~$ echo Today is `date`


Today is Mon Nov 4 03:40:04 UTC 2018
sysadmin@localhost:~$ echo Today is $(date)
Today is Mon Nov 4 03:40:04 UTC 2018
sysadmin@localhost:~$ echo This is the command "`date`"
This is the command Mon Dec 3 21:37:33 UTC 2018

5.7 Control Statements

Las instrucciones de control (Control Statements) le permiten usar múltiples comandos a la vez o
ejecutar comandos adicionales, dependiendo del éxito de un comando anterior. Por lo general, estas
instrucciones de control se usan dentro de los scripts, pero también se pueden usar en la línea de
comandos.
5.7.1 Semicolon

command1; command2; command3


El punto y coma (semicolon ;) Se puede utilizar para ejecutar varios comandos, uno tras otro. Cada
comando se ejecuta de forma independiente y consecutiva; independientemente del resultado del
primer comando, el segundo comando se ejecuta una vez que se completa el primero, luego el
tercero y así sucesivamente.
sysadmin@localhost:~$ cal 1 2030; cal 2 2030; cal 3 2040
January
Por ejemplo, para imprimir los meses de enero, febrero y marzo de 2030, ejecute el siguiente
Su Mo
comando: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

February
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
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

5.7.2 Double Ampersand


command1 && command2
El double Ampersand (doble ampersand &&) actúa como un "y" lógico; si el primer comando es
exitoso, entonces el segundo comando también se ejecutará. Si el primer comando falla, entonces el
segundo comando no se ejecutará.
El comando echo se ejecuta porque el comando ls tiene éxito:

sysadmin@localhost:~$ ls /etc/ppp && echo success


ip-down.d ip-up.d
success
5.7.3 Double Pipe

command1 || command2
El double pipe || es un "o" lógico. Dependiendo del resultado del primer comando, el segundo
comando se ejecutará o se omitirá. Si el primer comando se ejecuta con éxito, se omite el segundo
comando; Si el primer comando falla, se ejecuta el segundo comando. En otras palabras,
básicamente le está diciendo al shell: "Ejecute este primer comando o el segundo

sysadmin@localhost:~$ ls /etc/ppp || echo failed


ip-down.d ip-up.d
sysadmin@localhost:~$ ls /etc/junk || echo failed
ls: cannot access /etc/junk: No such file or directory
failed

Para ver el usuario en el que trabajamos actualmente. Este comando es útil cuando delante del
prompt no proporciona información.
sysadmin@localhost:~$ whoami
sysadmin

El comando uname proporciona información del sistema. Se pueden incluir opciones como –
nodename que proporciona información del network node.

6.2 Man Pages

UNIX es el sistema operativo que Linux fue modelado después. Los desarrolladores de UNIX
crearon documentos de ayuda llamados páginas de manual (abreviatura de páginas de manual).

Las páginas de manual se usan para describir las características de los comandos. Proporcionan una
descripción básica del propósito del comando, así como detalles sobre las opciones disponibles.
Para ver las man-pages hay que usar el comando man.

sysadmin@localhost:~$ man ls

LS(1) User Commands LS(1)

NAME
ls - list directory contents

SYNOPSIS
ls [OPTION]... [FILE]...

DESCRIPTION
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is speci-
fied.

Mandatory arguments to long options are mandatory for short options


too.

-a, --all
do not ignore entries starting with .

Q→ Quitar ; H→Help page

6.2.2 Sections Within Man Pages

Las páginas del manual están divididas en secciones. Cada sección está diseñada para proporcionar
información específica sobre un comando. Si bien se ven secciones comunes en la mayoría de las
páginas man, algunos desarrolladores también crean secciones sólo disponibles en páginas man
específicas.

A continuación se describen algunas de las secciones más comunes que se encuentran en las páginas
de manual:
NAME:
Proporciona el nombre del comando y una breve descripción.

SYNOPSIS:
Proporciona ejemplos de como se ejecuta el comando. Proporciona un ejemplo conciso de cómo
usar el comando. Por ejemplo, considere la SINOPSIS de la página de manual para el comando cal
sysadmin@localhost:~$ man cal

CAL(1) User Commands CAL(1)

NAME
cal, ncal — displays a calendar and the date of Easter

SYNOPSIS
cal [-31jy] [-A number] [-B number] [-d yyyy-mm] [[month] year]
cal [-31j] [-A number] [-B number] [-d yyyy-mm] -m month [year]
ncal [-C] [-31jy] [-A number] [-B number] [-d yyyy-mm] [[month] year]
ncal [-C] [-31j] [-A number] [-B number] [-d yyyy-mm] -m month [year]
ncal [-31bhjJpwySM] [-A number] [-B number] [-H yyyy-mm-dd] [-d yyyy-mm]
[-s country_code] [[month] year]
ncal [-31bhJeoSM] [-A number] [-B number] [-d yyyy-mm] [year]

The square brackets [] se usan para indicar que esta función no es necesaria para ejecutar el
comando. Por ejemplo, [-31jy] significa que las opciones -3, -1, -j o -y están disponibles, pero no
son necesarias para que el comando cal funcione correctamente.

El último conjunto de corchetes [[month] year] muestra otra característica; significa que un año
puede especificarse por sí mismo, pero para especificar un mes, el año también debe especificarse.

Otro componente de la SYNOPSIS que puede causar cierta confusión se puede ver en la página del
comando man date:
sysadmin@localhost:~$ man date

SYNOPSIS
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
En esta SYNOPSIS hay dos sintaxis para el comando date. El primero se usa para mostrar la fecha
en el sistema, mientras que el segundo se usa para establecer la fecha

Los puntos suspensivos ... después de [OPCIÓN] indican que uno o más de los elementos antes de
que se puedan usar.

Además, la notación [-u | --utc | --universal] significa que se puede usar la opción -u o la opción --
utc o la opción --universal. Por lo general, esto significa que las tres opciones realmente hacen lo
mismo, pero a veces el uso de | el carácter se usa para indicar que las opciones no se pueden usar en
combinación, como un "o" lógico.
DESCRIPTION

Proporciona una descripción más detallada del comando.


sysadmin@localhost:~$ man ls

DESCRIPTION
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is speci‐
fied
OPTIONS

Enumera las opciones para el comando, así como una descripción de cómo se usan. A menudo, esta
información se encuentra en la sección DESCRIPCIÓN y no en una sección OPCIONES separada.

sysadmin@localhost:~$ man ls

OPTIONS
-a, --all
do not ignore entries starting with .

-A, --almost-all
do not list implied . and ..

--author
with -l, print the author of each file

-b, --escape
print C-style escapes for nongraphic characters

--block-size=SIZE
scale sizes by SIZE before printing them; e.g., '--block-size=M'
prints sizes in units of 1,048,576 bytes; see SIZE format belo

FILES

Lista los archivos que están asociados con el comando, así como una descripción de cómo se usan.
Estos archivos se pueden usar para configurar las funciones más avanzadas del comando. A menudo
esta información se encuentra en la sección DESCRIPCIÓN y no en una sección de ARCHIVOS
separada.

AUTHOR

Proporciona el nombre de la persona que ha creado la pagina man y algunas veces su contacto.

REPORTING BUGS

Proporciona detalles de como reporta problemas con el comando

REPORTING BUGS
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report ls translation bugs to <http://translationproject.org/team/>

COPYRIGHT

Proporciona la información básica de Copyright


SEE ALSO

Le proporciona una idea de dónde puede encontrar información adicional. Esto a menudo incluye
otros comandos relacionados con este comando.

SEE ALSO
Full documentation at: <http://www.gnu.org/software/coreutils/ls>
or available locally via: info '(coreutils) ls invocation'

6.2.3 Searching Man Pages

Para buscar un término en una página de man, escriba el carácter / seguido de un término de
búsqueda, luego presione la tecla Enter. El programa busca desde la ubicación actual hacia la parte
inferior de la página para intentar localizar y resaltar el término.

Si se encuentra una coincidencia, se resaltará. Para pasar a la siguiente coincidencia del término,
presione n. Para volver a una coincidencia anterior del término, presione Mayús + N. Si no se
encuentra el término, o al llegar al final de las coincidencias, el programa informará sobre Patrón no
encontrado (presione Return).

6.2.4 Man Pages Categorized by Sections

Hasta ahora, hemos estado mostrando páginas man para comandos. Sin embargo, hay diferentes
tipos de comandos (user command, system command y administration command), archivos de
configuración y otras características, como bibliotecas y componentes del núcleo, que requieren
documentación.
Como resultado, hay miles de páginas man en una distribución típica de Linux. Para organizar todas
estas páginas de manual, se clasifican por secciones.
Por defecto, hay nueve secciones de páginas de manual:
1. General Commands (Comandos generales) Executable programs or shell commands
2. System Calls (Llamadas al Sistema) (functions provided by the kernel)
3. Library Calls (Llamadas a la Libreria) (functions within program libraries)
4. Special Files (Archivos especiales) (usually found in /dev)

5. File Formats and Conventions (Formato de archivo y convenciones) e.g. /etc/passwd

6. Games (Juegos)
7. Miscellaneous (Diverso) including macro packages and conventions), e.g. man(7)>,
groff(7)
8. System Administration Commands (Comandos de administración del sistema) (usually
only for root)
9. Kernel Routines (Rutinas del Kernel)

El comando man busca cada una de estas secciones en orden hasta que encuentra la primera
coincidencia. Por ejemplo, si ejecuta el comando man cal, la primera sección (Comandos
generales) busca una página man llamada cal. Si no se encuentra, se busca la segunda sección. Si
no se encuentra ninguna página de man después de buscar en todas las secciones, se devuelve un
mensaje de error:

sysadmin@localhost:~$ man zed


No manual entry for zed

Para determinar a qué sección pertenece una página de manual específica, observe el valor
numérico en la primera línea de la salida de la página de manual. Por ejemplo, el comando cal
pertenece a la primera sección de las páginas man:

CAL(1) BSD General Commands Manual

A veces hay páginas de manual con el mismo nombre en diferentes secciones. En estos casos, puede
ser necesario especificar la sección de la página de man correcta.

Por ejemplo, hay un comando llamado passwd que le permite cambiar su contraseña. También hay
un archivo llamado passwd que almacena información de la cuenta. Tanto el comando como el
archivo tienen una página de manual.

El comando passwd es un comando de usuario, por lo que la página de manual asociada está en la
primera sección. El comando man muestra la página man para el comando passwd de manera
predeterminada:

sysadmin@localhost:~$ man passwd

PASSWD(1) User Commands PASSWD(1)

Entonces, ¿cómo mostrar la página de manual para el archivo passwd? Primero, determine en qué
sección se encuentra la página man Para buscar páginas man por nombre, use la opción -f para el
comando man. Muestra páginas de manual que coinciden, o coinciden parcialmente, con un nombre
específico y proporciona el número de sección y una breve descripción de cada página de manual:

sysadmin@localhost:~$ man -f passwd


passwd (5) - the password file
passwd (1) - change user password
passwd (1ssl) - compute password hashes
En la mayoría de las distribuciones de Linux, el comando whatis hace lo mismo que man -f. En
esas distribuciones, ambas producirán la misma salida.

sysadmin@localhost:~$ man 5 passwd

La opción -k del comando man busca una keyword tanto en los nombres como en las descripciones
de las páginas man.
Por ejemplo, para encontrar una página de manual que muestre cómo copiar directorios, busque la
palabra clave copy:

man [option[keyword]]

sysadmin@localhost:~$ man -k copy


cp (1) - copy files and directories
cpgr (8) - copy with locking the given file to the password or gr...
cpio (1) - copy files to and from archives
cppw (8) - copy with locking the given file to the password or gr...
dd (1) - convert and copy a file
debconf-copydb (1) - copy a debconf database
install (1) - copy files and set attributes
scp (1) - secure copy (remote file copy program)
ssh-copy-id (1) - use locally available keys to authorize logins on a re...

En la mayoría de las distribuciones de Linux, el comando apropos hace lo mismo que man -k. En
esas distribuciones, ambas producen la misma salida.

6.3 Finding Commands and Documentation

El comando whatis devuelve el mismo resultado que man -f, muestra en que sección se almacena
la página man del comando que introducimos después, pero en ocasiones la salida no es la habitual.
UNIX tenía dos variantes principales, lo que resultó en que algunos comandos se desarrollaran "en
paralelo" y, por lo tanto, se comportaran de manera diferente en diferentes variantes de UNIX.
Muchas distribuciones modernas de Linux incluyen comandos de ambas variantes de UNIX.

6.3.1 Where Are These Commands Located?

Para buscar la ubicación de un comando o las páginas man para un comando, use el comando
whereis. Este comando busca comandos, archivos de origen y páginas man en ubicaciones
específicas donde estos archivos se almacenan normalmente:

sysadmin@localhost:~$ whereis ls
ls: /bin/ls /usr/share/man/man1p/ls.1.gz /usr/share/man/man1/ls.1.gz
6.3.2 Find Any File or Directory

El comando whereis está específicamente diseñado para encontrar comandos y páginas man.
Para buscar cualquier archivo o directorio se utiliza el comando locate.
Este comando busca en una base de datos de todos los archivos y directorios que estaban en el
sistema cuando se creó la base de datos. Normalmente, el comando para generar esta base de datos
se ejecuta todas las noches.

sysadmin@localhost:~$ locate gshadow


/etc/gshadow
/etc/gshadow-
/usr/include/gshadow.h
/usr/share/man/cs/man5/gshadow.5.gz
/usr/share/man/da/man5/gshadow.5.gz
/usr/share/man/de/man5/gshadow.5.gz
/usr/share/man/fr/man5/gshadow.5.gz
/usr/share/man/it/man5/gshadow.5.gz
/usr/share/man/man5/gshadow.5.gz
/usr/share/man/ru/man5/gshadow.5.gz
/usr/share/man/sv/man5/gshadow.5.gz
/usr/share/man/zh_CN/man5/gshadow.5.gz

También tenga en cuenta que cuando se utiliza el comando de locate como usuario normal, la salida
puede estar limitada debido a los permisos de archivo. Si el usuario que ha iniciado sesión no tiene
acceso a un archivo o directorio en el sistema de archivos debido a permisos, el comando de locate
no devolverá esos nombres. Esta característica de seguridad está diseñada para evitar que los
usuarios "exploren" el sistema de archivos mediante el uso de la base de datos de locate. El usuario
root puede buscar cualquier archivo en la base de datos de locate. La salida del comando locate
puede ser bastante grande. Al buscar un nombre de archivo, como passwd, el comando locate
produce todos los archivos que contienen la cadena passwd, no sólo los archivos llamados passwd.
En muchos casos, es útil comenzar descubriendo CUANTOS archivos coinciden. Haga esto usando
la opción -c para el comando de locate:

sysadmin@localhost:~$ locate -c passwd


98

Para limitar la salida producida por el comando de locate, use la opción -b. Esta opción solo incluye
listados que tienen el término de búsqueda en el nombre base del nombre del archivo. El nombre
base es la parte del nombre de archivo que no incluye los nombres de directorio.

sysadmin@localhost:~$ locate -c -b passwd


83

Como puede ver en el resultado anterior, aún habrá muchos resultados cuando se use la opción -b.
Para limitar aún más la salida, coloque un carácter \ delante del término de búsqueda.

sysadmin@localhost:~$ locate -b “\passwd”


/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/doc/passwd
/usr/share/lintian/overrides/passwd
6.4 Info Documentation

Las páginas man son excelentes fuentes de información, pero tienden a tener algunas desventajas.
Un ejemplo es que cada página manl es un documento separado, no relacionado con ninguna otra
página man. Si bien algunas páginas man tienen una sección VER TAMBIÉN que puede referirse a
otras páginas man, tienden a ser fuentes de documentación independientes.

El comando info también proporciona documentación sobre los comandos y características del
sistema operativo. Es un recurso de documentación que proporciona una estructura organizativa
lógica, facilitando la lectura de la documentación.

Toda la documentación se fusiona en un solo "libro" que representa toda la documentación


disponible. Dentro de los documentos de información, la información se divide en categorías que
funcionan de manera muy similar a una tabla de contenido en un libro. Los hyperlinks se
proporcionan a páginas con información sobre temas individuales para un comando o característica
específica.
Otra ventaja de info sobre las páginas man es que el estilo de escritura de los documentos de
información suele ser más propicio para aprender un tema. Considere que las páginas de manual son
más un recurso de referencia y que los documentos de información son más una guía de
aprendizaje.

6.4.1 Viewing Info Documentation


Para mostrar la documentación de info de un comando es con la siguiente estructura:
«info command»

sysadmin@localhost:~$ info ls

Next: dir invocation, Up: Directory listing

10.1 `ls': List directory contents


==================================

The `ls' program lists information about files (of any type, including directories). Options and file arguments

For non-option command-line arguments that are directories, by


default `ls' lists the contents of directories, not recursively, and
omitting files with names beginning with `.'. For other non-option
arguments, by default `ls' lists just the file name. If no non-option
argument is specified, `ls' operates on the current directory, acting
as if it had been invoked with a single argument of `.'.

By default, the output is sorted alphabetically, according to the


locale settings in effect.(1) If standard output is a terminal, the
output is in columns (sorted vertically) and control characters are
output as question marks; otherwise, the output is listed one per line
and control characters are output as-is.

-----Info: (coreutils)ls invocation, 57 lines --Top-----------------------------


Welcome to Info version 6.5. Type H for help, h for tutorial.
-----Info: (coreutils)ls invocation, 57 lines --Top-----------------------------

Esta documentación se divide en nodos, y en el ejemplo anterior, la línea resaltada en amarillo


muestra que actualmente está en el nodo de invocación ls.
La primera línea proporciona información de índice sobre la ubicación actual dentro del documento.
El siguiente nodo, como el siguiente capítulo de un libro, sería el nodo de invocación de directorio.
Subir un nivel es el nodo de listado de Directorio.

Al desplazarse por el documento, observe el menú para el comando ls:

* Menu:

* Which files are listed::


* What information is listed::
* Sorting the output::
* Details about version sort::
* General output formatting::
* Formatting file timestamps::
* Formatting the file names::

---------- Footnotes ----------

(1) If you use a non-POSIX locale (e.g., by setting `LC_ALL' to


`en_US'), then `ls' may produce output that is sorted differently than
you're accustomed to. In that case, set the `LC_ALL' environment
variable to `C'.

-----Info: (coreutils)ls invocation, 57 lines --Bot-----------------------------


Los elementos debajo del menú son hipervínculos que enlazan con nodos que describen más sobre
el comando ls. Por ejemplo, colocando el cursor en la línea * Shorting the output :: y presionando la
tecla Enter, conduce a un nodo que describe la ordenación de la salida del comando ls:

Next: Details about version sort, Prev: What information is listed, Up: ls in\
vocation

10.1.3 Sorting the output


-------------------------

These options change the order in which 'ls' sorts the information it
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 timestamp (the ctime) instead of the mtime. When
explicitly sorting by time ('--sort=time' or '-t') or when not
using a long listing format, sort according to the ctime. *Note
File timestamps::.

'-f'
Primarily, like '-U'--do not sort; list the files in whatever order
they are stored in the directory. But also enable '-a' (list all
-----Info: (coreutils)Sorting the output, 69 lines --Top------------------------

Tenga en cuenta que entrar en el nodo sobre la clasificación conduce a un subnodo del original. Para
volver al nodo anterior, use la tecla U. Mientras U conduce al inicio del nodo un nivel más arriba, la
Basic
tecla Info command
L vuelve keysubicación que antes de ingresar al nodo de clasificación.
a la misma
l Close this help window.
q Quit Info altogether.
h Invoke the Info tutorial.

Up Navigating
6.4.2 Move up oneInfo
line. Documents
Down Move down one line.
AlPgUp
igual queScroll
el comando man,one
backward está disponible una lista de comandos de movimiento presionando la
screenful.
tecla
PgDnShift +Scroll
H mientras leeone
forward la documentación
screenful. de información:
Home Go to the beginning of this node.
End Go to the end of this node.

TAB Skip to the next hypertext link.


RET Follow the hypertext link under the cursor.
l Go back to the last node seen in this window.

[ Go to the previous node in the document.


] Go to the next node in the document.
p Go to the previous node on this level.
n Go to the next node on this level.
u Go up one level.
-----Info: *Info Help*, 302 lines -- Top--------------------------------------
Tenga en cuenta que para cerrar la pantalla de ayuda, escriba la tecla L, que recupera el documento
actual. Para salir por completo, use la tecla Q.

6.4.3 Exploring Info Documentation

Ejecutar info sin argumentos nos lleva a la parte superior de la documentación.


File: dir, Node: Top, This is the top of the INFO tree.

This is the Info main menu (aka directory node).


A few useful Info commands:

'q' quits;
'H' lists all Info commands;
'h' starts the Info tutorial;
'mTexinfo RET' visits the Texinfo manual, etc.

* Menu:

Basics
* Common options: (coreutils)Common options.
* Coreutils: (coreutils). Core GNU (file, text, shell) utilities.
* Date input formats: (coreutils)Date input formats.
* File permissions: (coreutils)File permissions.
Access modes.
* Finding files: (find). Operating on files matching certain criteria.
6.5 Additional Sources of Help
Existen otras fuentes de información además de info y man.
La opción –help es muy útil para aprender el uso básico sin salir de la CLI.

10.2.4 Step 4
sysadmin@localhost:~$ cat --help

Usage: cat [OPTION]... [FILE]...


Concatenate FILE(s) to standard output.

With no FILE, or when FILE is -, read standard input.

-A, --show-all equivalent to -vET


-b, --number-nonblank number nonempty output lines, overrides -n
-e equivalent to -vE
-E, --show-ends display $ at end of each line
-n, --number number all output lines
-s, --squeeze-blank suppress repeated empty output lines
-t equivalent to -vT
-T, --show-tabs display TAB characters as ^I
-u (ignored)
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
--help display this help and exit
--version output version information and exit

Examples:
cat f - g Output f's contents, then standard input, then g's contents.
cat Copy standard input to standard output.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>


6.5.2 Additional System Documentation
Report cat translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/cat>
or available locally via: info '(coreutils) cat invocation'
Existe un directorio en la mayoría de distribuciones Linux que hay información adicional. Estos
archivos son los README o readme.txt. Las ubicaciones típicas incluyen /usr/share/doc
y /usr/doc.
En este directorio se aprende a configurar los servicios de software más complejos.

7.2 Directory Structure


En un sistema Windows, el nivel superior de la estructura de directorios se llama Mi PC. Los
dispositivos físicos, como discos duros, unidades USB, unidades de red, aparecen en Mi PC y cada
uno tiene asignada una letra de unidad, como C: o D :.

Las estructuras de directorio que se muestran a continuación se proporcionan solo como ejemplos.
Es posible que estos directorios no estén presentes en el entorno de máquina virtual de este curso.
Una representación visual de una estructura de directorios de Windows:
Un sistema de archivos básico de Windows tiene Mi PC en el nivel superior y contiene tres
carpetas: Unidad de DVD D :, Unidad de disco duro C :, y Disco USB E :. Unidad de DVD D:
contiene una carpeta llamada Datos. Disco duro C: contiene tres carpetas llamadas Archivos de
programa, Usuarios y Windows. Disco USB E: contiene una carpeta llamada Datos.

Al igual que Windows, la estructura de directorios de Linux, típicamente llamada filesystem,


también tiene un nivel superior. Sin embargo, en lugar de Mi PC, se llama directorio root y se
simboliza con la barra diagonal / . Además, no hay unidades en Linux; Se puede acceder a cada
dispositivo físico bajo un directorio, en lugar de una letra de unidad. La siguiente imagen muestra
una representación visual de un sistema de archivos Linux típico:
10.2.4 Step 4
Observe que hay muchos directorios con nombres descriptivos que incluyen / boot, que contiene
archivos para iniciar la computadora.

El término directorio home a menudo confunde a los nuevos usuarios de Linux. Para empezar, en la
mayoría de las distribuciones de Linux hay un directorio llamado home debajo del directorio root/.

Bajo este directorio / home hay un directorio para cada usuario en el sistema. El nombre del
directorio es el mismo que el nombre del usuario, por lo que un usuario llamado sysadmin tendría
un directorio de inicio llamado / home / sysadmin.

El directorio de home es un directorio importante. Para empezar, cuando un usuario abre un shell,
debe colocarse automáticamente en su directorio de home, ya que generalmente es donde hacen la
mayor parte de su trabajo. Además, el directorio de home es uno de los pocos directorios donde el
usuario tiene control total para crear y eliminar archivos y directorios adicionales. En la mayoría de
las distribuciones de Linux, los únicos usuarios que pueden acceder a los archivos en un directorio
de home son el propietario y el administrador del sistema. La mayoría de los otros directorios en un
sistema de archivos Linux están protegidos con permisos de archivo.

El directorio de home tiene un símbolo especial utilizado para representarlo; el carácter ~. Por lo
tanto, si el usuario sysadmin ha iniciado sesión, el carácter ~ se puede usar en lugar del directorio /
home / sysadmin. También es posible hacer referencia al directorio de home de otro usuario
utilizando el carácter ~ seguido del nombre de la cuenta de usuario

7.2.2 Current Directory

Para determinar dónde se encuentra actualmente el usuario dentro del sistema de archivos, se puede
usar el comando pwd.

sysadmin@localhost:~$ pwd
/home/sysadmin

El comando pwd imprime el directorio de trabajo, que es la ubicación actual del usuario dentro del
sistema de archivos. El resultado del comando anterior indica que el usuario sysadmin está
actualmente en su directorio de inicio, que se muestra en el siguiente sistema de archivos:

Para navegar por el sistema de archivos, use el comando cd (change directory).


cd [options] [path]
sysadmin@localhost:~$ cd
sysadmin@localhost:~/Documents$
Cuando se usa sin argumentos, el comando cd llevará al usuario a su directorio de inicio.
sysadmin@localhost:~/Documents$ cd
sysadmin@localhost:~$
El directorio de trabajo actual, enfatizado con el color azul. En el primer mensaje, el carácter ~ es
equivalente a / home / sysadmin, que representa el directorio de inicio del usuario.
El argumento del comando cd es más que solo el nombre de un directorio, en realidad es una ruta.
Una ruta es una lista de directorios separados por el carácter /.

Hay dos tipos de rutas:


• Absolute:
Permiten al usuario especificar la ubicación exacta de un directorio. Siempre comienza
en el directorio root “ / ”.
• Relative:
Las rutas relativas comienzan desde el directorio actual. Las rutas relativas comienzan
con un directorio que está ubicado dentro del actual

sysadmin@localhost:~$ cd Documents
sysadmin@localhost:~/Documents$

El carácter double dot, (dos puntos ..), representa un nivel más alto en relación con el
directorio actual (al ponerlos se cuenta como un directorio), a veces denominado parent
directory . E.g → cd .. Sale del directorio actual.
Cd ../../Descargas → Sale o Baja dos directorios y luego sube o entra 1 (a descargas)

7.4 Listing Files in a Directory

En muchas distribuciones de Linux, incluida la utilizada en nuestras máquinas virtuales, el comando


ls utiliza el color para distinguir por tipo de archivo. Por ejemplo, los directorios pueden mostrarse
en azul, los archivos ejecutables pueden mostrarse en verde y los enlaces simbólicos pueden
mostrarse en cian.
Para evitar usar el alias, coloque un carácter backslash \ delante de su comando:

sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ \ls
Desktop Documents Downloads Music Pictures Public Templates Videos

7.4.1 Listing Hidden Files


Cuando el comando ls se usa para mostrar el contenido de un directorio, no todos los archivos se
muestran automáticamente. El comando ls omite los archivos ocultos de forma predeterminada. Un
archivo oculto es cualquier archivo (o directorio) que comienza con dot . Character ( un punto).
Para mostrar todos los archivos, incluidos los archivos ocultos, use la opción -a para el comando ls:

sysadmin@localhost:~$ ls -a
. .bashrc .selected_editor Downloads Public
.. .cache Desktop Music Templates
.bash_logout .profile Documents Pictures Videos

La mayoría de los archivos ocultos son archivos de personalización, diseñados para personalizar
cómo funcionan Linux, su shell o sus programas. el archivo .bashrc en el directorio de home
personaliza las características del shell, como la creación o modificación de variables y alias.
Estos archivos de personalización no son con los que trabajas regularmente, y mostrarlos hace que
sea más difícil encontrar otros archivos.

7.4.2 Long Display Listing


Cada archivo tiene detalles asociados con él llamados metadata. Esto puede incluir información
como el tamaño, la propiedad o las marcas de tiempo. Para ver esta información, use la opción -l
para el comando ls. A continuación, se utiliza una lista del directorio /var/log como ejemplo, ya que
proporciona una variedad de resultados:

sysadmin@localhost:~$ ls -l /var/log/
total 900
-rw-r--r-- 1 root root 15322 Dec 10 21:33 alternatives.log
drwxr-xr-x 1 root root 4096 Jul 19 06:52 apt
-rw-r----- 1 syslog adm 371 Dec 15 16:38 auth.log
-rw-r--r-- 1 root root 35330 May 26 2018 bootstrap.log
-rw-rw---- 1 root utmp 0 May 26 2018 btmp
-rw-r----- 1 syslog adm 197 Dec 15 16:38 cron.log
-rw-r--r-- 1 root adm 85083 Dec 10 21:33 dmesg
-rw-r--r-- 1 root root 351960 Jul 19 06:52 dpkg.log
-rw-r--r-- 1 root root 32064 Dec 10 21:33 faillog
drwxr-xr-x 2 root root 4096 Jul 19 06:51 journal
-rw-rw-r-- 1 root utmp 292584 Dec 15 16:38 lastlog
-rw-r----- 1 syslog adm 14185 Dec 15 16:38 syslog
-rw------- 1 root root 64128 Dec 10 21:33 tallylog
-rw-rw-r-- 1 root utmp 384 Dec 15 16:38 wtmp

En el resultado anterior, cada línea muestra metadata sobre un solo archivo. A continuación se
describe cada uno de los campos de datos en la salida del comando ls -l:

el primer carácter de cada línea muestra el tipo de archivo


Symbol File Type Description
d directory Un archivo usado para almacenar otros archivos
- Regular file Incluye archivos legibles, de imágenes, binarios y comprimidos
l Symbollic link Señala otro archivo
s Socket Permite la comunicación entre procesos
p pipe Permite la comunicación entre procesos
b Block file Se usa para comunicarse con el hardware
c Character file Se usa para comunicarse con el hardware

Los siguientes nueve caracteres muestran los permisos del archivo. Como ciertos usuarios pueden
acceder al archivo.

Hard Link Count


Este número indica cuántos hard link apuntan a este archivo:

-rw-r----- 1 syslog adm 371 Dec 15 16:38 auth.log


drwxr-xr-x 2 root root 4096 Jul 19 06:51 journal

User Owner
Cada archivo es propiedad de una cuenta de usuario. Esto es importante porque el propietario tiene
los derechos para establecer permisos en un archivo.

-rw-r----- 1 syslog adm 371 Dec 15 16:38 auth.log


drwxr-xr-x 2 root root 4096 Jul 19 06:51 journal

Group Owner
Indica qué grupo es propietario de este archivo. Esto es importante porque cualquier miembro de
este grupo tiene un conjunto de permisos en el archivo:

-rw-rw-r-- 1 root utmp 292584 Dec 15 16:38 lastlog

File Size
Muestra el tamaño del archivo en bytes.

Para los directorios, este valor no describe el tamaño total del directorio, sino cuántos bytes están
reservados para realizar un seguimiento de los nombres de archivo en el directorio. En otras
palabras, ignore este campo para directorios.

-rw-r----- 1 syslog adm 14185 Dec 15 16:38 syslog

Timestamp
Indica la hora en que se modificó por última vez el contenido del archivo. Para los directorios, esta
marca de tiempo indica la última vez que se agregó o eliminó un archivo del directorio.

-rw-rw---- 1 root utmp 0 May 26 2018 btmp

File Name
El campo final contiene el nombre del archivo o directorio:

-rw-r--r-- 1 root root 35330 May 26 2018 bootstrap.log

En el caso de symbolic links, el nombre del enlace se muestra junto con una flecha y la ruta del
archivo original.

lrwxrwxrwx. 1 root root 22 Nov 6 2018 /etc/grub.conf -> ../boot/grub/grub.conf

7.4.3 Human-Readable Sizes (tamaño legible por humanos)


La opción -l del comando ls muestra el tamaño del archivo en bytes. Para archivos de texto
1byte=1character. Para archivos más pequeños, los tamaños de bytes están bien. Sin embargo, para
archivos más grandes, es difícil comprender qué tan grande es el archivo. Por ejemplo, considere la
salida del siguiente comando:

sysadmin@localhost:~$ ls -l /var/log/lastlog
-rw-rw-r-- 1 root utmp 292584 Dec 15 16:38 /var/log/lastlog
El tamaño del archivo es difícil de determinar en bytes. ¿292584 es un archivo grande o pequeño?
Parece bastante grande, pero es difícil de determinar usando bytes.
A veces es preferible presentar el tamaño del archivo en un tamaño más legible para los humanos,
como megabytes o gigabytes. Para lograr esto, agregue la opción -h al comando ls:
*La opción -h siempre va con la opción -l

sysadmin@localhost:~$ ls -lh /var/log/lastlog


-rw-rw-r-- 1 root utmp 286K Dec 15 16:38 /var/log/lastlog

7.4.4 Listing Directories


Cuando se usa la opción -d, se refiere al directorio actual, y no al contenido dentro de él. Sin
ninguna otra opción, no tiene sentido. Recuerde que siempre se hace referencia al directorio actual
con un sólo punto.
Para usar la opción -d de una manera significativa se requiere la adición de la opción -l. En este
caso, tenga en cuenta que el siguiente comando enumera los detalles del contenido en el directorio /
home / sysadmin:

sysadmin@localhost:~$ ls -ld
drwxr-xr-x 1 sysadmin sysadmin 224 Nov 7 17:07 .

Tenga en cuenta el período único al final de la lista larga. Esto indica que el directorio actual se está
enumerando, y no los contenidos.

7.4.5 Recursive Listing


Hay momentos en que desea mostrar todos los archivos en un directorio, así como todos los
archivos en todos los subdirectorios en ese directorio. Esto se llama una recursive lisying (lista
recursiva). Para realizar un listado recursivo, use la opción -R para el comando ls:

sysadmin@localhost:~$ ls -R /etc/ppp
/etc/ppp:
ip-down.d ip-up.d

/etc/ppp/ip-down.d:
bind9

/etc/ppp/ip-up.d:
bind9

** Hay que limitar el uso -R a estructuras de directorios pequeñas**

7.4.6 Sort a Listing


Por defecto, el comando ls ordena los archivos alfabéticamente por nombre de archivo. A veces,
puede ser útil ordenar archivos usando diferentes criterios.

Para ordenar los archivos por tamaño, podemos usar la opción -S.

A continuación se introducen los comandos ls -S y ls para comprobar que se modifica el orden en


el que salen los archivos y directorios.

Salida ls :

sysadmin@localhost:~$ ls /etc/ssh
moduli ssh_host_ecdsa_key.pub ssh_host_rsa_key sshd_config
ssh_config ssh_host_ed25519_key ssh_host_rsa_key.pub
ssh_host_ecdsa_key ssh_host_ed25519_key.pub ssh_import_id

Salida ls -S:

sysadmin@localhost:~$ ls -S /etc/ssh
moduli ssh_host_ed25519_key ssh_host_ecdsa_key.pub
sshd_config ssh_host_rsa_key.pub ssh_host_ed25519_key.pub
ssh_host_rsa_key ssh_import_id
ssh_config ssh_host_ecdsa_key

Si bien la opción -S funciona por sí sola, es más útil cuando se usa con la opción -l para que los
tamaños de los archivos sean visibles. El siguiente comando enumera los archivos de mayor a
menor y muestra el tamaño real del archivo.

sysadmin@localhost:~$ ls -lS /etc/ssh


total 580
-rw-r--r-- 1 root root 553122 Feb 10 2018 moduli
-rw-r--r-- 1 root root 3264 Feb 10 2018 sshd_config
-rw------- 1 root root 1679 Jul 19 06:52 ssh_host_rsa_key
-rw-r--r-- 1 root root 1580 Feb 10 2018 ssh_config
-rw------- 1 root root 411 Jul 19 06:52 ssh_host_ed25519_key
-rw-r--r-- 1 root root 399 Jul 19 06:52 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 338 Jul 19 06:52 ssh_import_id
También puede
-rw------- serroot
1 root útil usar
227laJul
opción -h para
19 06:52 mostrar tamaños de archivo legibles por humanos:
ssh_host_ecdsa_key
-rw-r--r-- 1 root root 179 Jul 19 06:52 ssh_host_ecdsa_key.pub
-rw-r--r-- 1 root root 99 Jul 19 06:52 ssh_host_ed25519_key.pub
sysadmin@localhost:~$ ls -lSh /etc/ssh
total 580K
-rw-r--r-- 1 root root 541K Feb 10 2018 moduli
-rw-r--r-- 1 root root 3.2K Feb 10 2018 sshd_config
-rw------- 1 root root 1.7K Jul 19 06:52 ssh_host_rsa_key
-rw-r--r-- 1 root root 1.6K Feb 10 2018 ssh_config
-rw------- 1 root root 411 Jul 19 06:52 ssh_host_ed25519_key
-rw-r--r-- 1 root root 399 Jul 19 06:52 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 338 Jul 19 06:52 ssh_import_id
-rw------- 1 root root 227 Jul 19 06:52 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 179 Jul 19 06:52 ssh_host_ecdsa_key.pub
-rw-r--r-- 1 root root 99 Jul 19 06:52 ssh_host_ed25519_key.pub

La opción -t ordena los archivos según el momento en que se modificaron. Enumerará primero los
archivos modificados más recientemente. Esta opción se puede usar sola, pero de nuevo,
generalmente es más útil cuando se combina con la opción -l:

sysadmin@localhost:~$ ls -tl /etc/ssh


total 580
-rw------- 1 root root 227 Jul 19 06:52 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 179 Jul 19 06:52 ssh_host_ecdsa_key.pub
-rw------- 1 root root 411 Jul 19 06:52 ssh_host_ed25519_key
-rw-r--r-- 1 root root 99 Jul 19 06:52 ssh_host_ed25519_key.pub
-rw------- 1 root root 1679 Jul 19 06:52 ssh_host_rsa_key
-rw-r--r-- 1 root root 399 Jul 19 06:52 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 338 Jul 19 06:52 ssh_import_id
-rw-r--r-- 1 root root 553122 Feb 10 2018 moduli
-rw-r--r-- 1 root root 1580 Feb 10 2018 ssh_config
-rw-r--r-- 1 root root 3264 Feb 10 2018 sshd_config

***Es importante recordar que la fecha de modificación en los directorios representa la


última vez que se agregó o eliminó un archivo del directorio.***

Si los archivos en un directorio se modificaron hace muchos días o meses, puede ser más difícil
saber exactamente cuándo se modificaron, ya que solo se proporciona la fecha para los archivos
más antiguos. Para obtener información más detallada sobre el tiempo de modificación, puede usar
la opción --full-time para mostrar la marca de tiempo completa (incluidas las horas, minutos,
segundos). Asumirá la opción -l automáticamente:

sysadmin@localhost:~$ ls -t --full-time /etc/ssh


total 580
-rw------- 1 root root 227 2018-07-19 06:52:16.000000000 +0000 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 179 2018-07-19 06:52:16.000000000 +0000 ssh_host_ecdsa_key.pub
-rw------- 1 root root 411 2018-07-19 06:52:16.000000000 +0000 ssh_host_ed25519_key
-rw-r--r-- 1 root root 99 2018-07-19 06:52:16.000000000 +0000 ssh_host_ed25519_key.pub
-rw------- 1 root root 1679 2018-07-19 06:52:16.000000000 +0000 ssh_host_rsa_key
-rw-r--r-- 1 root root 399 2018-07-19 06:52:16.000000000 +0000 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root 338 2018-07-19 06:52:16.000000000 +0000 ssh_import_id
-rw-r--r-- 1 root root 553122 2018-02-10 02:31:46.000000000 +0000 moduli
-rw-r--r-- 1 root root 1580 2018-02-10 02:31:46.000000000 +0000 ssh_config
-rw-r--r-- 1 root root 3264 2018-02-10 02:31:46.000000000 +0000 sshd_config

Es posible realizar una ordenación inversa utilizando la opción -r. Se puede usar solo o combinado
con las opciones -S o -t. El siguiente comando ordenará los archivos por tamaño, de menor a
mayor:

sysadmin@localhost:~$ ls -lrS /etc/ssh


-rw-r--r-- 1 root root 99 Jul 19 06:52 ssh_host_ed25519_key.pub
-rw-r--r-- 1 root root 179 Jul 19 06:52 ssh_host_ecdsa_key.pub
-rw------- 1 root root 227 Jul 19 06:52 ssh_host_ecdsa_key
-rw-r--r-- 1 root root 338 Jul 19 06:52 ssh_import_id
-rw-r--r-- 1 root root 399 Jul 19 06:52 ssh_host_rsa_key.pub
-rw------- 1 root root 411 Jul 19 06:52 ssh_host_ed25519_key
-rw-r--r-- 1 root root 1580 Feb 10 2018 ssh_config
-rw------- 1 root root 1679 Jul 19 06:52 ssh_host_rsa_key

El siguiente comando enumerará los archivos por fecha de modificación, de la más antigua a la más
nueva:

sysadmin@localhost:~$ ls -lrt /etc/ssh


total 580
-rw-r--r-- 1 root root 3264 Feb 10 2018 sshd_config
-rw-r--r-- 1 root root 1580 Feb 10 2018 ssh_config
-rw-r--r-- 1 root root 553122 Feb 10 2018 moduli
-rw-r--r-- 1 root root 338 Jul 19 06:52 ssh_import_id
-rw-r--r-- 1 root root 399 Jul 19 06:52 ssh_host_rsa_key.pub
-rw------- 1 root root 1679 Jul 19 06:52 ssh_host_rsa_key
-rw-r--r-- 1 root root 99 Jul 19 06:52 ssh_host_ed25519_key.pub
-rw------- 1 root root 411 Jul 19 06:52 ssh_host_ed25519_key
-rw-r--r-- 1 root root 179 Jul 19 06:52 ssh_host_ecdsa_key.pub
-rw------- 1 root root 227 Jul 19 06:52 ssh_host_ecdsa_key

INODO → Número de identificador único de cada archivo, para saber donde existen los datos de
ese archivo en el disco.

Utilice el siguiente comando de eco para mostrar algunos otros ejemplos de uso de la tilde como
parte de la ruta:

sysadmin@localhost:~$ echo ~ ~sysadmin ~root ~mail ~nobody


home/sysadmin /home/sysadmin /root /var/mail /nonexistent

En la salida del comando ls anterior, los nombres de los archivos se colocaron en un color azul
claro. Esta es una característica que muchas distribuciones de Linux proporcionan automáticamente
a través de una característica llamada alias (más sobre esta característica en un laboratorio
posterior).

El color indica de qué tipo es el artículo. La siguiente tabla describe algunos de los colores más
comunes:

COLOR TYPE OF FILE


Black or White Regular File
Blue Directory File
Cyan Symbolic link file
Green Executable

Tenga en cuenta que la opción -d evita que se muestren archivos de subdirectorios. Siempre se debe
usar con el comando ls cuando se utiliza la globalización de archivos.
sysadmin@localhost:~$ ls -d /etc/s*
/etc/securetty /etc/sgml /etc/shells /etc/ssl /etc/sysctl.conf
/etc/security /etc/shadow /etc/skel /etc/sudoers /etc/sysctl.d
/etc/services /etc/shadow- /etc/ssh /etc/sudoers.d /etc/systemd

Los ? El carácter se puede utilizar para hacer coincidir exactamente 1 carácter en un nombre de
archivo. Ejecute el siguiente comando para mostrar todos los archivos en el directorio / etc que
tienen exactamente cuatro caracteres de longitud:

sysadmin@localhost:~$ ls -d /etc/????
/etc/bind /etc/init /etc/motd /etc/perl /etc/skel
/etc/dpkg /etc/ldap /etc/mtab /etc/sgml /etc/udev

Al utilizar corchetes [] puede especificar un sólo carácter para que coincida con un conjunto de
caracteres. Ejecute el siguiente comando para mostrar todos los archivos en el directorio /etc que
comienzan con las letras a, b, c o d:

sysadmin@localhost:~$ ls -d /etc/[abcd]*
/etc/adduser.conf /etc/blkid.conf /etc/cron.weekly
/etc/adjtime /etc/blkid.tab /etc/crontab
/etc/alternatives /etc/ca-certificates /etc/dbus-1
/etc/apparmor.d /etc/ca-certificates.conf /etc/debconf.conf
/etc/apt /etc/calendar /etc/debian_version
/etc/bash.bashrc /etc/cron.d /etc/default
/etc/bash_completion.d /etc/cron.daily /etc/deluser.conf
/etc/bind /etc/cron.hourly /etc/depmod.d
/etc/bindresvport.blacklist /etc/cron.monthly /etc/dpkg

8.2.1 Asterisk * Character


Los caracteres Glob a menudo se denominan wildcars. Estos son caracteres de símbolo que tienen
un significado especial para el shell. Los Glob permiten especificar patrones que coinciden con los
nombres de archivo en un directorio. Entonces, en lugar de manipular un sólo archivo a la vez,
puede ejecutar fácilmente comandos que afectan a muchos archivos. Por ejemplo, mediante el uso
de caracteres Glob, es posible manipular todos los archivos con una extensión específica o con una
longitud de nombre de archivo particular.A diferencia de los comandos que ejecuta el shell, u
opciones y argumentos que el shell pasa a los comandos, el propio intérprete interpreta los
caracteres Glob antes de que intente ejecutar cualquier comando. Como resultado, los caracteres
glob se pueden usar con cualquier comando. Los ejemplos proporcionados en este capítulo utilizan
el comando echo para la demostración.

El carácter * se usa para indicar cualquier número o letra. Se usa en búsquedas para indicar
cualquier archivo o directorio que empiece, que finalice o que tenga cierta extensión.
E.g.:
sysadmin@localhost:~$ echo /etc/*.d
sysadmin@localhost:~$ echo /etc/r*.conf
sysadmin@localhost:~$ echo /etc/t*
En el siguiente comando muestra los archivos del directorio actual:
sysadmin@localhost:~$ echo *
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ echo D*n*s

8.2.2 Question
Documents Mark ? Character
Downloads

El signo question mark ? representa cualquier carácter individual. Cada carácter de signo de
interrogación coincide exactamente con un carácter, ni más ni menos.

Suponga que desea mostrar todos los archivos en el directorio /etc que comienzan con la letra t y
tienen exactamente 7 caracteres después del carácter t:

sysadmin@localhost:~$ echo /etc/t???????


/etc/terminfo /etc/timezone

Los caracteres Glob se pueden usar juntos para encontrar patrones aún más complejos. El patrón
/etc / * ???????????????????? El comando solo hace coincidir los archivos en el directorio / etc
con veinte o más caracteres en el nombre del archivo:

sysadmin@localhost:~$ echo /etc/*????????????????????


/etc/bindresvport.blacklist /etc/ca-certificates.conf

El asterisco y el signo de interrogación también se pueden usar juntos para buscar archivos con
extensiones de tres letras utilizando / etc / *. ??? modelo:
sysadmin@localhost:~$ echo /etc/*.???
/etc/issue.net /etc/locale.gen

8.2.3 Bracket [ ] Characters

Los caracteres de corchete [] se usan para hacer coincidir un solo carácter al representar un rango
de caracteres que son posibles caracteres de coincidencia. Por ejemplo, el patrón / etc / [gu] *
coincide con cualquier archivo que comienza con un carácter go o/y contiene cero o más caracteres
adicionales:

sysadmin@localhost:~$ echo /etc/[gu]*


/etc/gai.conf /etc/groff /etc/group /etc/group- /etc/gshadow /etc/gshadow- /etc/
gss /etc/ucf.conf /etc/udev /etc/ufw /etc/update-motd.d /etc/updatedb.conf

Los corchetes también se pueden usar para representar una variedad de caracteres. Por ejemplo, el
patrón / etc / [a-d] * coincide con todos los archivos que comienzan con cualquier letra entre la a y
d, incluidas:

sysadmin@localhost:~$ echo /etc/[a-d]*


/etc/adduser.conf /etc/alternatives /etc/apparmor /etc/apparmor.d /etc/apt /etc/
sysadmin@localhost:~$
bash.bashrc /etc/bind /etc/bindresvport.blacklist ls -d /etc/s*
/etc/binfmt.d /etc/ca-certific
/etc/securetty
ates /etc/ca-certificates.conf /etc/calendar /etc/sgml
/etc/console-setup /etc/shells
/etc/cron.d /etc /etc/ssl /etc/sysctl.conf
/etc/security
/cron.daily /etc/cron.hourly /etc/cron.monthly /etc/shadow
/etc/cron.weekly /etc/skel/et /etc/sudoers /etc/sysctl.d
/etc/crontab
/etc/services
c/dbus-1 /etc/debconf.conf /etc/debian_version /etc/shadow-
/etc/default /etc/ssh /e /etc/sudoers.d /etc/systemd
/etc/deluser.conf
tc/depmod.d /etc/dhcp /etc/dpkg
El patrón / etc / * [0-9] * muestra cualquier archivo que contenga al menos un número:

El patrón / etc / * [0-9] * muestra cualquier archivo que contenga al menos un número:

sysadmin@localhost:~$ echo /etc/*[0-9]*


/etc/X11 /etc/dbus-1 /etc/iproute2 /etc/mke2fs.conf /etc/python3 /etc/python3.6
/etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d /etc/rc4.d /etc/rc5.d /etc/rc6.d
El rango se basa en la tabla de texto ASCII. Esta tabla define una lista de caracteres, ordenándolos
en un orden estándar específico.
Si se proporciona una petición no válida, no se realizarán coincidencias:

sysadmin@localhost:~$ echo /etc/*[9-0]*


/etc/*[9-0]*

8.2.4 Exclamation Point ! Character

El signo de exclamación ! se utiliza junto con los corchetes para negar un rango. Por ejemplo, el
patrón / etc / [!DP] * coincide con cualquier archivo que no comience con una D o P.

sysadmin@localhost:~$ echo /etc/[!a-t]*


/etc/X11 /etc/ucf.conf /etc/udev /etc/ufw /etc/update-motd.d /etc/updatedb.conf
/etc/vim /etc/vtrgb /etc/wgetrc /etc/xdg

8.2.5 Listing With Globs

El comando ls se usa normalmente para listar archivos en un directorio; Como resultado, el uso del
comando echo puede parecer una elección extraña. Sin embargo, hay algo en el comando ls que
causa problemas al enumerar archivos que usan patrones globales.

Tenga en cuenta que es el shell, no el comando echo o ls, el que expande el patrón global en los
nombres de archivo correspondientes. En otras palabras, si se ejecuta el comando echo / etc / a *, lo
que hizo el shell antes de ejecutar el comando echo fue reemplazar a * con todos los archivos y
directorios dentro del directorio / etc que coinciden con el patrón.

Entonces, si se ejecuta el comando ls / etc / a *, lo que el shell realmente se ejecutaría sería este:

ls /etc/adduser.conf /etc/alternatives /etc/apparmor


/etc/apparmor.d /etc/apt

Cuando el comando ls ve múltiples argumentos, realiza una operación de lista en cada elemento por
separado. En otras palabras, ls / etc / a * es lo mismo que ejecutar los siguientes comandos
consecutivamente:
ls /etc/adduser.conf
ls /etc/alternatives
ls /etc/apparmor
ls /etc/apparmor.d
ls /etc/apt

Ahora considere lo que sucede al comando ls se le pasa un archivo, como /etc/adduser.conf:

sysadmin@localhost:~$ ls /etc/adduser.conf
/etc/adduser.conf

Ejecutar el comando ls en un solo archivo da como resultado el nombre del archivo que se está
imprimiendo; normalmente esto es útil si la opción -l se usa para ver detalles sobre un archivo
específico:
sysadmin@localhost:~$ ls -l /etc/adduser.conf
-rw-r--r-- 1 root root 3028 May 26 2018 /etc/adduser.conf

Sin embargo, ¿qué sucede si el comando ls recibe un nombre de directorio como argumento? En
este caso, la salida del comando es diferente de si el argumento fuera un archivo normal:

sysadmin@localhost:~$ ls -l /etc/apparmor
init parser.conf subdomain.conf

Si el comando ls recibe un nombre de directorio, el comando muestra el contenido del directorio


(los nombres de los archivos en el directorio), no solo el nombre del directorio. Los nombres de
archivo en el ejemplo anterior son los nombres de los archivos en el directorio / etc / apparmor.

¿Por qué es esto un problema al usar globs? Considere el siguiente resultado:

sysadmin@localhost:~$ ls /etc/ap*
/etc/apparmor:
init parser.conf subdomain.conf

/etc/apparmor.d:
abstractions disable local tunables usr.sbin.named
cache force-complain sbin.dhclient usr.bin.man usr.sbin.rsyslogd

/etc/apt:
apt.conf.d preferences.d sources.list sources.list.d trusted.gpg.d
Cuando el comando ls ve un nombre de archivo como argumento, solo muestra el nombre de
archivo. Sin embargo, para cualquier directorio, muestra el contenido del directorio, no solo el
nombre del directorio.

Esto se vuelve aún más confuso


sysadmin@localhost:~$ en una situación como la siguiente:
ls /etc/x*
autostart systemd user-dirs.conf user-dirs.defaults

En el ejemplo anterior, parece que el comando ls es simplemente incorrecto. Sin embargo, lo que
realmente sucedió es que lo único que coincide con el glob/etc/x* es el directorio /etc/xdg.

¡Entonces, el comando ls solo muestra los archivos en ese directorio!

Hay una solución simple a este problema: siempre use la opción -d con globs, que le dice al
comando ls que muestre el nombre de los directorios, en lugar de su contenido:

sysadmin@localhost:~$ ls -d /etc/x*
/etc/xdg

8.3 Copying Files

El comando cp se usa para copiar archivos. Requiere un origen y un destino. La estructura del
comando es la siguiente:
cp [source] [destination]

La fuente (origen) es el archivo que se copiará. El destino es donde se ubicará la copia. Cuando
tiene éxito, el comando cp no tiene salida (ninguna noticia es una buena noticia). El siguiente
comando copia el archivo /etc/hosts en su directorio de inicio:

sysadmin@localhost:~$ cp /etc/hosts ~
sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates hosts
Documents Music Public Videos
8.3.1 Verbose Mode
La opción -v (verbose) hace que el comando cp produzca resultados si tiene éxito. La opción -v
significa detallado:

sysadmin@localhost:~$ cp -v /etc/hosts ~
`/etc/hosts' -> `/home/sysadmin/hosts'

Cuando el destino es un directorio, el nuevo archivo resultante mantiene el mismo nombre que el
archivo original. Para dar al nuevo archivo un nombre diferente, proporcione el nuevo nombre
como parte del destino:

sysadmin@localhost:~$ cp /etc/hosts ~/hosts.copy


sysadmin@localhost:~$ ls
Desktop Downloads Pictures Templates hosts
Documents Music Public Videos hosts.copy

8.3.2 Avoid Overwriting Data (evita sobrescribir datos)


El comando cp puede ser destructivo para los datos existentes si el archivo de destino ya existe. En
el caso de que exista el archivo de destino, el comando cp sobrescribe el contenido del archivo
existente con el contenido del archivo de origen.
Se pueden usar dos opciones para proteger contra sobrescrituras accidentales. Con la opción
interactiva -i, el comando cp solicita al usuario antes de sobrescribir un archivo. El siguiente
ejemplo muestra esta opción, primero restaurando el contenido del archivo original:

Si se diera un valor de y (sí), entonces el proceso de copia habría tenido lugar. Sin embargo, el valor
de n (no) se proporcionó cuando se le solicitó que sobrescribiera el archivo, por lo que no se
realizaron cambios en el archivo. La opción -i requiere que responda “y” o “n” para cada copia que
podría terminar sobrescribiendo el contenido de un archivo existente. Esto puede ser tedioso cuando
ocurren un montón de sobrescrituras, como el ejemplo que se muestra a continuación:

sysadmin@localhost:~$ cp -i /etc/skel/.* ~
cp: -r not specified; omitting directory '/etc/skel/.'
cp: -r not specified; 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
Como puede ver en el ejemplo anterior, el comando cp intentó sobrescribir cuatro archivos
existentes, obligando al usuario a responder cuatro mensajes.

Para responder “n” a cada solicitud automáticamente, use la opción -n. Significa sin clobber, o sin
sobrescribir.

sysadmin@localhost:~$ cp -n /etc/skel/.* ~
cp: -r not specified; omitting directory '/etc/skel/.'
cp: -r not specified; omitting directory '/etc/skel/..'

8.3.3 Copying Directories


Por defecto, el comando cp no copiará directorios; cualquier intento de hacerlo da como resultado
un mensaje de error:

sysadmin@localhost:~$ cp -n /etc/skel/.* ~
cp: -r not specified; omitting directory '/etc/skel/.'
cp: -r not specified; omitting directory '/etc/skel/..'

La opción -r del comando cp, copia archivos y directorios

***Ten cuidado con esta opción. ¡Se copiará toda la estructura de directorios, lo que podría
ocasionar la copia de muchos archivos y directorios! ***

8.4 Moving Files


Para mover un archivo se usa el comando mv. Syantaxis:
mv [source] [destination]

En el siguiente ejemplo se mueve el archivo hosts, del directorio actual al directorio videos.

sysadmin@localhost:~$ mv hosts Videos


sysadmin@localhost:~$ ls Videos
hosts
Cuando se mueve un archivo, el archivo se elimina de la ubicación original y se coloca en una
nueva ubicación. Mover archivos puede ser algo complicado en Linux porque los usuarios necesitan
permisos específicos para eliminar archivos de un directorio. Sin los permisos correctos, se
devuelve un mensaje de error Permiso denegado.

8.4.1 Renaming Files


El comando mv no solo se usa para mover un archivo, sino también para cambiarle el nombre. Si el
destino del comando mv es un directorio, el archivo se mueve al directorio especificado. El nombre
del archivo solo cambia si también se especifica un nombre de archivo de destino.

Si no se especifica un directorio de destino, se cambia el nombre del archivo con el nombre del
archivo de destino y permanece en el directorio de origen. Por ejemplo, los siguientes comandos
cambian el nombre del archivo newexample.txt a myfile.txt:

sysadmin@localhost:~/Videos$ mv newexample.txt myfile.txt


sysadmin@localhost:~/Videos$ ls Videos
hosts myfile.txt

8.4.2 Additional Move Options


Opciones del compando mv:

Option Meaning
-i Interactive: Ask if a file is to be overwritten. Pregunta si se sobrescribe el archivo
-n No Clobber: Do not overwrite a destination file's contents. No sobrescribe el archivo
-v Verbose: Show the resulting move. Muestra el resultado de la ejecucción

***No hay una opción -r (recursiva) ya que el comando mv mueve los directorios por defecto***

8.5 Creating Files

Hay varias formas de crear un nuevo archivo, incluido el uso de un programa diseñado para editar
un archivo (un editor de texto).

También hay una manera de crear un archivo vacío que se puede rellenar con datos más adelante.
Esta característica es útil para algunos sistemas operativos, ya que la existencia misma de un
archivo podría alterar el funcionamiento de un comando o servicio. También es útil crear un archivo
como "placeholder” (marcador de posición) para recordar crear el contenido del archivo más
adelante.
Para crear un archivo vacío, use el comando touch como se muestra a continuación:

sysadmin@localhost:~/Videos$ touch sample


sysadmin@localhost:~/Videos$ ls -l sample
-rw-rw-r-- 1 sysadmin sysadmin 0 Nov 9 16:48 sample

El tamaño del archivo creado es de 0 bytes.

8.6 Removing Files

Para borrar un archivo se usa el comando rm:


Por defecto no muestra mensaje de confirmación, para que solicite confirmación hay que utilizar la
opción -i. En los siguientes ejemplos se muestra como borrar el archivo sample (sin y con
confirmación) y como borrar todos los archivos que tengan la extensión .txt (con confirmación)

sysadmin@localhost:~/Videos$ rm sample
sysadmin@localhost:~/Videos$ rm -i sample
rm: remove regular empty file `example.txt'? y
sysadmin@localhost:~/Videos$ rm -i *.txt
rm: remove regular empty file `example.txt'? y

8.6.1 Removing Directories


El comando rm sin opciones no borra directorios. Para poder borrar directorios hay que usar la
opción -r (recursive). Con esta opción todos los archivos de los subdirectorios de eses directorio
serán borrados. Es compatible y aconsejable combinar con la opción -i para pedir confirmación.
Para borrar un directorio vacío se puede usar rmdir, no tiene opciones -i , -r como rm.

sysadmin@localhost:~$ rm -r Videos
sysadmin@localhost:~$ rm -ir Videos
sysadmin@localhost:~$ rm -ir Videos
8.7 Creating Directories
Para crear un directorio se usa mkdir

sysadmin@localhost:~$ mkdir test

9.1 Introduction

En este capítulo, discutimos cómo administrar archivos de almacenamiento en la línea de comando.


El archivado de archivos se utiliza cuando uno o más archivos deben transmitirse o almacenarse de
la manera más eficiente posible. Hay dos aspectos fundamentales que explora este capítulo:
• Archiving: combina varios archivos en uno, lo que elimina la sobrecarga en archivos
individuales y hace que los archivos sean más fáciles de transmitir.
• Compression: reduce los archivos al eliminar la información redundante.

***Los archivos se pueden comprimir individualmente o se pueden combinar varios archivos en un


solo archivo y luego comprimirse posteriormente. El último todavía se conoce como archivo.***

Cuando un archivo es descomprimido y uno o mas archivos son extraídos se llama un-archiving
Aunque el espacio en disco es relativamente barato, el archivo y la compresión aún tienen valor:
Los archivos de registro tienen la costumbre de llenar discos, por lo que es útil dividirlos por
fecha y comprimir versiones anteriores.
Al hacer una copia de seguridad de los directorios, es más fácil mantenerlos todos en un archivo que
versionar (actualizar) cada archivo.
A menudo puede ser más rápido comprimir un archivo antes de enviarlo a una unidad de
cinta o en una red más lenta y descomprimirlo en el otro extremo de lo que sería enviarlo sin
comprimir.

9.2 Compressing Files


La compresión reduce la cantidad de datos necesarios para almacenar o transmitir un archivo
mientras lo almacena

El compression algorithm es un procedimiento que la computadora usa para codificar el archivo


original y, como resultado, hacerlo más pequeño. Los informáticos investigan estos algoritmos y
encuentran mejores que pueden funcionar más rápido o hacer que el archivo de entrada sea más
pequeño.

Cuando hablamos de compresión, hay dos tipos:


• Lossless: Sin perdidas, no se elimina ninguna información del archivo. Comprimir un
archivo y descomprimirlo deja algo idéntico al original.
• Lossy: Pérdidas, la información puede eliminarse del archivo. Está comprimido de tal
manera que descomprimir un archivo dará como resultado un archivo que es ligeramente
diferente del original. Por ejemplo, una imagen con dos tonos de verde sutilmente diferentes
podría hacerse más pequeña al tratar esos dos tonos como iguales. A menudo, el ojo no
puede distinguir la diferencia de todos modos.

Para las cosas que deben permanecer intactas, como documentos, registros y software, necesita una
compresión lossless (sin pèrdidas).
La mayoría de los formatos de imagen, como GIF, PNG y JPEG, implementan alguna forma de
compresión lossy (con pérdida). En general, puede decidir cuánta calidad desea conservar. Una
calidad inferior da como resultado un archivo más pequeño, pero después de la descompresión,
puede observar artefactos como bordes ásperos o decoloraciones.

Comprimir un archivo ya comprimido no lo hará más pequeño. Este hecho a menudo se olvida
cuando se trata de imágenes, ya que ya están almacenadas en un formato comprimido. Con la
compresión sin pérdida, esta compresión múltiple no es un problema, pero si comprime y
descomprime un archivo varias veces usando un algoritmo lossy (con pérdida), eventualmente
tendrá algo que no se puede reconocer.
Linux proporciona varias herramientas para comprimir archivos; El más común es gzip. Aquí
mostramos un archivo antes y después de la compresión:

El archivo se comprime invocando el comando gzip con el nombre del archivo como único
argumento. Una vez que se completa ese comando, el archivo original desaparece y se deja en su
lugar una versión comprimida con una extensión de archivo .gz.

sysadmin@localhost:~$ gzip longfile.txt


El comando gzip con la opción -l nos proporciona la siguiente información:

sysadmin@localhost:~$ gzip -l longfile.txt


compressed uncompressed ratio uncompressed_name
341 66540 99.5% longfile.txt

La relación de compresión se da como 99.5%, una reducción impresionante ayudada por la


información repetitiva en el archivo original
Los archivos comprimidos pueden restaurarse a su forma original utilizando el comando gunzip o
el comando gzip –d. Este proceso se llama descompresión. Después de que gunzip hace su trabajo,
el archivo longfile.txt se restaura a su tamaño y nombre de archivo originales.

sysadmin@localhost:~$ gzip -d longfile.txt.gz


sysadmin@localhost:~$ gunzip longfile.txt.gz
sysadmin@localhost:~$ ls -l
-rw-r--r-- 1 sysadmin sysadmin 66540 Dec 20 2017 longfile.txt

***El comando gunzip es solo un script que llama a gzip con los parámetros correctos***

Hay otros comandos que operan prácticamente de manera idéntica a gzip y gunzip, son bzip2 y
bunzip2, así como xz y unxz.
El comando gzip usa el algoritmo de compresión de datos Lempel-Ziv, mientras que las utilidades
bzip usan un algoritmo de compresión diferente llamado clasificación de bloques de Burrows-
Wheeler, que puede comprimir archivos más pequeños que gzip a expensas de más tiempo de CPU.
Estos archivos se pueden reconocer porque tienen una extensión .bz o .bz2 en lugar de una
extensión .gz.

Las herramientas xz y unxz son funcionalmente similares a gzip y gunzip en el sentido de que
utilizan el algoritmo de cadena Lempel-Ziv-Markov (LZMA), que puede dar como resultado
tiempos de CPU de descompresión más bajos que están a la par con gzip mientras proporciona las
mejores relaciones de compresión típicamente asociadas con las herramientas bzip2. Los archivos
comprimidos con el comando xz usan la extensión .xz.
9.3 Archiving Files

Si tuviera que enviar varios archivos a alguien, podría optar por comprimir cada uno
individualmente. Tendría una menor cantidad de datos en total que si enviara archivos sin
comprimir, sin embargo, aún tendría que lidiar con muchos archivos a la vez.

El archivado es la solución a este problema. La utilidad UNIX tradicional para archivar archivos se
llama tar, que es una forma abreviada de TApe aRchive. Se utilizó para transmitir muchos archivos
a una cinta para copias de seguridad o transferencia de archivos. El comando tar toma varios
archivos y crea un único archivo de salida que puede dividirse nuevamente en los archivos
originales en el otro extremo de la transmisión.
El comando tar tiene tres modos con los que es útil familiarizarse:

Create: crea un nuevo archivo a partir de una serie de archivos.


Extract: Extraiga uno o más archivos de un archivo.
list: muestra el contenido del archivo sin extraerlo.
Además del modo, recuerde dónde especificar el nombre del archivo, ya que puede estar ingresando
múltiples nombres de archivo en una línea de comando.
tar -c [-f ARCHIVE] [OPTIONS] [FILE…]

Crear un archivo con tar requiere de dos opciones mínimas -c y -f :

eliminar rutas absolutasTAR


Option Function
-c Create an archive
-f Use archive file
Archive The argument Archive will be the name of the resulting archive file
-z Compress (or decompress) an archive gzip command
-j Compress (or decompress) an archive using the bzip2 command.
Todos los argumentos restantes se consideran nombres de archivos de entrada, ya sea como
comodines, una lista de archivos o ambos.

El siguiente ejemplo muestra un archivo tar, también llamado tarball, creado a partir de múltiples
archivos. El primer argumento crea un archivo llamado alpha_files.tar. La opción comodín * se usa
para incluir en el archivo todos los archivos que comienzan con alfa:

sysadmin@localhost:~/Documents$ tar -cf alpha_files.tar alpha*


sysadmin@localhost:~/Documents$ ls -l alpha_files.tar
-rw-rw-r-- 1 sysadmin sysadmin 10240 Oct 31 17:07 alpha_files.tar
El tamaño final de alpha_files.tar es 10240 bytes. Normalmente, los archivos tarball son
ligeramente más grandes que los archivos de entrada combinados debido a la información general
sobre la recreación de los archivos originales. Los tarballs se pueden comprimir para facilitar el
transporte, ya sea usando gzip en el archivo o haciendo que tar lo haga con la opción -z.

El siguiente ejemplo muestra el mismo comando que el ejemplo anterior, pero con la adición de la
opción -z.

sysadmin@localhost:~/Documents$ tar -czf alpha_files.tar.gz alpha*


sysadmin@localhost:~/Documents$ ls -l alpha_files.tar.gz
-rw-rw-r-- 1 sysadmin sysadmin 417 Oct 31 17:15 alpha_files.tar.gz

El resultado es mucho más pequeño que el tarball en sí, y el archivo resultante es compatible con
gzip, que se puede usar para ver los detalles de la compresión.

sysadmin@localhost:~/Documents$ gzip -l alpha_files.tar.gz


compressed uncompressed ratio uncompressed_name
417 10240 96.1% alpha_files.tar

Si bien las extensiones de archivo no afectan la forma en que se trata un archivo, la convención es
usar .tar para archivos tarballs y .tar.gz o .tgz para tarballs comprimidos.

La compresión bzip2 se puede usar en lugar de gzip sustituyendo la .tar opción -z por la opción -j
y usando .tar.bz2, .tbz o .tbz2 como la extensión del archivo.

sysadmin@localhost:~/Documents$ tar -cjf folders.tbz School

9.3.2 List Mode

Dado un archivo tar, comprimido o no, puede ver lo que contiene usando la opción -t. El siguiente
ejemplo usa tres opciones:

TAR
Option Function
-t List the files in an archive
-j Compress (or decompress) an archive using the bzip2 command.
-f Use archive file
Archive The argument Archive will be the name of the resulting archive file
Para listar el contenido de un archivo:

sysadmin@localhost:~/Documents$ tar -tjf folders.tbz


School/
School/Engineering/
School/Engineering/hello.sh
School/Art/
School/Art/linux.txt
School/Math/
School/Math/numbers.txt

En el ejemplo, el directorio School / está prefijado a los archivos. El comando tar se repetirá en
subdirectorios automáticamente al comprimirse y almacenará la información de la ruta dentro del
archivo.

Se puede listar el contenido de un archivo en dos pasos:

sysadmin@localhost:~/Documents$ bunzip2 -c folders.tbz | tar -t


School/
School/Engineering/
School/Engineering/hello.sh
School/Art/
School/Art/linux.txt
School/Math/
School/Math/numbers.txt

El lado izquierdo del pipe que descomprime el archivo es :


bunzip2 –c folders.tbz,
la opción -c envía el resultado a la pantalla.
La salida se redirige a tar –t.
Si no especifica un archivo con –f, tar leerá la entrada estándar, que en este caso es el archivo sin
comprimir

9.3.3 Extract Mode


La creación de archivos a menudo se usa para hacer que varios archivos sean más fáciles de mover.
Antes de extraer los archivos, reubíquelos en el directorio de Descargas.
Para extraer el archivo utilizamos la opción -x, El siguiente ejemplo utiliza un patrón similar al
anterior, especificando la operación, la compresión y un nombre de archivo para operar.

TAR
Option Function
-x Extract files from an archive
-j Compress (or decompress) an archive using the bzip2 command.
-f Use archive file
Archive The argument Archive will be the name of the resulting archive file

sysadmin@localhost:~/Downloads$ tar -xjf folders.tbz


sysadmin@localhost:~/Downloads$ ls -l
total 8
drwx------ 5 sysadmin sysadmin 4096 Dec 20 2017 School
-rw-rw-r-- 1 sysadmin sysadmin 413 Oct 31 18:37 folders.tbz

El archivo original está intacto y se crea el nuevo directorio. Dentro del directorio, están los
directorios y archivos originales.

sysadmin@localhost:~/Downloads$ cd School
sysadmin@localhost:~/Downloads/School$ ls -l
total 12
drwx------ 2 sysadmin sysadmin 4096 Oct 31 17:45 Art
drwx------ 2 sysadmin sysadmin 4096 Oct 31 17:47 Engineering
drwx------ 2 sysadmin sysadmin 4096 Oct 31 17:46 Math

Agregue el indicador –v y obtendrá un resultado detallado de los archivos procesados, lo que


facilita el seguimiento de lo que está sucediendo:

sysadmin@localhost:~/Downloads$ tar -xjvf folders.tbz


School/
School/Engineering/
School/Engineering/hello.sh
School/Art/
School/Art/linux.txt
School/Math/
School/Math/numbers.txt
9.3.3 Extract Mode
Es importante mantener el indicador –f al final, ya que tar asume que lo que sigue a esta opción es
un nombre de archivo. En el siguiente ejemplo, las banderas –f y –v se transpusieron, lo que llevó a
interpretar el comando tar como una operación en un archivo llamado v, que no existe.

tar -xjfv folders.tbz


sysadmin@localhost:~/Downloads$ tar -xjfv folders.tbz
tar (child):
tar -xjfvv:folders.tbz
Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

Si solo desea que algunos archivos salgan del archivo, agregue sus nombres al final del comando,
pero de manera predeterminada, deben coincidir exactamente con el nombre en el archivo o usar un
patrón.

El siguiente ejemplo muestra el mismo archivo que antes, pero extrayendo solo el archivo School /
Art / linux.txt. La salida del comando (como se solicitó el modo detallado con el indicador –v)
muestra que solo se ha extraído un archivo:

sysadmin@localhost:~/Downloads$ tar -xjvf folders.tbz School/Art/linux.txt


School/Art/linux.txt

El comando tar tiene muchas más funciones, como la capacidad de usar patrones al extraer
archivos, excluir ciertos archivos o enviar los archivos extraídos a la pantalla en lugar del disco. La
documentación de tar tiene información detallada.

9.4 ZIP Files


De hecho la utilidad de archivar en Microsoft es el archivo ZIP. ZIP no es tan frecuente en Linux,
pero es compatible con los comandos zip y descomprimir. Aunque, con tar y gzip / gunzip, los
mismos comandos y opciones se pueden usar indistintamente para hacer la creación y extracción,
pero este no es el caso con zip. La misma opción tiene diferentes significados para los dos
comandos diferentes. El modo predeterminado de zip es agregar archivos a un archivo comprimido
y comprimirlo.

zip [OPTIONS] [zipfile [file…]]


El primer argumento zipfile es el nombre del archivo que se creará, después de eso, una lista de
archivos que se agregarán. El siguiente ejemplo muestra un archivo comprimido llamado
alpha_files.zip que se está creando:

sysadmin@localhost:~/Downloads$ zip alpha_files.zip alpha*


adding: alpha-first.txt (deflated 32%)
adding: alpha-second.txt (deflated 36%)
adding: alpha-third.txt (deflated 48%)
adding: alpha.txt (deflated 53%)
adding: alpha_files.tar.gz (stored 0%)

Cabe señalar que tar requiere la opción –f para indicar que se está pasando un nombre de archivo,
mientras que zip y unzip requieren un nombre de archivo y, por lo tanto, no es necesario que
informe al comando que se pasa un nombre de archivo. El comando zip no es recursivo de forma
predeterminada, que es un comportamiento diferente que el comando tar. Es decir, simplemente
agregar School solo agregará el directorio vacío y no los archivos debajo de él. Si desea un
comportamiento similar a tar, debe usar la opción –r para indicar que se utilizará la recursividad:

sysadmin@localhost:~/Downloads$ zip -r School.zip School


updating: School/ (stored 0%)
updating: School/Engineering/ (stored 0%)
updating: School/Engineering/hello.sh (deflated 88%)
updating: School/Art/ (stored 0%)
updating: School/Art/linux.txt (deflated 49%)
updating: School/Math/ (stored 0%)
updating: School/Math/numbers.txt (stored 0%)
adding: School/Art/red.txt (deflated 33%)
adding: School/Art/hidden.txt (deflated 1%)
En el ejemplo anterior, todos los archivos del directorio de la escuela se agregan porque utiliza la
adding: School/Art/animals.txt (deflated 2%)
opción –r. Las primeras líneas de salida indican que se agregaron directorios al archivo,.

La opción –l list del comando unzip enumera archivos en archivos .zip:


sysadmin@localhost:~/Downloads$ zip -l School.zip
Archive: School.zip
Length Date Time Name
--------- ---------- ----- ----
0 2017-12-20 16:46 School/
0 2018-10-31 17:47 School/Engineering/
647 2018-10-31 17:47 School/Engineering/hello.sh
0 2018-10-31 19:31 School/Art/
83 2018-10-31 17:45 School/Art/linux.txt
0 2018-10-31 17:46 School/Math/
10 2018-10-31 17:46 School/Math/numbers.txt
51 2018-10-31 19:31 School/Art/red.txt
67 2018-10-31 19:30 School/Art/hidden.txt
42 2018-10-31 19:31 School/Art/animals.txt
--------- -------
900 10 files
Extraer0los archivos es17:46
2018-10-31 como School/Math/
crear el archivo, por defecto unzip es extraer. Ofrece varias opciones
si descomprimir archivos sobrescribirá los existentes:
10 2018-10-31 17:46 School/Math/numbers.txt
sysadmin@localhost:~/Downloads$
--------- ------- unzip School.zip
Archive:
740 School.zip7 files
replace School/Engineering/hello.sh? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Art/linux.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Math/numbers.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Art/red.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Art/hidden.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
replace School/Art/animals.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n

Esto se puede evitar copiando el archivo zip en un nuevo directorio:


sysadmin@localhost:~/Downloads$ mkdir tmp
sysadmin@localhost:~/Downloads$ cp School.zip tmp/School.zip
sysadmin@localhost:~/Downloads/tmp$ unzip School.zip
Archive: School.zip
creating: School/
creating: School/Engineering/
inflating: School/Engineering/hello.sh
creating: School/Art/
inflating: School/Art/linux.txt
Aquí, extraemos todos los archivos del archivo al directorio actual. Al igual que tar, puede pasar
creating:
nombres School/Math/
de archivo en la línea de comando. Los siguientes ejemplos muestran tres intentos
diferentes paraSchool/Math/numbers.txt
extracting: extraer un archivo.
inflating: School/Art/red.txt
Primero, solo se pasa el nombre del archivo sin el componente de directorio. Al igual que tar, el
inflating:
archivo School/Art/hidden.txt
no coincide.
inflating: School/Art/animals.txt
sysadmin@localhost:~/Downloads/tmp$ unzip School.zip linux.txt
Archive: School.zip
caution: filename not matched: linux.txt

Un segundo intento pasa el componente del directorio junto con el nombre del archivo, que extrae
solo ese archivo.

sysadmin@localhost:~/Downloads/tmp$ unzip School.zip School/Math/numbers.txt


Archive: School.zip
extracting: School/Math/numbers.txt

La tercera versión usa un comodín, que extrae los cuatro archivos que coinciden con el patrón, al
igual que tar.

sysadmin@localhost:~/Downloads/tmp$ unzip School.zip School/Art/*t


Archive: School.zip
inflating: School/Art/linux.txt
inflating: School/Art/red.txt
inflating: School/Art/hidden.txt
inflating: School/Art/animals.tx
10.1.1 Viewing Files in the Terminal

Hay funciones disponibles para que el shell controle la salida de los comandos, por lo que en lugar
de colocar la salida en la ventana del terminal, la salida se puede redirigir a otro archivo u otro
comando.
El comando cat, abreviatura de concatenate, es un comando simple pero útil cuyas funciones
incluyen crear y mostrar archivos de texto, así como combinar copias de archivos de texto. Uno de
los usos más populares de cat es mostrar el contenido de los archivos de texto.

Aunque el terminal es la salida predeterminada de este comando, el comando cat también se puede
usar para redirigir el contenido del archivo a otros archivos o ingresar otro comando mediante el uso
de caracteres de redireccionamiento.

10.1.2 Viewing Files Using a Page


Cat funciona correctamente con archivos pequeños, pero con archivos grandes presenta problemas.
El comando cat no proporciona ninguna forma fácil de pausar y reiniciar la pantalla, por lo que todo
el contenido del archivo se descarga en la pantalla.
El comando pager se usa para archivos más grandes. El comando pager muestra una página de
datos a la vez, lo que le permite avanzar y retroceder en el archivo mediante las teclas de
movimiento.

Hay dos comandos pager de uso común:


• less → proporciona una capacidad de paginación muy avanzada. Suele ser el
predeterminado utilizado por comandos como el comando man.
• More → ha existido desde los primeros días de UNIX. Si bien tiene menos funciones que el
comando less, sin embargo, el comando less no se incluye con todas las distribuciones de
Linux. El comando more está en todas las distribuciones Linux.
Los comandos more y less permiten a los usuarios moverse por el documento utilizando comandos
de pulsación de teclas.
10.1.2.1 Pager Movement Commands

Para ver un archivo con el comando less hay que pasar como argumento el nombre del archivo.
sysadmin@localhost:~/Downloads/tmp$ less words

Hay muchos comandos de movimiento para el comando less, cada uno con múltiples teclas posibles
o combinaciones de teclas. Cuando vea un archivo con el comando less, use la tecla H o Shift + H
para mostrar una pantalla de ayuda:

Las teclas que son idénticas en more y less se resumen a continuación para demostrar cómo
moverse más y menos al mismo tiempo:

Key Movement
Spacebar Window forward (Ventana siguiente)
B Window backward (Ventana anterior)
Enter Line forward (Linea siguiente)
Q Exit
H Help

10.1.2.2 Pager Searching Commands

Para comenzar una búsqueda con less hacia adelante de la página desde su posición actual, use la
barra diagonal / keyword. Luego, escriba el texto o patrón que coincida y presione la tecla Enter.
/keyword (palabra clave a buscar en el archivo)
Si se puede encontrar una coincidencia, el cursor se mueve en el documento a la coincidencia.
/ patrón a buscar

Si no se pueden encontrar coincidencias hacia adelante desde su posición actual, entonces la última
línea de la pantalla informará sobre Patrón no encontrado:
Pattern no found (press Return)
Para buscar hacia atrás desde su posición actual, presione el signo de interrogación ? keyword,
luego escriba el texto o patrón para que coincida y presione la tecla Enter. El cursor retrocede a la
primera coincidencia que puede encontrar o informa que no se puede encontrar el patrón.

Si se puede encontrar más de una coincidencia mediante una búsqueda, use la tecla n para mover la
siguiente coincidencia y use la combinación de teclas Mayús + N para ir a una coincidencia
anterior.
Los términos de búsqueda en realidad usan patrones llamados regular expressions.

10.1.3 Head and Tail (Cabeza y Cola)

Los comandos head y tail se usan para mostrar sólo las primeras o últimas líneas de un archivo,
respectivamente (o, cuando se usa con pipe |, la salida de un comando anterior). Por defecto, los
comandos head y tail muestran diez líneas del archivo que se proporciona como argumento.

Por ejemplo, el siguiente comando muestra las primeras diez líneas del archivo /etc/sysctl.conf:

sysadmin@localhost:~/Downloads/tmp$ cd
sysadmin@localhost:~$ head /etc/sysctl.conf
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables
# See sysctl.conf (5) for information.
#

#kernel.domainname = example.com

# Uncomment the following to stop low-level messages on console


#kernel.printk = 3 4 1 3
Pasar un número como una opción hará que los comandos head y tail muestren el número
especificado de líneas, en lugar del diez estándar. Por ejemplo, para mostrar las últimas cinco líneas
del archivo /etc/sysctl.conf use la opción -5:
sysadmin@localhost:~/Downloads/tmp$ tail -5 /etc/sysctl.conf
# Protects against creating or following links under certain conditions
# Debian kernels have both set to 1 (restricted)
# See https://www.kernel.org/doc/Documentation/sysctl/fs.txt
#fs.protected_hardlinks=0
#fs.protected_symlinks=0

La opción -n también se puede usar para indicar cuántas líneas generar. Pase un número como
argumento a la opción:
sysadmin@localhost:~/Downloads/tmp$ head -n 3 /etc/sysctl.conf
#
# /etc/sysctl.conf - Configuration file for setting system variables
# See /etc/sysctl.d/ for additional system variables

Negative Value Option

Tradicionalmente, en UNIX, el número de líneas a generar se especificaría como una opción con
cualquiera de los comandos, por lo que -3 significaba mostrar tres líneas. Para el comando tail, -3 o
-n -3 todavía significa mostrar tres líneas. Sin embargo, la versión GNU del comando head
reconoce -n -3 como mostrar todo excepto las últimas tres líneas, y aún así el comando head
todavía reconoce la opción -3 como mostrar las primeras tres lineas.

Positive Value Option

Especificar el número de líneas que se imprimirán. Si la opción -n se usa con un número prefijado
por el signo +, entonces el comando tail reconoce que esto significa mostrar el contenido que
comienza en la línea especificada y continúa hasta el final.

Por ejemplo, lo siguiente muestra el contenido de / etc / passwd desde la línea 25 hasta el final del
archivo: (El comando nl enumera las líneas a mostrar)
sysadmin@localhost:~/Downloads/tmp$ nl /etc/passwd | tail -n +25
25 sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
26 operator:x:1000:37::/root:/bin/sh
27 sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash

***
Los cambios de archivos en vivo se pueden ver usando la opción -f del comando tail, útil cuando
desea ver los cambios en un archivo a medida que ocurren.

Un buen ejemplo de esto sería ver archivos de registro como administrador del sistema. Los
archivos de registro se pueden usar para solucionar problemas y los administradores a menudo los
ven "interactivamente" con el comando tail mientras ejecutan comandos en una ventana separada.

Por ejemplo, si tuviera que iniciar sesión como usuario root, podría solucionar los problemas con
el servidor de correo electrónico al ver los cambios en vivo en el archivo de registro
/var/log/mail.log.

10.2 Command Line Pipes

El carácter pipe | , puede ser usado para enviar la salida de un comando a otro. Típicamente, cuando
un comando ha emitido o genera un error, el resultado se muestra en la pantalla; Sin embargo, este
no tiene que ser el caso. En lugar de imprimirse en la pantalla, la salida de un comando se convierte
en entrada para el siguiente comando. Esta herramienta puede ser poderosa, especialmente cuando
se buscan datos específicos; El pipe a menudo se usa para refinar los resultados de un comando
inicial.
nlsysadmin@localhost:~/Downloads/tmp$ ls /etc | head
X11
adduser.conf
alternatives
apparmor
apparmor.d
apt
bash.bashrc
bind
bindresvport.blacklist
binfmt.d
Se pueden usar varios pipe | consecutivamente para vincular varios comandos. Si se canalizan
varios comandos, la salida de uno pasa al siguiente hasta que la salida del último comando se
muestre en pantalla. Es importante elegir el orden de los comandos.
Los ejemplos a continuación ilustran esto usando el comando nl, que agrega números de línea a la
salida. En el primer ejemplo, el comando nl se usa para numerar las líneas de la salida del comando
ls anterior:
sysadmin@localhost:~/Downloads/tmp$ ls /etc/ssh | nl
1 moduli
2 ssh_config
3 ssh_host_ecdsa_key
4 ssh_host_ecdsa_key.pub
5 ssh_host_ed25519_key
6 ssh_host_ed25519_key.pub
7 ssh_host_rsa_key
8 ssh_host_rsa_key.pub
9 ssh_import_id
10 sshd_config

En el siguiente ejemplo, tenga en cuenta que el comando ls se ejecuta primero y su salida se envía al
nl comando nl, numerando todas las líneas de la salida del comando ls. Luego se ejecuta el
comando tail, que muestra las últimas cinco líneas desde la salida del comando nl:
sysadmin@localhost:~/Downloads/tmp$ ls /etc/ssh | nl | tail -5
6 ssh_host_ed25519_key.pub
7 ssh_host_rsa_key
8 ssh_host_rsa_key.pub
9 ssh_import_id
10 sshd_config

Compare el resultado anterior con el siguiente ejemplo:


sysadmin@localhost:~/Downloads/tmp$ ls /etc/ssh | tail -5 | nl
1 ssh_host_ed25519_key.pub
2 ssh_host_rsa_key
3 ssh_host_rsa_key.pub
4 ssh_import_id
5 sshd_config
Observe cómo los números de línea son diferentes. ¿Por qué es esto?

En el segundo ejemplo, la salida del comando ls se envía primero al comando tail que sólo toma las
últimas cinco líneas de la salida. Luego, el comando tail envía esas cinco líneas al comando nl, que
las numera del 1 al 5.

Las canalizaciones pueden ser potentes, pero es necesario considerar cómo se canalizan los
comandos para garantizar que se muestre la salida deseada.

10.3 Input/Output Redirection


La redirección de input / ouput, entrada / salida (I / O) permite que la información de la línea de
comandos se pase a diferentes flujos. Antes de analizar la redirección, es importante comprender las
transmisiones estándar.

• STDIN (Standard Input):


Es la información ingresada normalmente por el usuario a través del teclado. Cuando un
comando solicita datos al shell, el shell proporciona al usuario la capacidad de escribir
comandos que, a su vez, se envían al comando como STDIN.

• STDOUT (Standard Output):


Cuando un comando funciona correctamente (sin errores), la salida que produce se llama
STDOUT. Por defecto, STDOUT se muestra en la ventana de terminal donde se ejecuta el
comando. STDOUT también se conoce como stream o channel #1.

• STDERR (Standard Error):


Son mensajes de error generados por comandos. Por defecto, STDERR se muestra en la
ventana de terminal donde se ejecuta el comando. STDERR también se conoce como stream
o channel # 2.

La redirección de I /O permite al usuario redirigir STDIN para que los datos provengan de un
archivo y STDOUT / STDERR para que la salida vaya a un archivo. La redirección se logra
utilizando los caracteres de flecha <>.

10.3.1 STDOUT
STDOUT puede ser dirigido a archivos. Para comenzar, observe la salida del siguiente comando
echo que se muestra en la pantalla:
sysadmin@localhost:~/Downloads/tmp$ echo “Line 1”
Line 1

Usando el carácter >, la salida se puede redirigir a un archivo en su lugar:


sysadmin@localhost:~/Downloads/tmp$ echo “Line 1” > “example.txt”

Este comando no muestra ningún resultado porque STDOUT se envió al archivo example.txt en
lugar de a la pantalla.

Es importante darse cuenta de que la flecha única “>” sobrescribe cualquier contenido de un archivo
existente:
sysadmin@localhost:~/Downloads/tmp$ cat example.txt
Line 1
sysadmin@localhost:~/Downloads/tmp$ echo "New line 1" > example.txt
sysadmin@localhost:~/Downloads/tmp$ cat example.txt
New line 1

También es posible preservar el contenido de un archivo existente al agregarlo. Use dos caracteres
de flecha >> para agregar a un archivo en lugar de sobrescribirlo:
sysadmin@localhost:~/Downloads/tmp$ cat example.txt
New line 1
sysadmin@localhost:~/Downloads/tmp$ echo "Another line" >> example.txt
sysadmin@localhost:~/Downloads/tmp$ cat example.txt
New line 1
Another line

10.3.2 STDERR
STDERR se puede redirigir de manera similar a STDOUT. Cuando se usa el carácter de flecha para
redirigir, se supone stream #1 (STDOUT) a menos que se especifique otra secuencia. Por lo tanto,
stream # 2 debe especificarse al redirigir STDERR colocando el número 2 que precede al carácter
de flecha >.Para demostrar la redirección de STDERR, primero observe el siguiente comando que
produce un error porque el directorio especificado no existe:
sysadmin@localhost:~/Downloads/tmp$ ls /fake
ls: cannot access /fake: No such file or directory

Tenga en cuenta que no hay nada en el ejemplo anterior que implique que la salida es STDERR. El
resultado es claramente un mensaje de error, pero ¿cómo podría saber que se está enviando a
STDERR? Una manera fácil de determinar esto es redirigir STDOUT:
sysadmin@localhost:~/Downloads/tmp$ ls /fake > output.txt
ls: cannot access /fake: No such file or directory
En el ejemplo anterior, STDOUT fue redirigido al archivo output.txt. Por lo tanto, la salida que se
muestra no puede ser STDOUT porque se habría colocado en el archivo output.txt en lugar del
terminal. Como toda la salida del comando va a STDOUT o STDERR, la salida que se muestra
arriba debe ser STDERR.

La salida STDERR de un comando se puede enviar a un archivo:

sysadmin@localhost:~/Downloads/tmp$ ls /fake 2> error.txt

En el ejemplo, el 2> indica que todos los mensajes de error deben enviarse al archivo error.txt, que
puede confirmarse con el comando cat:

sysadmin@localhost:~/Downloads/tmp$ cat output.txt

10.3.3 Redirecting Multiple Streams

Es posible dirigir tanto STDOUT como STDERR de un comando al mismo tiempo. El siguiente
comando produce STDOUT y STDERR porque existe uno de los directorios especificados y el otro
no:

sysadmin@localhost:~/Downloads/tmp$ ls /fake /etc/ppp


ls: cannot access /fake: No such file or directory
/etc/ppp:
ip-down.d ip-up.d

Si solo se envía el STDOUT a un archivo, STDERR todavía se imprime en la pantalla:

sysadmin@localhost:~/Downloads/tmp$ ls /fake /etc/ppp > example.txt


ls: cannot access /fake: No such file or directory
sysadmin@localhost:~/Downloads/tmp$ cat example.txt
/etc/ppp:
ip-down.d
ip-up.d

Tanto STDOUT como STDERR se pueden enviar a un archivo utilizando el signo & delante del
carácter flecha > El conjunto de caracteres &> significa tanto 1> como 2>:

sysadmin@localhost:~/Downloads/tmp$ ls /fake /etc/ppp &> all.txt


sysadmin@localhost:~/Downloads/tmp$ cat all.txt
ls: cannot access /fake: No such file or directory
/etc/ppp:
ip-down.d
Tenga en cuenta que cuando usa &>, la salida aparece en el archivo con todos los mensajes
STDERR en la parte superior y todos los mensajes STDOUT debajo de todos los mensajes
STDERR:

sysadmin@localhost:~/Downloads/tmp$ ls /fake /etc/ppp /junk /etc/sound &> all.txt


sysadmin@localhost:~/Downloads/tmp$ cat all.txt
ls: cannot access '/fake': No such file or directory
ls: cannot access '/junk': No such file or directory
ls: cannot access '/etc/sound': No such file or directory
/etc/ppp:
ip-down.d
ip-up.d

Si no desea que STDERR y STDOUT vayan al mismo archivo, se pueden redirigir a diferentes
archivos usando ambos “>“ y “ 2>”. Por ejemplo, para dirigir STDOUT a example.txt y STDERR
a error.txt ejecute lo siguiente

sysadmin@localhost:~$ ls /fake /etc/ppp > example.txt 2> error.txt


sysadmin@localhost:~$ cat error.txt
ls: cannot access /fake: No such file or directory
sysadmin@localhost:~$ cat example.txt
/etc/ppp:
ip-down.d
ip-up.d

10.3.4 STDIN
El concepto de redirigir STDIN es difícil porque es más difícil de entender por qué querría redirigir
STDIN.
Hay muy pocos comandos que requieren que redireccione STDIN porque con la mayoría de los
comandos si desea leer datos de un archivo en un comando, puede especificar el nombre de archivo
como argumento para el comando.
Para algunos comandos, si no especifica un nombre de archivo como argumento, volverán a usar
STDIN para obtener datos. Por ejemplo, considere el siguiente comando cat:

sysadmin@localhost:~$ cat
hello
hello‌​ 
how are you?
how are you?
goodbye
goodbye

El primer comando en el siguiente ejemplo redirige la salida del comando cat a un archivo recién
creado llamado new.txt. A esta acción le sigue proporcionando al comando cat el archivo new.txt
como argumento para mostrar el texto redirigido en STDOUT.

sysadmin@localhost:~$ cat > new.txt


hello
how are you?
Goodbye
sysadmin@localhost:~$ cat new.txt
hello‌​ 
how are you?
goodbye

Si bien el ejemplo anterior demuestra otra ventaja de redireccionar STDOUT, no aborda por qué o
cómo se puede dirigir STDIN. Para entender esto, considere un nuevo comando llamado tr. Este
comando toma un conjunto de caracteres y los traduce a otro conjunto de caracteres.

Por ejemplo, para poner en mayúscula una línea de texto, use el comando tr de la siguiente manera:

sysadmin@localhost:~$ tr ‘a-z’ ‘A-Z’


watch how this works
WATCH HOW THIS WORKS

El comando tr tomó el STDIN del teclado y convirtió todas las letras minúsculas antes de enviar
STDOUT a la pantalla.

Parece que un mejor uso del comando tr sería realizar la traducción de un archivo, no la entrada del
teclado. Sin embargo, el comando tr no admite argumentos de nombre de archivo:
sysadmin@localhost:~$ cat example.txt
/etc/ppp:
ip-down.d
ip-up.d
sysadmin@localhost:~$ tr ‘a-z’ ‘A-Z’ example.txt
tr: extra operand `example.txt'
Try `tr --help' for more information

Sin embargo, es posible decirle al shell que obtenga STDIN de un archivo en lugar del teclado
usando el carácter < :

sysadmin@localhost:~$ tr 'a-z' 'A-Z' < example.txt


/ETC/PPP:
IP-DOWN.D
IP-UP.D
La mayoría de los comandos aceptan nombres de archivos como argumentos, por lo que este caso
de uso es relativamente raro. Sin embargo, para aquellos que no lo hacen, este método podría usarse
para que el shell lea desde el archivo en lugar de depender del comando para tener esta capacidad.
Una última nota para guardar el resultado resultante, redirigirlo a otro archivo:

sysadmin@localhost:~$ tr 'a-z' 'A-Z' < example.txt > newexample.txt


sysadmin@localhost:~$ cat newexample.txt
/ETC/PPP:
IP-DOWN.D
IP-UP.D

En el ejemplo anterior, copia el contenido del primer archivo «example.txt» y crea un segundo
archivo «newexample.txt» donde guarda el contenido convertido en mayúsculas.

10.4 Sorting Files or Input (ordenar archivos o entradas)

El comando sort se puede usar para reorganizar las líneas de archivos o entradas en el diccionario o
en orden numérico. El siguiente ejemplo crea un archivo pequeño, usando el comando head para
tomar las primeras 5 líneas del archivo /etc/passwd y enviar la salida a un archivo llamado
mypasswd.

sysadmin@localhost:~$ head -5 /etc/passwd > mypasswd


sysadmin@localhost:~$ cat mypasswd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
Ahora clasificaremos el archivo mypasswd:

sysadmin@localhost:~$ sort mypasswd


bin:x:2:2:bin:/bin:/usr/sbin/nologin
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
sys:x:3:3:sys:/dev:/usr/sbin/nologin

El comando de clasificación ha ordenado las líneas del archivo en orden alfabético

10.4.1 Fields and Sort Options

El comando sort puede reorganizar la salida en función del contenido de uno o más campos. Los
campos están determinados por un delimitador de campo contenido en cada línea. En informática,
un delimitador es un carácter que separa una cadena de texto o datos; el valor predeterminado es el
espacio en blanco, como spaces or tabs (espacios o pestañas).

El siguiente comando se puede usar para ordenar el tercer campo del archivo mypasswd
numéricamente. Se utilizan tres opciones para lograr este tipo:

SORT
Option Function
-t: La opción -t especifica el delimitador de campo. Si el archivo o la entrada están
separados por un delimitador que no sea un espacio en blanco, por ejemplo, una coma o
dos puntos, la opción -t permitirá especificar otro separador de campo como argumento.
El archivo mypasswd usado en el ejemplo anterior usa un carácter de dos puntos: como
delimitador para separar los campos, por lo que el siguiente ejemplo usa la opción -t:

-k3 La opción -k especifica el número de campo. Para especificar por qué campo ordenar,
use la opción -k con un argumento para indicar el número de campo, comenzando con 1
para el primer campo.

El siguiente ejemplo usa la opción -k3 para ordenar por el tercer campo.

-n Esta opción especifica el tipo de clasificación.

El tercer campo en el archivo mypasswd contiene números, por lo que la opción -n se


usa para realizar una ordenación numérica.

sysadmin@localhost:~$ sort -t: -n -k3 mypasswd


root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
Otra opción comúnmente utilizada para el comando sort es la opción -r, que se utiliza para realizar
una clasificación inversa. A continuación se muestra el mismo comando que el ejemplo anterior,
con la adición de la opción -r, haciendo que los números más altos en el tercer campo aparezcan en
la parte superior de la salida:

sysadmin@localhost:~$ sort -t: -n -k3 mypasswd


sync:x:4:65534:sync:/bin:/bin/sync
sys:x:3:3:sys:/dev:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
root:x:0:0:root:/root:/bin/bash

Por último, es posible que desee realizar clasificaciones más complejas, como ordenar por un
campo primario y luego por un campo secundario. Por ejemplo, considere el siguiente archivo de
valores separados por comas, un archivo donde el carácter de coma es el delimitador de campo:

sysadmin@localhost:~$ cat os.csv


1970,Unix,Richie
1987,Minix,Tanenbaum
1970,Unix,Thompson
1991,Linux,Torvalds

Para ordenar primero por el sistema operativo (field # 2) y luego año (field # 1) y luego por apellido
(field # 3), use el siguiente comando:

sysadmin@localhost:~$ sort -t, -k2 -k1n -k3 os.csv


1991,Linux,Torvalds
1987,Minix,Tanenbaum
1970,Unix,Richie
1970,Unix,Thompson

La siguiente tabla desglosa las opciones utilizadas en el ejemplo anterior:

SORT
Option Function
-t: Specifies the comma character as the field delimiter
-k2 Sort by field #2
SORT
-k1n Numerically sort by field #1
-k3 Sort by field #3

10.5 Viewing File Statistics (Visualización de estadísticas de archivo)

El comando wc proporciona el número de líneas, palabras y bytes (1 byte = 1 carácter en un archivo


de texto) para un archivo y un recuento total de líneas si se especifica más de un archivo. De forma
predeterminada, el comando wc permite imprimir hasta tres estadísticas para cada archivo
proporcionado, así como el total de estas estadísticas si se proporciona más de un nombre de
archivo:

sysadmin@localhost:~$ wc /etc/passwd /etc/passwd-


35 56 1710 /etc/passwd
34 55 1665 /etc/passwd-
69 111 3375 total

El ejemplo anterior tiene 4 columnas:


1. Number of lines
2. Number of words
3. Number of bytes
4. File name

Para ver estadísticas específicas, hay opciones que se pueden usar solas o combinadas:
• -l : To show just the number of lines

• -w : To show just the number of words

• -c : To show just the number of bytes

El comando wc puede ser útil para contar el número de líneas generadas por algún otro comando a
través de un pipe. Por ejemplo, si desea saber la cantidad total de archivos en el directorio /etc,
canalice la salida de ls a wc y cuente solo la cantidad de líneas:
sysadmin@localhost:~$ ls /etc/ | wc -l
142
10.6 Filter File Sections

El comando cut puede extraer columnas de texto de un archivo o entrada estándar. Se utiliza
principalmente para trabajar con archivos de bases de datos delimitados. Nuevamente, los archivos
delimitados son archivos que contienen columnas separadas por un delimitador. Estos archivos son
muy comunes en los sistemas Linux. De manera predeterminada, el comando cut espera que su
entrada esté separada por el carácter tabulador , pero la opción -d puede especificar delimitadores
alternativos, como los dos puntos o la coma. La opción -f puede especificar qué campos mostrar, ya
sea como un rango con guiones o como una lista separada por comas. En el siguiente ejemplo, se
muestran los campos primero, quinto, sexto y séptimo del archivo de base de datos mypasswd:
sysadmin@localhost:~$ cut -d: f1,5-7 mypasswd
root:root:/root:/bin/bash
daemon:daemon:/usr/sbin:/usr/sbin/nologin
bin:bin:/bin:/usr/sbin/nologin
sys:sys:/dev:/usr/sbin/nologin
sync:sync:/bin:/bin/sync

El comando de cut también puede extraer columnas de texto en función de la posición de los
caracteres con la opción -c, útil cuando se trabaja con archivos de base de datos de ancho fijo o
salidas de comandos. Por ejemplo, los campos del comando ls -l siempre están en las mismas
posiciones de caracteres. A continuación se mostrará solo el tipo de archivo (carácter 1), los
permisos (caracteres 2-10), un espacio (carácter 11) y el nombre de archivo (caracteres 50+):

sysadmin@localhost:~$ ls l | cut c1-11,50


total 44
drwxr-xr-x Desktop
drwxr-xr-x Documents
drwxr-xr-x Downloads
drwxr-xr-x Music
drwxr-xr-x Pictures
drwxr-xr-x Public
drwxr-xr-x Templates
drwxr-xr-x Videos
-rw-rw-r-- all.txt
-rw-rw-r-- example.txt
-rw-rw-r-- mypasswd
-rw-rw-r-- new.txt
10.7 Filter File Contents

El comando grep se puede usar para filtrar líneas en un archivo o la salida de otro comando que
coincida con un patrón especificado. Ese patrón puede ser tan simple como el texto exacto que
desea hacer coincidir o puede ser mucho más avanzado mediante el uso de expresiones regulares.

Por ejemplo, para encontrar todos los usuarios que pueden iniciar sesión en el sistema con el shell
BASH, el comando grep se puede usar para filtrar las líneas del archivo / etc / passwd para las
líneas que contienen el patrón bash:

sysadmin@localhost:~$ grep bash /etc/passwd


root:x:0:0:root:/root:/bin/bash
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash

Para que sea más fácil ver qué coincide exactamente, use la opción --color. Esta opción resaltará los
elementos coincidentes en rojo:
sysadmin@localhost:~$ grep –color bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash

En algunos casos, puede no ser importante encontrar las líneas específicas que coinciden con el
patrón, sino cuántas líneas coinciden con el patrón. La opción -c proporciona un recuento de
cuántas líneas coinciden:
sysadmin@localhost:~$ grep -c bash /etc/passwd
2

La opción -n del comando grep mostrará los números de línea originales. Para mostrar todas las
líneas y sus números de línea en el archivo / etc / passwd que contiene el patrón bash:
sysadmin@localhost:~$ grep -c bash /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
27:sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash

La opción -v invierte la coincidencia y genera todas las líneas que no contienen el patrón. Para
mostrar todas las líneas que no contienen nologin en el archivo / etc / passwd:
sysadmin@localhost:~$ grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:4:65534:sync:/bin:/bin/sync
operator:x:1000:37::/root:/bin/sh
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash
La opción -i ignora las distinciones de mayúsculas y minúsculas. A continuación se busca el patrón
en newhome.txt, lo que permite que cada carácter esté en mayúscula o minúscula:
sysadmin@localhost:~/Documents$ grep -i the new home.txt
There are three bathrooms.
**Beware** of the ghost in the bedroom.
The kitchen is open for entertaining.
**Caution** the spirits don't like guests.

La opción -w solo devuelve líneas que contienen coincidencias que forman palabras completas.
Para ser una palabra, la cadena de caracteres debe ir precedida y seguida de un carácter que no sea
de palabra. Los caracteres de palabras incluyen letras, dígitos y el carácter de subrayado.

Los siguientes ejemplos buscan el patrón are en el archivo newhome.txt. El primer comando busca
sin opciones, mientras que el segundo comando incluye la opción -w. Compare las salidas:
sysadmin@localhost:~/Documents$ grep are newhome.txt
There are three bathrooms.
**Beware** of the ghost in the bedroom.
sysadmin@localhost:~/Documents$ grep -w are newhome.txt
There are three bathrooms.

10.8 Basic Regular Expressions

Las expresiones regulares, también conocidas como regex, son una colección de caracteres
normales y especiales que se utilizan para encontrar patrones simples o complejos, respectivamente,
en los archivos. Estos caracteres son caracteres que se utilizan para realizar una función de
coincidencia particular en una búsqueda. Los caracteres normales son caracteres alfanuméricos que
coinciden entre sí. Por ejemplo, una a coincidiría con una a. Los caracteres especiales tienen
significados especiales cuando se usan dentro de patrones por comandos como el comando grep. Se
comportan de una manera más compleja y no coinciden. Hay expresiones regulares básicas
(disponibles para una amplia variedad de comandos de Linux) y expresiones regulares extendidas
(disponibles para comandos de Linux más avanzados). Las expresiones regulares básicas incluyen
lo siguiente:

GREP
Option Function
GREP
. Cualquier carácter
[] Una lista o rango de caracteres para que coincida con un carácter

Si el primer carácter entre paréntesis es el símbolo de intercalación (the caret)^, significa


cualquier carácter que no esté en la lista
* El carácter anterior repetido cero o más veces
^ Si el primer carácter en el patrón, el patrón debe estar al comienzo de la línea para que
coincida; de lo contrario, solo es un carácter ^
$ Si el último carácter del patrón, el patrón debe estar al final de la línea para que coincida,
de lo contrario, solo es el carácter $

Es una buena práctica usar comillas simples alrededor de las expresiones regulares para evitar que
el shell intente interpretar un significado especial de ellas.

10.8.1 The Period . Character


Una de las expresiones más útiles es el carácter . punto . Coincide con cualquier carácter, excepto
el nuevo carácter de línea. Considere los contenidos sin filtrar del archivo ~ / Documents / red.txt:

sysadmin@localhost:~/Documents$ cat red.txt


red
reef
rot
reeed
rd
rod
roof
reed
root
reel
read

El patrón r..f encontraría cualquier línea que contuviera la letra r seguida de exactamente dos
caracteres y luego la letra f:

sysadmin@localhost:~/Documents$ grep ' r..f ' red.txt


reef
roof
La línea no tiene que ser una coincidencia exacta, simplemente debe contener el patrón, como se ve
aquí cuando se busca r..t en el archivo / etc / passwd:

sysadmin@localhost:~/Documents$ grep ' r..t ' /etc/passwd


root:x:0:0:root:/root:/bin/bash
operator:x:1000:37::/root:

El carácter de punto se puede usar cualquier cantidad de veces. Para encontrar todas las palabras
que tienen al menos cuatro caracteres, se puede usar el siguiente patrón:
sysadmin@localhost:~/Documents$ grep '....' red.txt
reef
reeed
roof
reed
root
reel
read

10.8.2 The Bracket [ ] Characters


Al usar el carácter . , cualquier carácter posible podría coincidir con él. En algunos casos, desea
especificar exactamente qué caracteres desea hacer coincidir, como un carácter alfabético en
minúscula o un carácter numérico. Los corchetes [] coinciden con un solo carácter de la lista o
rango de posibles caracteres contenidos dentro de los corchetes. Por ejemplo, dado el archivo
profile.txt:

sysadmin@localhost:~/Documents$ cat profile.txt


Hello my name is Joe.
I am 37 years old.
3121991
My favorite food is avocados.
I have 2 dogs.
123456789101112

Para buscar todas las líneas en profile.txt que tienen un número, use el patrón [0123456789] o [0-9]:
sysadmin@localhost:~/Documents$ grep ‘[0-9]’ profile.txt
I am 37 years old.
3121991
I have 2 dogs.
123456789101112

Tenga en cuenta que cada posible carácter puede enumerarse [abcd] o proporcionarse como un
rango [a-d], siempre que el rango esté en el orden correcto. Por ejemplo, [d-a] no funcionaría
porque no es un rango válido:
sysadmin@localhost:~/Documents$ grep ‘[d-a]’ profile.txt
grep: Invalid range end

El rango se especifica mediante un estándar llamado tabla ASCII. Esta tabla es una colección de
todos los caracteres imprimibles en un orden específico. Puede ver la tabla ASCII con el comando
ascii. Una pequeña muestra:
sysadmin@localhost:~/Documents$ ascii
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

¿Qué pasa con la exención de caracteres ?, por ejemplo, para que coincida con un carácter que
puede ser cualquier cosa excepto una x, y o z? Sería ineficiente proporcionar un conjunto con todos
los caracteres excepto x, y o z. Para hacer coincidir un carácter que no sea uno de los caracteres
enumerados, inicie el conjunto con un símbolo ^. Para buscar todas las líneas que contienen
caracteres no numéricos, inserte un ^ como primer carácter dentro de los corchetes. Este carácter
niega los caracteres enumerados:
sysadmin@localhost:~/Documents$ grep '[^0-9]' profile.txt
Hello my name is Joe.
I am 37 years old.
My favorite food is avocados.
I have 2 dogs.

10.8.3 The Asterisk * Character


El asterisco * se usa para hacer coincidir cero o más apariciones de un carácter o patrón que lo
precede. Por ejemplo, e * coincidiría con cero o más ocurrencias de la letra e:

sysadmin@localhost:~/Documents$ cat red.txt


red
reef
rot
reeed
rd
rod
roof
reed
root
reel
read
sysadmin@localhost:~/Documents$ grep ‘re*d’ red.txt
red
reeed
rd
reed

También es posible hacer coincidir cero o más ocurrencias de una lista de caracteres utilizando los
corchetes. El patrón [oe] * utilizado en el siguiente ejemplo coincide con cero o más ocurrencias del
carácter “o” o el carácter “e”:

sysadmin@localhost:~/Documents$ grep ‘r[oe]*d’ red.txt


red
º
reeed
rd
rod
reed

Cuando se usa con solo otro carácter, * no es muy útil. Cualquiera de los siguientes patrones
coincidiría con cada cadena o línea del archivo: '. *' 'E *' 'b *' 'z *' porque el asterisco * puede
coincidir con cero apariciones de un patrón.

Para que el carácter de asterisco sea útil, es necesario crear un patrón que incluya más que solo el
carácter que lo precede. Por ejemplo, los resultados anteriores se pueden refinar agregando otra e
para hacer que el patrón ee * coincida efectivamente con cada línea que contiene al menos una e.

º
10.8.4 Anchor Characters
Al realizar una coincidencia de patrón, la coincidencia podría ocurrir en cualquier lugar de la línea.
Los caracteres de anclaje son una de las formas en que las expresiones regulares se pueden usar
para limitar los resultados de búsqueda. Especifican si la coincidencia se produce al principio de la
línea o al final de la línea.

Por ejemplo, la raíz del patrón aparece muchas veces en el archivo / etc / passwd:

sysadmin@localhost:~/Documents$ grep ‘root’ /etc/passwd


root:x:0:0:root:/root:/bin/bash
operator:x:1000:37::/root:

El carácter de intercalación (circumflex) ^ se utiliza para garantizar que aparezca un patrón al


comienzo de la línea. Por ejemplo, para buscar todas las líneas en / etc / passwd que comienzan con
root, use el patrón ^ root. Tenga en cuenta que ^ debe ser el primer carácter en el patrón para ser
efectivo:
sysadmin@localhost:~/Documents$ grep ‘^root’ /etc/passwd
root:x:0:0:root:/root:/bin/bash

El segundo carácter de anclaje $ se puede usar para garantizar que aparezca un patrón al final de la
línea, reduciendo así efectivamente los resultados de búsqueda. Para encontrar las líneas que
º
terminan con una r en el archivo alpha-first.txt, use el patrón r $:

sysadmin@localhost:~/Documents$ cat alpha-first.txt


A is for Animal
B is for Bear
C is for Cat
D is for Dog
E is for Elephant
F is for Flower
ºsysadmin@localhost:~/Documents$ grep ‘r$’ alpha-first.txt
B is for Bear
F is for Flower

El $ debe ser el último carácter en el patrón para ser efectivo


10.8.5 The Backslash \ Character
º
En algunos casos, es posible que desee hacer coincidir un carácter que resulta ser un carácter de
expresión regular especial. Para buscar un carácter asterisco * real, coloque una barra invertida \
carácter antes del carácter asterisco *:
sysadmin@localhost:~/Documents$ grep 're*' newhome.txt
Thanks for purchasing your new home!!
**Warning** it may be haunted.
There are three bathrooms.
**Beware** of the ghost in the bedroom.
The kitchen is open for entertaining.
**Caution** the spirits don't like guests.

sysadmin@localhost:~/Documents$ grep 're\*' newhome.txt


**Beware** of the ghost in the bedroom.

10.8.6 Extended Regular Expressions

El uso de expresiones regulares extendidas a menudo requiere que se proporcione una opción
especial al comando para reconocerlas. Históricamente, hay un comando llamado egrep, que es
similar a grep, pero puede comprender expresiones regulares extendidas. Ahora, el comando egrep
está en desuso a favor del uso de grep con la opción -E.
º
Las siguientes expresiones regulares se consideran extendidas:

GREP
Option Function
? Caracter opcinal, coincide con el carácter anterior cero o una vez.
+ Matches previous character repeated one or more times
| Alternation or like a logical "or" operator

Para hacer coincidir “colo” seguido degrep


sysadmin@localhost:~/Documents$ cero-E
o un carácterspelling.txt
‘colou?r’ “u” seguido de un carácter “r”:
American English: Do you consider gray to be a color or a shade?
British English: Do you consider grey to be a colour or a shade?
Para hacer coincidir uno o más caracteres e:

sysadmin@localhost:~/Documents$ grep -E ‘e+’ red.txt


red
reef
º
reeed
reed
reel
read

Para que coincida con gray o grey:

sysadmin@localhost:~/Documents$ grep -E ‘gray|grey’ spellling.txt


American English: Do you consider gray to be a color or a shade?
British English: Do you consider grey to be a colour or a shade?

LAB 10

10.2.4 Step 4

El comando find es un buen comando para demostrar cómo funciona stderr. Este comando muy
flexible permite buscar con una gran cantidad de opciones como nombre de archivo, tamaño, fecha,
tipo y permiso. El comando find comenzará la búsqueda en el directorio especificado y buscará
recursivamente todos los subdirectorios.
El comando find comenzará la búsqueda en el directorio especificado y buscará recursivamente
todos los subdirectorios. Por ejemplo, para buscar archivos que comiencen en su directorio personal
que contenga el nombre bash:

sysadmin@localhost:~/Documents$ find ~ -name “*bash*”


/home/sysadmin/.bash_logout
/home/sysadmin/.bashrc
sysadmin@localhost:~/Documents$ find /etc -name hosts
/etc/hosts
find: '/etc/ssl/private': Permission denied

Observe el mensaje de error que indica que no tiene permiso para acceder a ciertos archivos /
directorios. Esto se debe a que, como usuario habitual, no tiene derecho a "mirar dentro" de algunos
directorios. Estos tipos de mensajes de error se envían a stderr, no a stdout. Para redirigir stderr
(mensajes de error) a un archivo, emita el siguiente comando:

sysadmin@localhost:~/Documents$ find /etc -name hosts 2> err.txt


/etc/hosts
sysadmin@localhost:~/Documents$ cat err.txt
find: `/etc/ssl/private': Permission denied

**Note that 1> is the same as >**

10.2.7 Step 7

Para redirigir tanto la salida estándar (stdout) como el error estándar (stderr) a un archivo, primero
redirija stdout a un archivo y luego redirija stderr a ese mismo archivo usando la notación 2> & 1

sysadmin@localhost:~/Documents$ find /etc -name hosts > find.out 2>&1


sysadmin@localhost:~/Documents$ cat find.out
/etc/hosts
find: '/etc/ssl/private': Permission denied

La parte 2> & 1 del comando significa "enviar el stderr (channel 2) al mismo lugar donde va
stdout (channel 1)".

10.2.11 Step 11
Otra forma popular de redireccionamiento es tomar la salida de un comando y enviarlo a otro
comando como entrada. Por ejemplo, la salida de algunos comandos puede ser masiva, lo que hace
que la salida se desplace demasiado rápido de la pantalla para leerla. Ejecute el siguiente comando
para tomar la salida del comando ls y enviarlo al comando more, que muestra una página de datos a
la vez:
ls -l /etc | more

10.2.12 Step 12
En el siguiente ejemplo, usará un comando llamado cut para extraer todos los nombres de usuario
de una base de datos llamada / etc / passwd (un archivo que contiene información de la cuenta del
usuario). Primero, intente ejecutar el comando de corte por sí mismo:

sysadmin@localhost:~/Documents$ cut -d: -f1 /etc/passwd


sysadmin@localhost:~/Documents$ cat find.out
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
Laircanterior salida del comando cut se mostraba desordenada, para ordenar esta, enviaremos la
salida
gnatsdel comando cut al comando sort mediane el pipe y el contenido se mostrara en orden
alfabético.
nobody
libuuid
cut -d: -f1 /etc/passwd | sort
syslog
bind
Elsshd
contenido sale ordenado pero se escapa de la pantalla, para filtrar y resolver este problema,
usaremos
operatorel comando more.

sysadmin@localhost:~$ cut -d: -f1 /etc/passwd | sort | more


backup
bin
bind
daemon
games
gnats
irc
libuuid
list
lp
mail
man
news
nobody
operator
proxy
root
sshd
sync
sys
sysadmin
syslog
uucp
--More--

10.3 Viewing Large Text Files

Aunque los archivos de texto grandes se pueden ver con el comando cat, es inconveniente
desplazarse hacia atrás hacia la parte superior del archivo. Además, los archivos realmente grandes
no se pueden mostrar de esta manera porque la ventana de terminal solo almacena un número
específico de líneas de salida en la memoria.

El uso de los comandos more o less permite al usuario ver los datos de una "página" o una línea a la
vez. Estos comandos "pager" también permiten otras formas de navegación y búsqueda.

10.4 Searching Text Using Regular Expressions

El comando grep usa expresiones regulares básicas, caracteres especiales como comodines que
coinciden con patrones en los datos. El comando grep devuelve la línea completa que contiene el
patrón que coincide.

La opción -E del comando grep se puede usar para realizar búsquedas con expresiones regulares
extendidas, esencialmente expresiones regulares más potentes. Otra forma de usar expresiones
regulares extendidas es usar el comando egrep.

El comando fgrep se usa para unir caracteres literales, ignorando el significado especial de los
caracteres de expresión regular.

Use comillas simples (no comillas dobles) alrededor de las expresiones regulares para evitar que
el programa shell intente interpretarlas.

10.4.6 Step 6

Usa el carácter de punto. para que coincida con cualquier carácter individual. Por ejemplo, ejecute
el siguiente comando para que coincida con cualquier carácter seguido de una 'y':
grep '.y' passwd

El carácter de tubería, | u "operador de alternancia", actúa como un operador "u". Por ejemplo,
ejecute lo siguiente para intentar hacer coincidir sshd, root u operator:
(sin espacios entre argumentos y pipe)
grep 'sshd|root|operator' passwd

Observe que el comando grep no reconoce la tubería como el operador de alternancia por defecto.
El comando grep en realidad incluye la tubería como un carácter simple en el patrón que se va a
hacer coincidir. El uso de grep -E o egrep permitirá el uso de expresiones regulares extendidas,
incluida la alternancia.
Use otra expresión regular extendida, esta vez con egrep con alternancia en un grupo para que
coincida con un patrón. Los string “nob” y “non” coincidirán:
egrep 'no(b|n)' passwd

Los paréntesis, (), se utilizaron para limitar el "alcance" del caràcter |. Sin ellos, un patrón como
nob | n habría significado "coincidir con nob o n".

Los caracteres [] también se pueden usar para hacer coincidir un solo carácter. Sin embargo, a
diferencia del carácter de punto, los caracteres [] se usan para especificar exactamente qué carácter
desea que coincida. Por ejemplo, si desea hacer coincidir un carácter numérico, puede especificar
[0-9]. Ejecute el siguiente comando para una demostración:

head passwd | grep '[0-9]'

Suponga que desea buscar un patrón que contenga una secuencia de tres dígitos. Puede usar {}
caracteres con un número para expresar que desea repetir un patrón un número específico de veces;
por ejemplo: {3}. El uso de numeric qualifier (calificador numérico) requiere el modo extendido
de grep:
sysadmin@localhost:~$ grep -E ‘[0-9]{3}’ passwd
sync:x:4:65534:sync:/bin:/bin/sync
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd/netif:/usr/
sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nol
ogin
syslog:x:103:106::/home/syslog:/usr/sbin/nologin
messagebus:x:104:107::/nonexistent:/usr/sbin/nologin
bind:x:105:110::/var/cache/bind:/usr/sbin/nologin
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
operator:x:1000:37::/root:/bin/sh
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash
11 Basic Scripting

11.2 Shell Scripts in a Nutshell

Un script de shell es un archivo de comandos ejecutables que se ha almacenado en un archivo de


texto. Cuando se ejecuta el archivo, se ejecuta cada comando. Los scripts de Shell tienen acceso a
todos los comandos del shell, incluida la lógica. Por lo tanto, un script puede probar la presencia de
un archivo o buscar resultados particulares y cambiar su comportamiento en consecuencia. Puede
crear scripts para automatizar partes repetitivas de su trabajo, lo que libera su tiempo y garantiza la
coherencia cada vez que usa el script. Por ejemplo, si ejecuta los mismos cinco comandos todos los
días, puede convertirlos en un script de shell que reduce su trabajo a un solo comando.

La ejecución de un script se puede realizar pasándolo como argumento a su shell o ejecutá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, primero, el script se ejecuta como un argumento para el shell. A


continuación, el script se ejecuta directamente desde el shell. Es raro tener el directorio actual en la
ruta de búsqueda binaria $ PATH, por lo que el nombre tiene el prefijo ./ para indicar que se debe
ejecutar fuera del directorio actual.
El error Permiso denegado significa que el script no se ha marcado como ejecutable. chmod se usa
para cambiar los permisos de un archivo, que se explicará en detalle en un capítulo posterior.
Hay varios shells con su propia sintaxis de idioma. Por lo tanto, los scripts más complicados
indicarán un shell particular al especificar la ruta absoluta al intérprete como la primera línea, con el
prefijo #! como se muestra:

#!/bin/sh
echo “Hello, World!”

#!/bin/bash
echo “Hello, World!”

Los dos caracteres “ #! “ tradicionalmente se llaman hash y bang respectivamente, lo que lleva a la
forma abreviada de "shebang" cuando se usan al comienzo de un guión. Por cierto, el shebang (o
crunchbang) se usa para los scripts de shell tradicionales y otros lenguajes basados en texto como
Perl, Ruby y Python. Cualquier archivo de texto marcado como ejecutable se ejecutará con el
intérprete especificado en la primera línea siempre que el script se ejecute directamente. Si el script
se invoca directamente como un argumento para un intérprete, como script sh o script bash, el shell
dado se utilizará sin importar el contenido de la línea shebang.

11.3 Editing Shell Scripts

UNIX tiene muchos editores de texto. Los méritos de uno sobre el otro a menudo se debaten
acaloradamente. Dos se mencionan específicamente en el programa de LPI Essentials: el editor
nano de GNU es un editor muy simple, muy adecuado para editar archivos de texto pequeños. El
Editor visual, vi, o su versión más nueva, VI mejorado (vim), es un editor notablemente poderoso
pero tiene una curva de aprendizaje pronunciada. Nos centraremos en nano.

Escriba
nano
test.sh y
verá una
pantalla
similar a
esta:
El nano editor tiene algunas características para que pueda seguir su camino. Simplemente escriba
con su teclado, utilizando las teclas de flecha para moverse y el botón Eliminar / retroceso para
eliminar texto. En la parte inferior de la pantalla, puede ver algunos comandos disponibles, que son
sensibles al contexto y cambian según lo que esté haciendo. Si está directamente en la máquina
Linux, en lugar de conectarse a través de la red, también puede usar el mouse para mover el cursor
y resaltar el texto.

En este punto, puede salir del programa sin guardar presionando la tecla N, o guardar primero
presionando Y para guardar. El valor predeterminado es guardar el archivo con el nombre del
archivo actual. Puede presionar la tecla Intro para guardar y salir.
Ctrl y O juntos para guardar su trabajo sin salir del editor.
las teclas de flecha para mover el cursor a la línea que tiene "The time is". Presione Control y K dos
veces para cortar las dos últimas líneas al búfer de copia. Mueva el cursor a la línea restante y
presione Control y U una vez para pegar el búfer de copia en la posición actual. Esto hace que el
script haga eco de la hora actual antes de saludarlo y le ahorre la necesidad de volver a escribir las
líneas.

Otros comandos útiles que puede necesitar son:

NANO
Command Description
Ctrl + W search the document
Ctrl + W, then Control + R search and replace
Ctrl + G show all the commands possible
Ctrl + Y/V page up / down
NANO
Ctrl + C show the current position in the file and the
file’s size

11.4 Scripting Basics

/ bin / bash es Bash


hay 3 temas con los que debe familiarizarse:
• Variables (Variables), que contienen información temporal en el script

• Conditionals (Condicionales), que te permiten hacer cosas diferentes según condiciones que
escribes.
• Loops (Bucles), te permiten hacer lo mismo una y otra vez

11.4.1 Variables
Las variables son una parte clave de cualquier lenguaje de programación. Aquí se muestra un uso
muy simple de variables:
#!/bin/bash

ANIMAL="penguin"
echo "My favorite animal is a $ANIMAL"

Es importante que no haya espacios entre el nombre de la variable, el signo igual y el elemento que
se asignará a la variable. Si tiene un espacio allí, obtendrá un error extraño como "command not
found". No es necesario poner en mayúscula el nombre de la variable, pero es una convención útil
para separar las variables de los comandos que se ejecutarán.
A continuación, el script hace eco de una cadena a la consola. El string contiene el nombre de la
variable precedida por un signo de dólar. Cuando el intérprete ve ese signo de dólar, reconoce que
sustituirá el contenido de la variable, que se llama interpolation (interpolación).
Para asignar a una variable, solo usa el nombre de la variable. Para acceder al contenido de la
variable, prefije con un signo de dólar. ¡Aquí, mostramos una variable a la que se le asigna el
contenido de otra variable!

#!/bin/bash

ANIMAL=penguin
SOMETHING=$ANIMAL
echo "My favorite animal is a $SOMETHING"
ANIMAL contiene el string pingüino (ya que no hay espacios; en este ejemplo, se muestra la
sintaxis alternativa sin usar comillas). A SOMETHINGS se le asigna el contenido de ANIMAL
(porque ANIMAL tiene el signo de dólar frente a él),
Otra forma de asignar a una variable es usar la salida de otro comando como el contenido de la
variable, encerrando el comando en back sticks.

#!/bin/bash

CURRENT_DIRECTORY=`pwd`
echo "You are in $CURRENT_DIRECTORY"

Este patrón a menudo se usa para procesar texto. Puede tomar texto de una variable o un archivo de
entrada y pasarlo a través de otro comando como sed o awk para extraer ciertas partes y mantener
el resultado en una variable. El comando sed se usa para editar stream (STDIN) y el comando awk
se usa para scripting. Estos comandos están más allá del alcance de este curso.

Es posible obtener información del usuario de su script y asignarla a una variable a través del
comando read:

#!/bin/bash

echo -n "What is your name? "


read NAME
echo "Hello $NAME!"

El comando read puede aceptar un string directamente desde el teclado o como parte de la
redirección de comandos. Hay algunas variables especiales además de las que estableces. Puede
pasar argumentos a su script:

#!/bin/bash
echo "Hello $1"

Un signo de dólar “$” seguido de un número “N” corresponde al “Nth “ argumento pasado al script.
Si llama al ejemplo anterior con ./test.sh World, la salida será Hello World. La variable $0 contiene
el nombre del script en sí.
Después de que se ejecuta un programa, ya sea un binario o un script, devuelve un código de salida
que es un número entero entre 0 y 255. Puede probar esto a través de $? variable para ver si el
comando anterior se completó correctamente.

sysadmin@localhost:~$ grep -q root /etc/passwd


sysadmin@localhost:~$ echo $?
0
sysadmin@localhost:~$ grep -q slartibartfast /etc/passwd
sysadmin@localhost:~$echo $?
1

El comando grep se utilizó para buscar una cadena dentro de un archivo con el indicador –q, que
significa "quiet" (silencioso). Grep, mientras se ejecuta en modo quiet, devuelve 0 si se encontró la
cadena y 1 en caso contrario. Esta información se puede usar de forma condicional para realizar una
acción basada en la salida de otro comando.

Del mismo modo, puede establecer el código de salida de su propio script con el comando exit:

#!/bin/bash
# Something bad happened!
exit 1

El ejemplo anterior muestra un comentario #. Cualquier cosa después de la marca hash se ignora, lo
que se puede usar para ayudar al programador a dejar notas. La salida 1 devuelve el código de exit 1
a la llamada. Esto incluso funciona en el shell, si ejecuta este script desde la línea de comando y
luego escribe echo $? verá que devuelve 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 del programa. Arriba viste
que grep usa 1 para significar que no se encontró la cadena.

11.4.2 Conditionals
Ahora que puede ver y establecer variables, es hora de hacer que su script realice diferentes
funciones basadas en test, llamadas branching. La instrucción if es el operador básico para
implementar branching (ramificación).

Una declaración if básica 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 con fi. Usando lo que sabe
sobre grep, ahora puede escribir un script que haga cosas diferentes en función de la presencia de
una cadena en el archivo de contraseña:

#!/bin/bash

if grep -q root /etc/passwd; then


echo root is in the password file
else
echo root is missing from the password file
fi

De los ejemplos anteriores, puede recordar que el código de salida de grep es 0 si se encuentra el
string. El ejemplo anterior usa esto en una línea para imprimir un mensaje si root está en el archivo
pasword o un mensaje diferente si no lo está. La diferencia aquí es que en lugar de un fi para cerrar
el bloque if, hay un else. Esto le permite hacer una acción si la condición es true y otra si la
condición es false. El bloque else debe estar cerrado con la palabra clave fi. Otras tareas comunes
son buscar la presencia de un archivo o directorio y comparar string y números. Puede inicializar un
archivo log si no existe, o comparar el número de líneas en un archivo con la última vez que lo
ejecutó. El comando if es claramente el que ayuda aquí, pero ¿qué comando usas para hacer la
comparación?
El comando test le brinda acceso fácil a los operadores de comparación y prueba de archivos. Por
ejemplo:
TEST
COMMAND DESCRIPTION
test –f /dev/ttyS0 0 if the file exists
test ! –f /dev/ttyS0 0 if the file doesn’t exist
test –d /tmp 0 if the directory exists
test –x `which ls substitute the location of ls then test if the user can
execute (-x→archivo existe con permisos de ejecución)
test 1 –eq 1 0 if numeric comparison succeeds
test ! 1 –eq 1 NOT – 0 if the comparison fails
test 1 –ne 1 Easier, test for numeric inequality
test “a” = “a” 0 if the string comparison succeeds
test “a” != “a” 0 if the strings are different
test 1 –eq 1 –o 2 –eq 2 -o is OR: either can be the same
test 1 –eq 1 –a 2 –eq 2 -a is AND: both must be the same
test 1 –gt 2 -gt fot greater than

Es importante tener en cuenta que la prueba analiza las comparaciones de enteros y string de
manera diferente. 01 y 1 son iguales por comparación numérica, pero no por comparación de string.
Siempre debe tener cuidado de recordar qué tipo de entrada esperas.
Hay muchas más pruebas, como –gt para mayor que, formas de probar si un archivo es más nuevo
que el otro, y muchas más. Consulte la página de test man para obtener más información.
El alias de test es [ (corchete izquierdo de apertura). Si encierra sus condiciones entre corchetes, es
lo mismo que ejecutar test. Entonces, estas declaraciones son idénticas.

#!/bin/bash
if test –f /tmp/foo; then
if [ -f /tmp/foo]; then

Si bien la última forma se usa con mayor frecuencia, es importante comprender que el corchete es
un comando en sí mismo que funciona de manera similar a test excepto que este requiere el
corchete de cierre.
La declaración if tiene una forma final que le permite hacer múltiples comparaciones a la vez
usando elif (abreviatura de else if).
#!/bin/bash

if [ "$1" = "hello" ]; then


echo "hello yourself"
elif [ "$1" = "goodbye" ]; then
echo "nice to have met you"
echo "I hope to see you again"
else
echo "I didn't understand that"
fi
El código anterior compara el primer argumento pasado al script. Si es “hello”, se ejecuta el primer
bloque. Si no, el script comprueba si es un “goodbye” y, si es así, muestra un mensaje diferente. De
lo contrario, se envía un tercer mensaje. Tenga en cuenta que se cita la variable $1 y se utiliza el
operador de comparación de string en lugar de la versión numérica (-eq).
Las pruebas if / elif / else pueden volverse bastante detalladas y complicadas. La declaración del
caso proporciona una forma diferente de facilitar las pruebas múltiples.

#!/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 declaración del caso comienza con una descripción de la expression que se está probando: caso
de expression. La expresión aquí es $1.
A continuación, cada conjunto de pruebas se ejecuta como una coincidencia de patrón terminada
por un paréntesis de cierre. El ejemplo anterior primero busca hello o hi; son múltiples opciones
separadas por la barra vertical | que es un operador OR en muchos lenguajes de programación. Los
siguientes son los comandos que se ejecutarán si el patrón devuelve verdadero, que terminan en dos
puntos y comas. El patrón se repite.
El patrón * es el mismo que un else porque coincide con cualquier cosa. El comportamiento de la
declaración de caso es similar a la declaración if / elif / else en que el procesamiento se detiene
después de la primera coincidencia. Si ninguna de las otras opciones coincide, el * asegura que la
última coincida.

Con una sólida comprensión de los condicionales, puede hacer que sus scripts tomen medidas solo
si es necesario.

11.4.3 Loops

Los loops permiten que el código se ejecute repetidamente. Pueden ser útiles en numerosas
situaciones, como cuando desea ejecutar los mismos comandos sobre cada archivo en un directorio,
o repetir alguna acción 100 veces. Hay dos bucles principales en los scripts de shell: el loop for y el
bucle while.
Los loop for se utilizan cuando tiene una colección finita sobre la que desea iterar, como una lista
de archivos o una lista de nombres de servidores:

loop for:

#!/bin/bash

SERVERS="servera serverb serverc"


for S in $SERVERS; do
echo "Doing something to $S"
done

El script primero establece una variable que contiene una lista de nombres de servidores separados
por espacios. Luego, la instrucción for recorre la lista de servidores, cada vez establece la variable S
en el nombre del servidor actual. La elección de S fue arbitraria, pero tenga en cuenta que la S no
tiene signo de dólar, pero los $SERVERS sí, lo que demuestra que $SERVERS se expandirá a la
lista de servidores. La lista no tiene que ser una variable. Este ejemplo muestra dos formas más de
pasar una lista.

#!/bin/bash

for NAME in Sean Jon Isaac David; do


echo "Hello $NAME"
done

for S in *; do
echo "Doing something to $S"
done
El primer bucle es funcionalmente el mismo que el ejemplo anterior, excepto que la lista se pasa
directamente al bucle for en lugar de usar una variable. El uso de una variable ayuda a la claridad
del guión, ya que alguien puede hacer cambios en la variable fácilmente en lugar de mirar un bucle.

El segundo bucle usa un * que es un archivo glob. El shell lo expande a todos los archivos en el
directorio actual.

El otro tipo de bucle, un bucle while, opera en una lista de tamaño desconocido. Su trabajo es seguir
ejecutándose y en cada iteración realizar una prueba para ver si debe ejecutarse en otro momento.
Puedes pensarlo como "mientras alguna condición es verdadera, haz cosas".

#!/bin/bash

i=0
while [ $i -lt 10 ]; do
echo $i
i=$(( $i + 1))
done
echo “Done counting”

El ejemplo anterior muestra un ciclo while que cuenta de 0 a 9. Una variable de contador, i, se
inicializa a 0. Luego se ejecuta un ciclo while con la prueba "si $ i es menor que 10?" ¡Tenga en
cuenta que el ciclo while usa la misma notación que una declaración if!
Dentro del ciclo while, el valor actual de i se repite y luego se le agrega 1 a través del comando $
((aritmético)) y se le asigna nuevamente a i. Una vez que se convierte en 10, la instrucción while
devuelve false y el procesamiento continúa después del ciclo.

Lab 11

11.2 Basic Text Editing

El editor vi tiene dos modos:


• insert: Agrega texto a un documento

• command: Se pueden realizar operaciones como navegación, búsqueda, guardado y salida


del editor.
Cuando se invoca vi, entra en modo command de manera predeterminada.

VI
KEY FUNCTION
j Moves cursor down one line (same as down arrow)
k Moves cursor up line (same as up arrow)
l Moves cursor to the right one character (same as right arrow)
h Moves cursor to the left one character (same as left arrow)
w Moves cursor to beginning of next word
e Moves cursor to end of word
b Moves cursor to beginning of previous word

Si escribe cualquier otra tecla que las mencionadas anteriormente, puede terminar en modo de
inserción. ¡No entres en pánico! Presione la tecla Esc, luego: q! + la tecla Intro. Esto debería salir de
vi sin guardar ningún cambio. A continuación, ejecute vi myfile y volverá al editor vi.

More vi cursor navigation: press the following keys and observe how the cursor moves:

VI
KEY FUNCTION
$ Moves cursor to end of current line (same as End key)
0 (zero) Moves cursor beginning of current line (same as Home key)
3G Jumps to third line (nG jumps to the nth line)
1G Jumps to first line
Shift+G Jumps to the last line

El siguiente ejemplo borra text del texto


:%s/text //g

capitulo 12, hardware


Use the head command with the -n option to list the first 20 lines of the cpuinfo file:
head -n 20 /proc/cpuinfo

free -m
free -g

The output shows the amount of memory in megabytes when the -m option is used and in gigabytes
when the -g option is used:

sysadmin@localhost:~$ free -m
total used free shared
buff/cache available
Mem: 128920 53910 67178 8
7832 74394
Swap: 131050 177 130873
sysadmin@localhost:~$ free -g
total used free shared buff/cache
available
Mem: 125 52 65 0
7 72
Swap: 127 0 127
sysadmin@localhost:~$

To see what devices are connected to the PCI bus, use the lspci
command:

The output of the lspci command can be helpful for identifying


devices that are not supported by the Linux kernel.

Lspci

Use the lspci command with the -k option to show devices along with the kernel driver and
modules used:
Attempt to list the USB connected devices:

lsusb

sysadmin@localhost:~$ lsusb
Bus 002 Device 003: ID 0624:0249 Avocent Corp. Virtual
Keyboard/Mouse
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 002: ID 0624:0248 Avocent Corp. Virtual Hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
sysadmin@localhost:~$

This is how you can get information on any USB memory sticks that you may want to mount, as
well as peripheral devices like mice and keyboards.

12.2.7 Step 7
For hardware to function, the Linux kernel usually loads a driver or module. Use the lsmod
command to view the currently loaded modules:
lsmod
12.2.8 Step 8
The system board of many computers contains what is known as BIOS, or a Basic Input and Output
System. System Management BIOS, or SMBIOS, is a standard defining the data structures and how
to communicate information about computer hardware.
The fdisk command is useful for identifying and manipulating disk storage resources on a
system. Since it can be used to create, format and delete partitions, as well as getting for
information, it should be used with care in administrator mode to avoid data loss. The fdisk
command can be used in two ways: interactively and non-interactively.
When the -l option is used with fdisk, then the command will non-interactively list block
devices, which includes disks (hard drives) and logical volumes.
Without the -l option, the fdisk command enters an interactive mode that is typically used to
modify partitions on a disk device.

12.2.9 Step 9
Execute the fdisk command to list the disk devices. The -l option lists the partition tables for the
specified devices and then exits. If no devices are given, those mentioned in
/proc/partitions (if that file exists) are used:
fdisk -l

sysadmin@localhost:~$ fdisk -l
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

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

13.1 Introduction

Cuando la mayoría de las personas se refieren a Linux, realmente se refieren a una combinación de
software llamada GNU / Linux, que define el sistema operativo. GNU es el software gratuito que
rodea el núcleo y proporciona equivalentes de código abierto de muchos comandos comunes de
UNIX. La parte de Linux de esta combinación es el kernel de Linux, que es el núcleo del sistema
operativo. El kernel se carga en el momento del arranque y permanece ejecutándose para
administrar todos los aspectos del sistema en funcionamiento.

Una implementación del kernel de Linux incluye muchos subsistemas que forman parte del kernel y
otros que pueden cargarse de forma modular cuando sea necesario. Las funciones clave del núcleo
de Linux incluyen system call interface(interfaz de llamada del sistema), process
management(gestión de procesos), memory management (gestión de memoria), virtual filesystem
(sistemas de archivos virtuales), networking and device driver (redes y controladores de
dispositivos).

A través de un shell, el kernel acepta comandos del usuario y gestiona los procesos de esos
comandos al darles acceso a dispositivos como memoria, discos, interfaces de red, teclados, ratones,
monitores y más.

Un sistema Linux típico tiene miles de archivos. El estándar de jerarquía del sistema de archivos
proporciona una guía para distribuciones sobre cómo organizar estos archivos. Es importante
comprender el papel del kernel de Linux y cómo procesa y proporciona información sobre el
sistema en los pseudo sistemas de archivos /proc y /sys.

13.2 Processes
/proc : El núcleo proporciona acceso a información sobre procesos activos

/dev : Los dispositivos de hardware están disponibles a través de archivos especiales en este
directorio
/sys : Aqui se encuentra la información sobre los dispositivos de hardware de /dev

/proc

Los pseudo sistemas de archivos parecen ser archivos reales en el disco, pero solo existen en la
memoria. La mayoría de los sistemas de pseudo archivos como /proc están diseñados para parecer
un árbol jerárquico fuera de la raíz del sistema de directorios, archivos y subdirectorios, pero en
realidad solo existen en la memoria del sistema, y sólo parecen residir en el dispositivo de
almacenamiento que el sistema de archivos raíz tiene activo.

El directorio / proc no solo contiene información sobre los procesos en ejecución, como su nombre
lo sugiere, sino que también contiene información sobre el hardware del sistema y la configuración
actual del kernel.

El directorio /proc se lee y su información es utilizada por muchos comandos diferentes en el


sistema, incluidos, entre otros, top, free, mount, umount y muchos otros. Rara vez es necesario que
un usuario extraiga el directorio /proc directamente; es más fácil usar los comandos que utilizan su
información.

Vea un ejemplo de salida a continuación:


La salida muestra una variedad de directorios con nombre y numerados. Hay un directorio
numerado para cada proceso en ejecución en el sistema, donde el nombre del directorio coincide
con el ID del proceso (PID) para el proceso en ejecución.

Por ejemplo, los números 72 denotan PID 72, un programa en ejecución, que está representado por
un directorio del mismo nombre, que contiene muchos archivos y subdirectorios que describen ese
proceso en ejecución, su configuración, uso de memoria y muchos otros elementos.

En un sistema Linux en ejecución, siempre hay una ID de proceso o PID 1.

También hay varios archivos regulares en el directorio /proc que proporcionan información sobre el
núcleo en ejecución:

/proc
File Contents
/proc/cmdline Información que se pasó al núcleo cuando se inició por primera vez, como
parámetros de línea de comandos e instrucciones especiales
/proc/meminfo Información sobre el uso de memoria por parte del núcleo
/proc/modules Una lista de módulos cargados actualmente en el kernel para agregar
funcionalidad adicional

Si bien la mayoría de los "archivos" debajo del directorio /proc no pueden ser modificados, incluso
por el usuario root, los "archivos" debajo del directorio /proc/sys sí pueden ser modificados por el
usuario root. La modificación de estos archivos cambia el comportamiento del kernel de Linux.

La modificación directa de estos archivos solo causa cambios temporales en el núcleo. Para realizar
cambios permanentes (persistentes incluso después de reiniciar), se pueden agregar entradas a la
sección correspondiente del archivo /etc/sysctl.conf.
Por ejemplo, el directorio /proc/sys/net/ipv4 contiene un archivo llamado icmp_echo_ignore_all.
Si ese archivo contiene un carácter cero 0, como lo hace normalmente, entonces el sistema
responderá a las solicitudes de icmp. Si ese archivo contiene un carácter de 1, el sistema no
responderá a las solicitudes de icmp:

sysadmin@localhost:~$ cat /proc/sys/net/ipv4/icmp_echo_ignore_all


0
sysadmin@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

--- localhost.localdomain ping statistics ---


1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.026/0.026/0.026/0.000 ms
sysadmin@localhost:~$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
sysadmin@localhost:~$ ping -c1 localhost
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.

--- localhost.localdomain ping statistics ---


1 packets transmitted, 0 received, 100% packet loss, time 10000ms

13.2.1 Process Hierarchy


Cuando el núcleo termina de cargarse durante el procedimiento boot (de arranque), inicia el proceso
init y le asigna un PID de 1. Este proceso luego inicia otros procesos del sistema, y a cada proceso
se le asigna un PID en orden secuencial.

En un sistema V-based, el proceso init sería el programa /sbin/init. En un sistema basado en


systemd, el archivo /bin/systemd generalmente se ejecuta, pero casi siempre es un link al ejecutable
/lib/system/systemd. Independientemente del tipo de proceso de inicio del sistema que se esté
ejecutando, la información sobre el proceso se puede encontrar en el directorio /proc/1.

Como cualquiera de los procesos init inicia otros procesos, ellos, a su vez, pueden iniciar procesos,
que pueden iniciar otros procesos, una y otra vez. Cuando un proceso inicia otro proceso, el proceso
que realiza el inicio se llama proceso parent (padre) y el proceso que se inicia se llama proceso
child (hijo). Al visualizar procesos, el PID primario se etiqueta como PPID.

Cuando el sistema ha estado funcionando durante mucho tiempo, puede alcanzar el valor PID
máximo, que se puede ver y configurar a través del archivo /proc/sys/kernel/pid_max. Una vez que
se ha utilizado el PID más grande, el sistema "rolls over" (se da la vuelta) y continúa sin problemas
al asignar valores de PID que están disponibles en la parte inferior del rango. Los procesos se
pueden "mapped" (mapear) en un árbol genealógico de acoplamientos de padres e hijos. Si desea
ver este árbol, el comando pstree lo muestra:

sysadmin@localhost:~$ pstree
init-+-cron
‌​ 
|-login---bash---pstree
|-named---18*[{named}]
|-rsyslogd---2*[{rsyslogd}]
`-sshd

Si examinara la relación de los procesos padre e hijo utilizando la salida del comando anterior,
podría describirse de la siguiente manera:

init es el padre de inicio de login


login sesión es hijo de init

login es el padre de bash


bash es el hijo de inicio de sesión

bash es el padre de pstree


pstree es el hijo de bash

13.2.2 Viewing Process Snapshot


Otra forma de ver los procesos es con el comando ps. Por defecto, el comando ps solo muestra los
procesos actuales que se ejecutan en el shell actual. Irónicamente, aunque intente obtener
información sobre los procesos, el comando ps se incluye en la salida:

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

Si ejecuta ps con la opción --forest, entonces, similar al comando pstree, muestra líneas que indican
la relación 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
Para poder ver todos los procesos en el sistema, ejecute el comando ps aux o el comando ps -ef:

sysadmin@localhost:~$ ps aux | head


USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 17872 2892 ? Ss 08:06 0:00 /sbin?? /init
syslog 17 0.0 0.0 175744 2768 ? Sl 08:06 0:00 /usr/sbin/rsyslogd -c5
root 21 0.0 0.0 19124 2092 ? Ss 08:06 0:00 /usr/sbin/cron
root 23 0.0 0.0 50048 3460 ? Ss 08:06 0:00 /usr/sbin/sshd
bind 39 0.0 0.0 385988 19888 ? Ssl 08:06 0:00 /usr/sbin/named -u bind
root 48 0.0 0.0 54464 2680 ? S 08:06 0:00 /bin/login -f
sysadmin 60 0.0 0.0 18088 3260 ? S 08:06 0:00 -bash
sysadmin 122 0.0 0.0 15288 2164 ? R+ 16:26 0:00 ps aux
sysadmin 123 0.0 0.0 18088 496 ? D+ 16:26 0:00 -bash

sysadmin@localhost:~$ ps -ef | head


UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:06 ? 00:00:00 /sbin?? /init
syslog 17 1 0 08:06 ? 00:00:00 /usr/sbin/rsyslogd -c5
root 21 1 0 08:06 ? 00:00:00 /usr/sbin/cron
root 23 1 0 08:06 ? 00:00:00 /usr/sbin/sshd
bind 39 1 0 08:06 ? 00:00:00 /usr/sbin/named -u bind
root 48 1 0 08:06 ? 00:00:00 /bin/login -f
sysadmin 60 48 0 08:06 ? 00:00:00 -bash
sysadmin 124 60 0 16:46 ? 00:00:00 ps -ef
sysadmin 125 60 0 16:46 ? 00:00:00 head

El resultado de todos los procesos que se ejecutan en un sistema puede ser abrumador. En los
ejemplos anteriores, la salida del comando ps fue filtrada por el comando head, por lo que solo se
mostraron los primeros diez procesos. Si no filtra la salida del comando ps, es probable que tenga
que desplazarse por cientos de procesos para encontrar lo que podría interesarle.
Una forma común de reducir el número de líneas de salida que el usuario podría tener que ordenar
es usar el comando grep para filtrar las líneas de visualización de salida que coinciden con una
palabra clave, como el nombre de un proceso. Por ejemplo, para ver solo información sobre el
proceso de Firefox, ejecute un comando como:

sysadmin@localhost:~$ ps -e | grep firefox


6090 pts/0 00:00:07 firefox
Enviar la salida a un pager como el comando less también puede hacer que la salida del comando
ps sea más manejable.

Un administrador puede estar más preocupado por los procesos de otro usuario. Hay varios estilos
de opciones que admite el comando ps, lo que resulta en diferentes formas de ver los procesos de un
usuario individual. Para usar la opción tradicional de UNIX para ver los procesos de un usuario
específico, use la opción -u:

sysadmin@localhost:~$ ps -u root
PID TTY TIME CMD
1? 00:00:00 init
13 ? 00:00:00 cron
15 ? 00:00:00 sshd
43 ? 00:00:00 login

13.2.3 Viewing Processes in Real Time

Mientras que el comando ps proporciona una instantánea de los procesos que se ejecutan en el
instante en que se ejecuta el comando, el comando top tiene una interfaz dinámica basada en
pantalla que actualiza regularmente la salida de los procesos en ejecución. El comando top se
ejecuta de la siguiente manera:

sysadmin@localhost:~$ top

Por defecto, la salida del comando top se ordena por el porcentaje de tiempo de CPU que cada
proceso está usando actualmente, con los valores más altos enumerados primero, lo que significa
que procesos más intensivos en CPU se enumeran primero:
top - 00:26:56 up 28 days, 20:53, 1 user, load average: 0.11, 0.15, 0.17
Tasks: 8 total, 1 running, 7 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 13201464+total, 76979904 free, 47522152 used, 7512580 buff/cache
KiB Swap: 13419622+total, 13415368+free, 42544 used. 83867456 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND


1 root 20 0 18376 3036 2764 S 0.0 0.0 0:00.12 init
9 syslog 20 0 191328 5648 3100 S 0.0 0.0 0:00.04 rsyslogd
15 root 20 0 72296 3228 2484 S 0.0 0.0 0:00.00 sshd
24 bind 20 0 878888 39324 7148 S 0.0 0.0 0:02.72 named
43 root 20 0 78636 3612 3060 S 0.0 0.0 0:00.00 login
56 sysadmin 20 0 18508 3440 3040 S 0.0 0.0 0:00.00 bash
72 sysadmin 20 0 36600 3132 2696 R 0.0 0.0 0:00.03 top

Hay una gran cantidad de comandos interactivos que se pueden ejecutar desde el programa top en
ejecución. Use la tecla H para ver una lista completa.

Una de las ventajas del comando top es que se puede dejar en ejecución para estar al tanto de los
procesos con fines de monitoreo. Si un proceso comienza a dominar, o se escapa con el sistema,
aparecerá de manera predeterminada en la parte superior de la lista presentada por el comando top.
Un administrador que ejecuta el comando top puede realizar una de dos acciones:

top
key Action
K Terminate the runaway process. (terminar proceso fuera de control)
R Adjust the priority of the process. (ajustar la prioridad del proceso)

Al presionar la tecla K mientras se ejecuta el comando top, se le solicitará al usuario que


proporcione el PID y luego un número de señal. El envío de la señal predeterminada solicita que el
proceso finalice, pero el envío de la señal número 9, la señal KILL, obliga al proceso a finalizar.

Al presionar la tecla R mientras se ejecuta el comando top, se le solicitará al usuario que renice el
proceso y, a continuación, un valor de calidad. Los valores de prioridad pueden variar de -20 a 19 y
afectar la prioridad. Solo el usuario root puede usar un valor de calidad que sea un número menor
que el actual, o un valor de prioridad negativo, lo que hace que el proceso se ejecute con mayor
prioridad. Cualquier usuario puede proporcionar un valor de prioridad que sea más alto que el valor
de similitud actual, lo que hace que el proceso se ejecute con una prioridad reducida.
Otra ventaja del comando top es que puede proporcionar una representación general de qué tan
ocupado está el sistema actualmente y la tendencia a lo largo del tiempo.

Los promedios de carga que se muestran en la primera línea de salida del comando top indican cuán
ocupado ha estado el sistema durante los últimos cinco y quince minutos. Esta información también
se puede ver ejecutando el comando uptime o directamente mostrando el contenido del archivo
/proc/loadavg:

To exit the top program and return to the prompt, type q.


sysadmin@localhost:~$ cat /proc/loadavg
0.12 0.46 0.25 1/254 3052

Load Average:

Los primeros tres números en este archivo indican el promedio de carga en los últimos intervalos de
cinco y quince minutos.

Nummber of processes:

El cuarto valor es una fracción que muestra el número de procesos que actualmente ejecutan código
en la CPU 1 y el número total de procesos 254.

Last PID:

El quinto valor es el último valor PID que ejecutó el código en la CPU.

El número informado como promedio de carga es proporcional al número de núcleos de CPU que
pueden ejecutar procesos. En una CPU de un solo núcleo, un valor de uno (1) significaría que el
sistema está completamente cargado. En una CPU de cuatro núcleos, un valor de 1 significaría que
el sistema solo tiene 1/4 o 25% de carga.

Otra razón por la que a los administradores les gusta mantener el comando top en ejecución es la
capacidad de monitorear el uso de la memoria en tiempo real. Tanto el comando top como el
comando free muestran estadísticas de cómo se usa la memoria general.

El comando top también puede mostrar el porcentaje de memoria utilizado por cada proceso, por lo
que se puede identificar rápidamente un proceso que consume una cantidad excesiva de memoria.

13.3 Memory

La memoria en un sistema Linux moderno es gobernada y administrada por el kernel. La memoria


de hardware en el sistema es compartida por todos los procesos en el sistema, a través de un método
llamado virtual addressing (direccionamiento virtual). La memoria física puede ser referenciada
por una serie de procesos, cualquiera de los cuales puede pensar que son capaces de direccionar más
memoria de la que realmente pueden. El direccionamiento virtual permite que muchos procesos
accedan a la misma memoria sin conflictos ni bloqueos. Lo hace mediante la asignación de ciertas
áreas de un disco duro físico (o virtual) para su uso en lugar de la RAM física. La memoria se
divide en bloques de unidades de igual tamaño que se pueden abordar como cualquier otro recurso
en el sistema. ¡El sistema no solo puede acceder a la memoria desde las direcciones del sistema
local, sino que también puede acceder a la memoria que se encuentra en otro lugar, como en una
computadora diferente, un dispositivo virtual o incluso en un volumen que se encuentra físicamente
en otro continente!

El espacio del kernel es donde se almacena y ejecuta el código del kernel. Esto generalmente se
encuentra en un rango "protegido" de direcciones de memoria y permanece aislado de otros
procesos con privilegios más bajos. El espacio de usuario, por otro lado, está disponible para
usuarios y programas. Se comunican con el Kernel a través de API de "system call " que actúan
como intermediarios entre los programas regulares y el Kernel. Este sistema de separación de
programas potencialmente inestables o maliciosos del trabajo crítico del Kernel es lo que les da a
los sistemas Linux la estabilidad y la resistencia en la que confían los desarrolladores de
aplicaciones.

13.3.1 Viewing Memory

Ejecutar el comando free sin ninguna opción proporciona una instantánea de la memoria que se está
utilizando en ese momento.

sysadmin@localhost:~free
total used free shared buffers cached
Mem: 32953528 26171772 6781756 0 4136 22660364
-/+ buffers/cache: 3507272 29446256
Swap: 0 0 0

Si desea monitorear el uso de la memoria a lo largo del tiempo con el comando free, puede
ejecutarlo con la opción -s (con qué frecuencia actualizar) y especificar esa cantidad de segundos.
Por ejemplo, ejecutar el siguiente comando free actualizaría la salida cada diez segundos:

sysadmin@localhost:~free -s 10
total used free shared buff/cache available
Mem: 132014640 47304084 77189512 3008 7521044 84085528
Swap: 134196220 42544 134153676

total used free shared buff/cache available


Mem: 132014640 47302928 77190668 3008 7521044 84086684
Swap: 134196220 42544 134153676
Para facilitar la interpretación de lo que está generando el comando free, las opciones -m o -g
pueden ser útiles al mostrar la salida en megabytes o gigabytes, respectivamente. Sin estas
opciones, la salida se muestra en bytes:


Descriptive Header:

total used free shared buffers cached


Mem: 32953528 26171772 6781756 0 4136 22660364
-/+ buffers/cache: 3507272 29446256
Swap: 0 0 0

Physical Memory Statistics:

total used free shared buffers cached


Mem:
Mem: 32953528 26171772
32953528 26171772 6781756
6781756 00 4136 22660364
4136 22660364
-/+ buffers/cache: 3507272 29446256
Swap: 0 0 0

Memory Adjustment:

La tercera línea representa la cantidad de memoria física después de ajustar esos valores al no tener
en cuenta ninguna memoria que esté usando el kernel para buffers y cachés. Técnicamente, esta
memoria "usada" podría "recuperarse" si es necesario:

total used free shared buffers cached


Mem: 32953528 26171772 6781756 0 4136 22660364
-/+ buffers/cache: 3507272 29446256
Swap: 0 0 0
-/+ buffers/cache: 3507272 29446256

Swap Memory:

La cuarta línea de salida se refiere a la memoria swap, también conocida como memoria virtual.
Este es el espacio en el disco duro que se utiliza como memoria física cuando la cantidad de
memoria física es baja. Efectivamente, esto hace que parezca que el sistema tiene más memoria que
la que tiene, pero el uso del espacio swap también puede ralentizar el sistema:

total used free shared buffers cached


Mem: 32953528 26171772 6781756 0 4136 22660364
-/+ buffers/cache: 3507272 29446256
Swap: 0 0 0
Swap: 0 0 0

Si la cantidad de memoria y swap disponible es muy baja, entonces el sistema comenzará a finalizar
automáticamente los procesos, lo que hace que sea crítico monitorear el uso de la memoria del
sistema. Un administrador que advierte que el sistema tiene poca memoria libre puede usar top o
kill para finalizar los procesos de su propia elección, en lugar de dejar que el sistema elija

13.4 Log Files

A medida que el núcleo y varios procesos se ejecutan en el sistema, producen resultados que
describen cómo se están ejecutando. Parte de esta salida se muestra como salida estándar y error en
la ventana de terminal donde se ejecutó el proceso, aunque algunos de estos datos no se envían a la
pantalla. En cambio, está escrito en varios archivos. Esta información se denomina log data (datos
de registro) o log messages (mensajes de registro)

Los archivos de log son útiles por muchas razones; ayudan a solucionar problemas y determinan si
se ha intentado o no un acceso no autorizado.
Algunos procesos pueden registrar sus propios datos en estos archivos, otros procesos dependen de
un proceso separado (un daemon demonio) para manejar estos archivos de datos de log.
Syslog es el término que se usa de forma casi genérica para describir el registro en sistemas Linux,
ya que se ha implementado durante bastante tiempo. En algunos casos, cuando un autor dice que
syslog lo que realmente quieren decir es cualquier sistema de registro que se esté utilizando
actualmente en esta distribución.

Los daemon difieren de dos maneras principales en distribuciones recientes.


• syslogd y klog: Estos dos daemon trabajan juntos
• rsyslogd : Este único servicio combina las dos funciones y más en un sólo daemon. Este
método es el que está en distribuciones más recientes.

En distribuciones aún más recientes, las basadas en systemd, el daemon de logs se llama journald,
los logs están diseñados para permitir principalmente la salida de texto, pero también binaria. El
método estándar para ver registros basados en journald es usar el comando journalctl.
Independientemente del proceso de daemon que se utilice, los logs casi siempre se colocan en la
estructura de directorio /var/log. Aunque algunos de los nombres de archivo pueden variar, estos
son algunos de los archivos más comunes que se encuentran en este directorio:

log
File Contents
boot.log Los mensajes generados como servicios se inician durante el inicio del sistema.
cron Mensajes generados por el daemon crond para que los trabajos se ejecuten de
forma recurrente.
dmesg Mensajes generados por el núcleo durante el arranque del sistema.
maillog Mensajes producidos por el daemon de correo para mensajes de correo electrónico
enviados o recibidos.
messages Mensajes del kernel y otros procesos que no pertenecen a otra parte. A veces se
denomina syslog en lugar de mensajes después del daemon que escribe este
archivo.
secure Mensajes de procesos que requieren autorización o autenticación (como el proceso
de inicio de sesión).
journal Mensajes de la configuración predeterminada del systemd-journald.service; se
puede configurar en el archivo /etc/journald.conf entre otros lugares.
Xorg.0.log Mensajes del servidor X Windows (GUI).

Puede ver el contenido de logs utilizando dos métodos diferentes. Primero, como con la mayoría de
los otros archivos, puede usar el comando cat o el comando less para permitir la búsqueda, el
desplazamiento y otras opciones.
El segundo método es usar el comando journalctl en sistemas basados en systemd, principalmente
porque el archivo /var/log/journal ahora a menudo contiene información binaria y el uso de los
comandos cat o less puede producir un comportamiento de pantalla confuso a partir de códigos de
control y elementos binarios en el archivos de registro.

Los logs más antiguos se renombran y se reemplazan con logs más nuevos. Los nombres de archivo
que aparecen en la tabla anterior pueden tener un sufijo numérico o de fecha agregado: por ejemplo,
secure.0 o secure-20181103.
Cuando se rota un log, el sistema deja de escribir en el log y le agrega un sufijo. Luego se crea un
nuevo archivo con el nombre original y el proceso de registro continúa utilizando este nuevo
archivo.
Con la mayoría de los daemon modernos, se usa un sufijo de fecha. Entonces, al final de la semana
que finaliza el 3 de noviembre de 2018, el daemon de registro podría dejar de escribir en
/var/log/messages (o /var/log/journal), renombrar ese archivo /var/log/messages-20181103 y luego
comenzar a escribir en un nuevo archivo /var/log/messages.
Los archivos /var/log/btmp y /var/log/wtmp contienen binarios. Al usar el comando file, los
usuarios pueden verificar el tipo de contenido del archivo antes de verlo para asegurarse de que sea
seguro. El siguiente comando file clasifica /var/log/wtmp como datos, lo que generalmente significa
que el archivo es binario:

sysadmin@localhost:~file /var/log/wtmp
/var/log/wtmp: data

Para los archivos que contienen datos binarios, hay comandos que leerán los archivos, interpretarán
su contenido y luego generarán texto. Por ejemplo, los comandos lastb y last pueden usarse para
ver los archivos /var/log/btmp y /var/log/wtmp respectivamente.

13.5 Kernel Messages

El archivo /var/log/dmesg contiene los mensajes del kernel que se produjeron durante el inicio del
sistema. El archivo /var/log/messages contiene mensajes del kernel que se producen a medida que
se ejecuta el sistema, pero esos mensajes se mezclan con otros mensajes de daemons o procesos.
Aunque el kernel no tiene su propio archivo de log normalmente, se puede configurar uno
modificando el archivo /etc/syslog.conf o el archivo /etc/rsyslog.conf. Además, el comando dmesg
se puede usar para ver el kernel ring buffer (búfer de anillo del kernel) , que contiene una gran
cantidad de mensajes generados por el kernel. ‌En un sistema activo, o uno que experimenta muchos
errores de kernel, se puede exceder la capacidad de este búfer y se pueden perder algunos mensajes.
El tamaño de este búfer se establece en el momento en que se compila el kernel, por lo que no es
trivial cambiarlo. La ejecución del comando dmesg puede producir hasta 512 kilobytes de texto, por
lo que se recomienda filtrar el comando con un pipe a otro comando como less o grep. Por ejemplo,
si un usuario soluciona problemas con un dispositivo USB, entonces es útil buscar el texto USB con
el comando grep. La opción -i se usa para ignorar mayúsculas y minúsculas:

sysadmin@localhost:~dmesg | grep -i usb


usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
ohci_hcd 0000:00:06.0: new USB bus registered, assigned bus number 1
usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1

13.6 Filesystem Hierarchy Standard

Entre los estándares admitidos por la Fundación Linux se encuentra el Filesystem Hierarchy
Standard, Estándar de Jerarquía del Sistema de Archivos (FHS), que está alojado en la URL
http://www.pathname.com/fhs/.

Un estándar es un conjunto de reglas o pautas que se recomienda seguir. Sin embargo, estas pautas
ciertamente pueden romperse, ya sea por distribuciones completas o por administradores en
máquinas individuales.

El estándar FHS clasifica cada directorio del sistema de dos maneras:


• Un directorio puede clasificarse como compartible o no
• El directorio se coloca en una categoría de archivos estáticos (el contenido del archivo no
cambiará) o archivos variables (el contenido del archivo puede cambiar).

Para realizar estas clasificaciones, a menudo es necesario hacer referencia a subdirectorios debajo
del nivel superior de directorios. Por ejemplo, el directorio /var en sí no se puede clasificar 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.

Not Shareable Shareable


Variable /var/lock /var/mail
Static /etc /opt

El estándar FHS define cuatro jerarquías de directorios utilizados en la organización de los archivos
del sistema de archivos. La jerarquía de nivel superior o root sigue:
Filesystem Hierarchy Standar
Directory Contents
/ La base de la estructura o raíz del sistema de archivos. Este directorio unifica
todos los directorios independiente de si son locales, extraibles o compartidos.
/bin Binarios esenciales como los comandos ls, cp y rm, y ser parte del sistema de
archivos raíz
/boot Archivos necesarios para iniciar el sistema, como el kernel de Linux y los
archivos de configuración asociados
/dev Archivos que representan dispositivos de hardware y otros archivos especiales,
como los archivos /dev/null y /dev/zero
/etc Archivos de configuración de host esenciales, como los archivos / etc / hosts o /
etc / passwd
/home Directorio home de usuario
/lib Bibliotecas esenciales para admitir los archivos ejecutables en los directorios
/bin y /sbin
/lib64 Bibliotecas esenciales construidas para una arquitectura específica. Por
ejemplo, el directorio / lib64 para procesadores compatibles con AMD / Intel
x86 de 64 bits
/media Punto de montaje para medios extraíbles montados automáticamente
/mnt Punto de montaje para montar temporalmente sistemas de archivos
manualmente
/opt Ubicación opcional de instalación de software de terceros
/proc Sistema de archivos virtual para que el núcleo informe la información del
proceso, así como otra información
/root Directorio de inicio del usuario root
/sbin Binarios esenciales del sistema utilizados principalmente por el usuario root
/sys Sistema de archivos virtual para información sobre dispositivos de hardware
conectados al sistema
/srv Ubicación donde se pueden alojar servicios específicos del sitio
/tmp Directorio donde todos los usuarios pueden crear archivos temporales y se
supone que se borrará en el momento del arranque (pero a menudo no)
/usr Segunda jerarquía
Filesystem Hierarchy Standar
Archivos no esenciales para uso multiusuario
/usr/local Tercera jerarquía
Archivos de software que no se originan en la distribución
/var Cuarta jerarquía
Archivos que cambian con el tiempo
/var/cache Archivos utilizados para almacenar en caché los datos de la aplicación
/var/log La mayoría de los archivos de log
/var/lock Bloquear archivos para recursos compartidos
/var/spool Archivos en cola para imprimir y enviar por correo
/var/tmp Archivos temporales que se conservarán entre reinicios

Si bien el sistema de archivos raíz y su contenido se consideran esenciales o necesarios para iniciar
el sistema, los directorios /var, /usr y /usr/local se consideran no esenciales para el proceso de inicio.
Como resultado, el sistema de archivos raíz y sus directorios pueden ser los únicos disponibles en
ciertas situaciones, como el arranque en modo de usuario único, un entorno diseñado para
solucionar problemas del sistema.
El directorio /usr está destinado a contener software para que lo usen varios usuarios. El directorio /
usr a veces se comparte a través de la red y se monta como de solo lectura.
La jerarquía /usr/local es para la instalación de software que no se origina con la distribución. A
menudo, este directorio se utiliza para el software que se compila a partir del código fuente.

13.6.1 Organization Within the Filesystem Hierarchy

Un usuario sólo puede crear archivos en su directorio de inicio, el directorio /tmp y el directorio
/var/tmp.
Los directorios binarios contienen los programas que los usuarios y administradores ejecutan para
iniciar procesos o aplicaciones que se ejecutan en el sistema.
Los directorios binarios que están destinados a ser utilizados por usuarios sin privilegios incluyen:
• /bin
• /usr/bin
• /usr/local/bin

A veces, el software de terceros también almacena sus archivos ejecutables en directorios como:
• /usr/local/application/bin
• /opt/application/bin

Además, no es inusual que cada usuario tenga su propio directorio bin ubicado en su directorio de
inicio; por ejemplo, /home/bob/bin.

Root-Restricted Binaries
Por otro lado, los directorios sbin están destinados principalmente para ser utilizados por el
administrador del sistema (el usuario root). Estos generalmente incluyen:
• /sbin
• /usr/sbin
• /usr/local/sbin

Algunas aplicaciones administrativas de terceros también podrían usar directorios como:


• /usr/local/application/sbin
• /opt/application/sbin

Dependiendo de la distribución, la variable PATH puede no contener todos los directorios bin y sbin
posibles. Para ejecutar un comando en uno de estos directorios, el directorio debe incluirse en la
lista de variables PATH, o el usuario debe especificar la ruta al comando.

Software Application Directories


Las aplicaciones en Linux pueden tener sus archivos en múltiples directorios distribuidos por todo
el sistema de archivos de Linux. Para distribuciones derivadas de Debian, puede ejecutar el
comando dpkg -L packagename para obtener la lista de ubicaciones de archivos. En las
distribuciones derivadas de Red Hat, puede ejecutar el comando rpm -ql packagename para la lista
de ubicaciones de los archivos que pertenecen a esa aplicación.
Los archivos binarios del programa ejecutable pueden ir al directorio /usr/bin si están incluidos en
el sistema operativo, o pueden ir a los directorios /usr/local/bin o /pt/application/bin si provienen de
un tercero.

Los datos de aplicación pueden ser almacenados en los siguientes directorios:


• /usr/share
• /usr/lib
• opt/application
• /var/lib

El archivo relacionado con la documentación puede almacenarse en uno de los siguientes


subdirectorios:
• /usr/share/doc
• /usr/share/man
• usr/share/info

Es muy probable que los archivos de configuración global para una aplicación se almacenen en un
subdirectorio bajo el directorio /etc, mientras que los archivos de configuración personalizados
(específicos para un usuario) para la aplicación probablemente estén en un subdirectorio oculto del
directorio de home del usuario.

Library Directories
Las bibliotecas son archivos que contienen código que se comparte entre múltiples programas. La
mayoría de los nombres de archivos de la biblioteca terminan en una extensión de archivo .so, que
significa shared object (objeto compartido).
Pueden estar presentes varias versiones de una biblioteca porque el código puede ser diferente
dentro de cada archivo, aunque puede realizar funciones similares a otras versiones de la biblioteca.
Una de las razones por las que el código puede ser diferente, a pesar de que puede hacer lo mismo
que otro archivo de biblioteca, es que está compilado para ejecutarse en un tipo diferente de
procesador

Por ejemplo, es típico que los sistemas que usan código diseñado para procesadores de tipo Intel /
AMD de 64 bits tengan tanto bibliotecas de 32 bits como bibliotecas de 64 bits.

Las bibliotecas que admiten los programas binarios esenciales que se encuentran en los directorios /
bin y / sbin generalmente se encuentran en /lib o /lib64.

Para admitir los archivos ejecutables /usr/bin y /usr/sbin, generalmente se usan los directorios de
biblioteca /usr/lib y /usr/lib64.
Para admitir aplicaciones que no se distribuyen con el sistema operativo, se utilizan con frecuencia
los directorios de la biblioteca /usr/local/lib y /opt/application/lib.

Variable Data Directories

El directorio /var y muchos de subdirectorios pueden contener datos que cambian frecuentemente.
Si su sistema se usa para correo electrónico, entonces /var/mail o /var/spool/mail se usa
normalmente para almacenar los datos de correo electrónico de los usuarios. Si está imprimiendo
desde su sistema, el directorio /var/spool/cups se usa para almacenar los trabajos de impresión
temporalmente.

Dependiendo de qué eventos se registren y cuánta actividad ocurra, el sistema determina qué tan
grande se vuelve su archivo de log. En un sistema ocupado, podría haber una cantidad considerable
de datos en los archivos logs. Estos archivos se almacenan en el directorio /var/log.

Si bien los archivos de log pueden ser útiles para solucionar problemas, pueden causar problemas.
Una preocupación importante para todos estos directorios es que pueden llenar el espacio en disco
rápidamente en un sistema activo. Si el directorio /var no es una partición separada, entonces el
sistema de archivos raíz podría llenarse y hacer que el sistema se bloquee.

Lab 13

13.2 The kernel and /proc

El directorio /proc contiene un subdirectorio para cada proceso en ejecución en el sistema.


Programas como ps y top leen la información sobre la ejecución de procesos desde estos
directorios. El directorio /proc también contiene información sobre el sistema operativo y su
hardware en archivos como /proc/cpuinfo, /proc/meminfo y /proc/devices.
El subdirectorio /proc/sys contiene pseudo archivos que pueden usarse para alterar la configuración
del núcleo en ejecución. Como estos archivos no son archivos "reales", no se debe usar un editor
para cambiarlos; en su lugar, debe usar el comando echo o sysctl para sobrescribir el contenido de
estos archivos. Para visualizar estos archivos utilice el comando cat o sysctl.
Para cambios de configuración permanentes, el kernel usa el archivo /etc/sysctl.conf. Normalmente,
el kernel utiliza este archivo para realizar cambios en los archivos /proc cuando se inicia el sistema.
Recuerde que los directorios que tienen números para nombres representan procesos en ejecución
en el sistema. El primer proceso es siempre /sbin/init, por lo que el directorio /proc/1 contendrá
archivos con información sobre el proceso de inicio en ejecución.
Use cat y ps para ver información sobre el proceso / sbin / init (Process IDentifier (PID) de 1):
cat /proc/1/cmdline; echo
ps -p 1

Vea el archivo /proc/cmdline para ver qué argumentos se pasaron al núcleo en el momento del
arranque:

sysadmin@localhost:~cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.4.0-72-generic root=UUID=8db73d4f-e220-4e04-a8cb-c609
2db5b507 ro cgroup_enable=memory swapaccount=1

Esta salida contiene toda la información, como parámetros de línea de comando, instrucciones
especiales, etc., que se pasó al núcleo cuando se inició por primera vez.

La salida del ping se redirige al archivo /dev/null (que comúnmente se conoce como bit bucket):
ping localhost > /dev/null (foregound, modo primer plano)

Observe que el terminal parece colgar con este comando. Esto se debe a ejecutar este comando en el
"foreground". Un proceso que se ejecuta en “primer plano” evitará que el usuario use el shell hasta
que se complete el proceso. Por otro lado, un proceso que se ejecuta en segundo plano permitirá al
usuario usar el shell y ejecutar otros comandos.

Para comenzar el mismo proceso en segundo plano, escriba:


ping localhost > /dev/null & (background, segundo plano)

Al agregar el signo & al final del comando, el proceso se inicia en segundo plano, lo que permite
al usuario mantener el control del terminal.
[1] 107

Esto significa que este proceso tiene un número de trabajo de 1 (como lo demuestra la salida de [1])
y un ID de proceso (PID) de 107. Cada terminal /shell tendrá números de trabajo únicos. El PID es
de todo el sistema; cada proceso tiene un número de identificación único.
Para ver qué comandos se están ejecutando en el terminal actual, escriba el siguiente comando:
sysadmin@localhost:~jobs
[1]+ Running ping localhost > /dev/null &

Una vez que haya verificado que se están ejecutando dos comandos ping, coloque el primer
comando en primer plano escribiendo lo siguiente:
sysadmin@localhost:~ fg %1
ping localhost > /dev/null
Observe que, una vez más, el comando ping ha tomado el control del terminal. Para suspender
(pausar) el proceso y recuperar el control del terminal, escriba Ctrl-Z:
fg → foreground
sysadmin@localhost:~ fg %1
ping localhost > /dev/null
^Z
[1]+ Stopped ping localhost > /dev/null

Para que este proceso continúe ejecutándose en segundo plano, ejecute el siguiente comando:
bg → background
sysadmin@localhost:~ bg %1
[1]+ ping localhost > /dev/null &

Usando el número de trabajo, detenga el último comando ping con el comando kill y verifique que
se haya detenido la ejecución del comando jobs:
sysadmin@localhost:~ jobs
[1] Running ping localhost > /dev/null &
[2]- Running ping localhost > /dev/null &
[3]+ Running ping localhost > /dev/null &
sysadmin@localhost:~ kill %3
[1] Running ping localhost > /dev/null &
[2]- Running ping localhost > /dev/null &
[3]+ Terminated ping localhost > /dev/null

Finalmente, puede detener todos los comandos ping con el comando killall. Después de ejecutar el
comando killall, espere unos momentos y luego ejecute el comando de trabajos para verificar que
todos los procesos se hayan detenido:
sysadmin@localhost:~ killall ping
[1]- Terminated ping localhost > /dev/null
[2]+ Terminated ping localhost > /dev/null
sysadmin@localhost:~ jobs
comando top:
La salida del comando top cambia cada 2 segundos. Cuando se pulsa la K dentro del comando top,
hacemos la peticion de cerrar un proceso. Después nos solicita el PID y posteriormente, por defecto
nos marca SIGTERM en 15 que es cerrar el proceso. Para saber mas de estas señales, consultar
man kill.
Elimine el proceso de ping restante como antes, excepto esta vez, en el indicador de señal Kill PID
con la señal [15]: indicador, use un valor de 9 en lugar de aceptar el valor predeterminado de 15.
La señal kill 9 o SIGKILL es una señal "contundente" que no puede ignorarse, a diferencia del
valor predeterminado de 15. Observe que todas las referencias al comando ping ahora se eliminan
desde la parte superior.

Comando sleep:
El comando sleep normalmente se usa para pausar un programa (script de shell) durante un período
específico de tiempo. En este caso, se usa solo para proporcionar un comando que tardará mucho
tiempo en ejecutarse.
sysadmin@localhost:~ sleep 888888 &
[1] 134
sysadmin@localhost:~ sleep 888888 &
2] 135

sysadmin@localhost:~ jobs
[1]- Running sleep 888888 &
[2]+ Running sleep 888888 &

Ahora, use el comando kill para detener la primera instancia del comando sleep escribiendo lo
siguiente (sustituya PID con la identificación del proceso de su primer comando sleep). Además,
ejecute jobs para verificar que el proceso se haya detenido:
sysadmin@localhost:~ ps
PID TTY TIME CMD
1? 00:00:00 init
51 ? 00:00:00 login
90 ? 00:00:00 su
91 ? 00:00:00 bash
134 ? 00:00:00 sleep
135 ? 00:00:00 sleep
136 ? 00:00:00 ps
sysadmin@localhost:~ kill 134
sysadmin@localhost:~ jobs
[1]- Terminated sleep 888888
[2]+ Running sleep 888888 &

Luego, use el comando pkill para terminar el comando sleep restante, usando el nombre del
programa en lugar del PID:
sysadmin@localhost:~ pkill -15 sleep
[1] - Terminated sleep 888888
[2]+ Terminated sleep 888888
comando ps:
Use el comando ps con la opción -o para especificar qué columnas generar.
sysadmin@localhost:~ ps -o pid,tty,time,%cpu,cmd
PID TT TIME %CPU CMD
1? 00:00:00 0.0 /bin/bash /init
51 ? 00:00:00 0.0 /bin/login -f
90 ? 00:00:00 0.0 su
91 ? 00:00:00 0.0 bash
138 ? 00:00:00 0.0 ping localhost
141 ? 00:00:00 0.0 ps -o pid,tty,time,%cpu,cmd

Comando sort:
Use la opción --sort para especificar por qué columna (s) ordenar. Por defecto, una columna
especificada para ordenar estará en orden ascendente, esto se puede forzar colocando un símbolo
más + delante del nombre de la columna. Para especificar un orden descendente, use el símbolo
menos delante del nombre de la columna.
Ordenar la salida de ps por% mem:
sysadmin@localhost:~ ps -o pid,tty,time,%cpu,cmd –sort %mem
PID TT TIME %CPU CMD
142 ? 00:00:00 0.0 ps -o pid,tty,time,%cpu,cmd --sort %mem
138 ? 00:00:00 0.0 ping localhost
1 ? 00:00:00 0.0 /bin/bash /init
90 ? 00:00:00 0.0 su
91 ? 00:00:00 0.0 bash
51 ? 00:00:00 0.0 /bin/login -f

Si bien el comando ps puede mostrar el porcentaje de memoria que utiliza un proceso, el comando
free mostrará el uso general de la memoria del sistema.

Logs:
Hay dos daemon que manejan mensajes logs: el daemon syslogd y el daemon klogd. Por lo
general, no necesita preocuparse por klogd; solo maneja los mensajes de registro del kernel y envía
su información de registro al daemon syslogd.
Los mensajes generados por el kernel en el momento del arranque se almacenan en el archivo
/var/log/dmesg. El comando dmesg permite ver los mensajes actuales del kernel, así como también
controlar si esos mensajes aparecerán en una ventana de consola de terminal.

El archivo de registro principal en el que syslogd escribe es /var/log/messages.


Además del registro realizado por syslogd, muchos otros procesos realizan su propio registro.
Algunos ejemplos de procesos que realizan su propio registro incluyen el servidor web Apache (el
archivo de registro reside en el directorio /var/log/httpd), el sistema de impresión Common Unix
(/var/log/cups) y el daemon auditado (/var/log/audit)

Cada archivo de registro representa un servicio o característica. Por ejemplo, el archivo auth.log
muestra información sobre la autorización o autenticación, como los intentos de inicio de sesión del
usuario. Los nuevos datos se almacenan en la parte inferior del archivo.
ssh localhost
{At the first prompt, type yes}
{At the second prompt, type abc}
{At the third prompt, type abc}
{At the fourth prompt, type abc}
tail -5 /var/log/auth.log

14.4 IP Addresses
IPv6 tiene muchas otras características avanzadas que abordan algunas de las limitaciones de IPv4,
incluida una mejor velocidad, una administración de paquetes más avanzada y un transporte de
datos más eficiente.
Las dos razones de porque continùa el mundo funcionando con IPv4:
• NAT: la traducción de direcciones de red (NAT) un grupo de hosts se coloca en una red
privada con un enrutador y con una dirección IP compartida entre hosts.
• Porting: Porting es intercambio de una tecnología sobre otra. IPv6 tiene muchas
características nuevas excelentes, pero todos los hosts deben poder utilizar estas
características. Hacer que todos en Internet (o incluso solo algunos) realicen estos cambios
plantea un desafío.

1. 14.5.1.1 Primary IPv4 Configuration File


El archivo de configuración principal para una interfaz de red IPv4 es el archivo
/etc/sysconfig/network-scripts/ifcfg-eth0. A continuación se muestra cómo se ve este archivo
cuando se configura para una dirección IP estática:
sysadmin@localhost:~ cat /etc/sysconfig/network-script/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO=none
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE="Ethernet"
UUID="98cf38bf-d91c-49b3-bb1b-f48ae7f2d3b5"
DEFROUTE=yes
IPV4 _FAILURE_FATAL=yes
IPV6INOT=no
NAME="System eth0"
IPADDR=192.168.1.1
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.2
HWADDR=00:50:56:90:18:18
LAST_CONNECT=1376319928

Si el dispositivo se configurara para ser un cliente DHCP, el valor BOOTPROTO se establecería en


dhcp y los valores IPADDR, GATEWAY y DNS1 no se establecerían.
14.5.1.2 Primary IPv6 Configuration File

En un sistema CentOS, el archivo de configuración primario de IPv6 es el mismo archivo donde se


almacena la configuración de IPv4; el archivo /etc/sysconfig/network-scripts/ifcfg-eth0. Si desea
que su sistema tenga una dirección IPv6 estática, agregue lo siguiente al archivo de configuración:
IPV6INIT=yes
IPV6ADDR=<IPv6 IP Address>
IPV6_DEFAULTGW=<IPv6 IP Gateway Address>

Si se quiere que sea por DHCP IPv6


DHCPV6C=yes

También debe agregar la siguiente configuración al archivo /etc/sysconfig/network:


NETWORKING_IPV6=yes

Para realizar cambios en una interfaz de red estos son los pasos aunque hay más métodos:
• ifdown eth0 (Tirar la interfaz)

• realizar los cambios

• ifup eth0 (Levantar interfaz)

Otro método es reiniciar la red del sistema, que elimina todas las interfaces, vuelve a leer los
archivos de configuración relacionados y luego reinicia la red del sistema.
Asi es en un sistema CentOS:
sysadmin@localhost:~ service network restart
Shutting down interface eth0: Device state: 3 (disconnected)
[ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: Active connection state: activated
Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/1
[ OK ]
14.5.1.3 Domain Name System (DNS)

La dirección del servidor DNS se almacena en el archivo /etc/resolv.conf. Un archivo


/etc/resolv.conf típico se genera automáticamente y tiene el siguiente aspecto:
sysadmin@localhost:~ cat /etc/resolv.conf
nameserver 127.0.0.1

La configuración del servidor de nombres a menudo se establece en la dirección IP del servidor


DNS. El siguiente ejemplo utiliza el comando host, que funciona con DNS para asociar un nombre
de host con una dirección IP. Tenga en cuenta que el servidor de ejemplo está asociado con la
dirección IP 192.168.1.2 por el servidor DNS:
sysadmin@localhost:~ host example.com
example.com has address 192.168.1.2

También es común tener múltiples configuraciones de servidor de nombres, en el caso de que un


servidor DNS no responda.

14.5.1.4 Network Configuration Files

La resolución de nombres en un host Linux se logra mediante 3 archivos críticos:


• /etc/hosts : contiene una tabla de nombres de host para direcciones IP. Se puede usar para
complementar un servidor DNS.
• /etc/resolv.conf : Este archivo contiene las direcciones IP de los servidores de nombres que
el sistema debe consultar. También puede contener palabras clave y valores adicionales.
• etc/nsswitch.conf : Este archivo se puede usar para modificar dónde ocurren las búsquedas
de nombres de host. Contiene una entrada particular que describe en qué orden se consultan
las fuentes de resolución de nombres.

Juntos, describen la ubicación de la información del servicio de nombres, el orden en el que se


verifican los recursos y dónde ir para obtener esa información.
sysadmin@localhost:~ cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#

Output Omitted...

hosts: files dns

Output Omitted...

Primero se busca el archivo / etc / hosts, luego el servidor DNS: → hosts: files dns
Primero se buscaría el servidor DNS, luego los archivos locales: → hosts: dns files

Los comandos o programas en el sistema, como el navegador, solicitan una conexión con una
computadora remota por nombre DNS. Luego, el sistema consulta varios archivos en un orden
particular para intentar resolver ese nombre en una dirección IP utilizable.
1. Primero, se consulta el archivo /etc/nsswitch.conf: → hosts: files dns
Esta línea indica que el sistema debe consultar primero los archivos locales en un intento de
resolver los nombres de host, lo que significa que el archivo / etc / hosts se analizará para
que coincida con el nombre solicitado.
2. En segundo lugar, el sistema consultará el archivo /etc/hosts para intentar resolver el
nombre. Si el nombre coincide con una entrada en /etc/hosts, se resuelve.

No realizará una conmutación por error (o continuará) a la opción DNS, incluso si la


resolución es inexacta. Esto puede ocurrir si la entrada en /etc/hosts apunta a IP no asignada.

3. Tercero, si el archivo / etc / hosts local no da como resultado una coincidencia, el sistema
usará las entradas del servidor DNS configuradas contenidas en el archivo /etc/resolv.conf
para intentar resolver el nombre.

El archivo /etc/resolv.conf debe contener al menos dos entradas para servidores de nombres.
El sistema de resolución DNS utilizará el servidor de nombre para un intento de búsqueda
del nombre. Si eso no está disponible, o se alcanza un período de tiempo de espera, el
segundo servidor será consultado para la resolución del nombre. Si se encuentra una
coincidencia, se devuelve al sistema y se utiliza para iniciar una conexión y también se
coloca en la caché de DNS durante un período de tiempo configurable.
14.6.1 The ifconfig Command

El comando ifconfig representa la configuración de la interfaz y se utiliza para mostrar la


información de configuración de la red. El comando ifconfig también se puede usar para modificar
la configuración de red temporalmente.
Ifconfig se esta reemplazando por ip addr show. ip difiere de ifconfig en varias maneras
importantes, principalmente porque a través de su mayor funcionalidad y conjunto de opciones, casi
puede ser una ventanilla única para la configuración y el control de las redes. Estructura:
ip [OPTIONS] OBJECT COMMAND

Si bien ifconfig se limita principalmente a la modificación de los parámetros de red y muestra los
detalles de configuración de los componentes de la red, el comando ip se ramifica para realizar
parte del trabajo de varios otros comandos heredados, como route y arp.

Los comandos de Linux y Unix no suelen desaparecer cuando quedan obsoletos; permanecen como
un comando heredado, a veces durante muchos años, como la cantidad de scripts que dependen de
esos comandos y la cantidad de memoria. Es buena idea mantenerlos disponibles por razones de
compatibilidad.

Route:
Para ver una tabla que describe dónde se envían los paquetes de red, use el comando route:
sysadmin@localhost:~ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

La primera línea resaltada en el ejemplo anterior indica que cualquier paquete de red enviado a una
máquina en la red 192.168.1.X no se envía a una máquina de puerta de enlace (el * indica que no
hay puerta de enlace). La segunda línea resaltada indica que todos los demás paquetes de red se
envían al host con la dirección IP 192.168.1.1 (el enrutador).
Algunos usuarios prefieren mostrar esta información solo con datos numéricos, utilizando la opción
-n del comando route. Por ejemplo, mire lo siguiente y concéntrese en dónde la salida solía mostrar
el valor predeterminado:
sysadmin@localhost:~ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

El 0.0.0.0 se refiere a todas las otras máquinas, y es el mismo que el predeterminado.


El comando route se está volviendo obsoleto en algunas distribuciones de Linux (en desuso) y se
está reemplazando con una forma del comando ip, específicamente ip route show. Tenga en cuenta
que la misma información resaltada anteriormente también se puede encontrar con este comando:
sysadmin@localhost:~ ip route show
default via 192.168.1.254 dev eth0 proto static
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2

Comando ping:
Para limitar cuántos pings enviar, use la opción -c seguido de un número que indica cuántas
iteraciones desea:
ping -c 4 192.168.1.1

Muchos administradores usan el comando ping con un nombre de host, y si eso falla, use la
dirección IP para ver si la falla está en resolver el nombre de host del dispositivo. Usar el nombre de
host primero ahorra tiempo; Si el comando ping tiene éxito, hay una resolución de nombre adecuada
y la dirección IP también funciona correctamente.

14.6.5 The netstat Command

El comando netstat es una herramienta poderosa que proporciona una gran cantidad de información
de red. Se puede usar para mostrar información sobre las conexiones de red, así como para mostrar
la tabla de enrutamiento similar al comando de ruta.

Por ejemplo, para mostrar estadísticas sobre el tráfico de red, use la opción -i :
sysadmin@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 40 12 0 0 0 BMRU
lo 65536 0 18 0 00 18 0 0 0 LRU
Las estadísticas más importantes del resultado anterior son TX-OK y TX-ERR. Un alto porcentaje
de TX-ERR puede indicar un problema en la red, como demasiado tráfico de red.

Para usar el comando netstat para mostrar información de enrutamiento, use la opción -r:

sysadmin@localhost:~ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 * 255.255.255.0 U 00 0 eth0
default 192.168.1.1 0.0.0.0 UG 00 0 eth0

El comando netstat también se usa 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, puede iniciar sesión en un host desde otro
host utilizando un servicio llamado SSH. El servicio SSH tiene asignado el puerto # 22. Entonces, si
el puerto # 22 está abierto, entonces el servicio está disponible para otros hosts. Es importante tener
en cuenta que el host también necesita tener los servicios ejecutándose; Esto significa que el
servicio (en este caso, el daemon ssh) que permite que los usuarios remotos inicien sesión debe
iniciarse (que normalmente es, para la mayoría de las distribuciones de Linux).
Para ver una lista de todos los puertos abiertos actualmente, use el siguiente comando:
sysadmin@localhost:~ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.2:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN
tcp6 0 0 :::53 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:953 :::*

Como puede ver en la salida anterior, el puerto # 22 está escuchando, lo que significa que está
abierto.

En el ejemplo anterior, -t significa TCP (recupere este protocolo de este capítulo), -l significa
escuchar (qué puertos están escuchando) y -n significa mostrar números, no nombres.

A veces, mostrar los nombres puede ser más útil. Esto se puede lograr soltando la opción -n:

Si bien no se está desarrollando más el comando netstat, sigue siendo una excelente herramienta
para mostrar información de red. El objetivo es eventualmente reemplazar el comando netstat con
comandos como los comandos ss e ip
14.6.6 The ss Command

El comando ss está diseñado para mostrar estadísticas de socket y admite todos los tipos principales
de paquetes y sockets.
La razón principal por la que un usuario usaría el comando ss es para ver qué conexiones se
establecen actualmente entre su máquina local y las máquinas remotas, estadísticas.
sysadmin@localhost:~ ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 * 104741 * 104740
u_str ESTAB 0 0 /var/run/dbus/system_bus_socket 14623 * 14606
u_str ESTAB 0 0 /var/run/dbus/system_bus_socket 13582 * 13581
u_str ESTAB 0 0 /var/run/dbus/system_bus_socket 16243 * 16242
u_str ESTAB 0 0 * 16009 * 16010
u_str ESTAB 0 0 /var/run/dbus/system_bus_socket 10910 * 10909
u_str ESTAB 0 0 @/tmp/dbus-LoJW0hGFkV 15706 * 15705
u_str ESTAB 0 0 * 24997 * 24998
u_str ESTAB 0 0 * 16242 * 16243
u_str ESTAB 0 0 @/tmp/dbus-opsTQoGE 15471 * 15470

Netid El tipo de socket y el protocolo de transporte


State Conectado o desconectado, según el protocolo
Recv-Q Cantidad de datos en cola para procesar que se han recibido
Send-Q Cantidad de datos en cola para enviar a otro host
Local Address La dirección y el puerto de la porción de conexión del host local
Peer Address La dirección y el puerto de la parte de la conexión del host remoto
El formato de la salida del comando ss puede cambiar drásticamente, dadas las opciones
especificadas, como el uso de la opción -s, que muestra principalmente los tipos de sockets,
estadísticas sobre su existencia y números de paquetes reales enviados y recibidos a través de cada
tipo de socket, como se muestra a continuación:

sysadmin@localhost:~ ss -s
Total: 1000 (kernel 0)
TCP: 7 (estab 0, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total IP IPv6


* 0 - -
RAW 0 0 0
UDP 9 6 3
TCP 7 3 4
INET 16 9 7
FRAG 0 0 0
14.6.7 The dig Command

El comando dig, realiza consultas en el servidor DNS para determinar si la información necesaria
está disponible en el servidor.
En el siguiente ejemplo, el comando dig se usa para determinar la dirección IP del host
example.com:
sysadmin@localhost:~ dig example.com
; <<>> DiG 9.8.1-P1 <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45155
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; 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.

;; Query time: 0 msec


;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Dec 8 17:54:41 2015
;; MSG SIZE rcvd: 59

Tenga en cuenta que la respuesta incluyó la dirección IP 192.168.1.2, lo que significa que el
servidor DNS tiene la dirección IP para 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 solicitar otros
servidores DNS. Si ninguno de ellos tiene la información solicitada, aparece un mensaje de error:
sysadmin@localhost:~ dig sample.com
; <<>> DiG 9.8.1-P1 <<>> sample.com
;; global options: +cmd
;; connection timed out; no servers could be reached
14.6.8 The host Command

El comando host funciona con DNS para asociar un nombre de host con una dirección IP.
example.com está asociado con la dirección IP de 192.168.1.2:
sysadmin@localhost:~ host example.com
example.com has address 192.168.1.2

El comando de host también se puede usar en reversa si se conoce una dirección IP.
sysadmin@localhost:~ host 192.168.1.2
2.1.168.192.in-addr.arpa domain name pointer example.com.
2.1.168.192.in-addr.arpa domain name pointer cserver.example.com.

Existen otras opciones para consultar los diversos aspectos de un DNS, como un nombre canónico
(el nombre verdadero de una computadora) CNAME -alias:
sysadmin@localhost:~ host -t CNAME example.com
example.com has no CNAME record

Dado que muchos servidores DNS almacenan una copia de example.com, los registros SOA Start of
Authority indican el servidor primario para el dominio:
sysadmin@localhost:~ host -t SOA example.com
example.com has SOA record example.com. cserver.example.com. 2 604800 86400 2419200 604800

14.6.9 The ssh Command

Si solo proporciona un nombre de máquina o una dirección IP para iniciar sesión, el comando ssh
supone que desea iniciar sesión con el mismo nombre de usuario con el que está conectado
actualmente. Para usar un nombre de usuario diferente, use la sintaxis:
username@hostname

sysadmin@localhost:~ ssh bob@test


The authenticity of host ‘test (127.0.0.1)’ can’t be established.
RSA key fingerprint is c2:0d:ff:27:4c:f8:69:a9:c6:3e:13:da:2f:47:e4:c9.
Are you sure you want to continue connection (yes/no)? yes
Warning: Permanently added ‘test’ (RSA) to the list of known hosts.
bob@test’s password:
14.6.9.1 RSA Key Fingerprint

Al usar el comando ssh, el primer mensaje le pide que verifique la identidad de la máquina en la que
está iniciando sesión. En la mayoría de los casos, querrá responder que sí. Si bien puede consultar
con el administrador de la máquina remota para asegurarse de que la huella digital de la clave RSA
sea correcta, este no es el propósito de esta consulta. Está diseñado para futuros intentos de inicio de
sesión.

Después de responder que sí, la huella digital de la clave RSA de la máquina remota se almacena en
su sistema local. Cuando intente ssh a esta misma máquina en el futuro, la huella digital de la clave
RSA proporcionada por la máquina remota se compara con la copia almacenada en la máquina
local. Si coinciden, aparece la solicitud de nombre de usuario. Si no coinciden, aparece un error
como el siguiente:

sysadmin@localhost:~ ssh bob@test


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
c2:0d:ff:27:4c:f8:69:a9:c6:3e:13:da:2f:47:e4:c9.
Please contact your system administrator.
Add correct host key in /home/sysadmin/.ssh/known_hosts to get rid of this message.
Offending key in /home/sysadmin/.ssh/known_hosts:1
RSA host key for test has changed and you have requested strict checking.
Host key verification failed.

mEste error podría indicar que un host no autorizado ha reemplazado al host correcto. Consulte con
el administrador del sistema remoto. Si el sistema se reinstalara recientemente, tendría una nueva
clave RSA, y eso causaría este error.

En el caso de que este mensaje de error se deba a una reinstalación remota de la máquina, puede
eliminar el archivo ~ / .ssh / known_hosts de su sistema local (o simplemente eliminar la entrada de
esa máquina) e intentar conectarse nuevamente:
sysadmin@localhost:~ cat ~/.ssh/known_hosts
test ssh-rsa AAAAB3NzaC1yc2EAAAAmIwAAAQEAklOUpkDHrfHY17SbrmTIp/RZ0V4DTxgq9wzd+ohy0
t5FaiKoAfncM1Q8x3+2V0Ww71/eIFmb1zuUFljHYTprrX88XypNDvjYNby6vw/Pb0rwprz/Tn
mZAW3UX+PnTPI89ZPmNBLuxyrD2cE86Z/il8b+gw3r3+1nJotmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+ghw==
sysadmin@localhost:~ $ rm ~/.ssh/known_hosts
sysadmin@localhost:~ $ ssh bob@test
The authenticity of host ‘test (127.0.0.1)’ can’t be established.
RSA key fingerprint is c2:0d:ff:27:4c:f8:69:a9:c6:3e:13:da:2f:47:e4:c9.
Are you sure you want to continue connection (yes/no)? yes
Warning: Permanently added ‘test’ (RSA) to the list of known hosts.
bob@test’s password:
Last login: Fri Oct 4 16:14:39 CDT 2013 from localhost

Un nombre de dominio completo, fully-qualified domain name, (FQDN) incluye no solo el


nombre de host, sino también el dominio en el que está.
Use the dig command to resolve the IP address 192.168.1.2 to a hostname:
dig -x 192.168.1.2

The hostname can be found in the ANSWER SECTION of the output of the dig command:
;; ANSWER SECTION:
2.1.168.192.in-addr.arpa. 600 IN PTR 84a6444e-f044

A list of service names and associated port numbers can be found in the /etc/services file.

15.2 Administrative Accounts

Cada programa que se ejecuta como usuario root representa una amenaza mayor que un proceso que
se ejecuta como usuario estándar, ya que a esos programas se les permitiría hacer casi cualquier
cosa, mientras que los programas de usuario estándar están muy restringidos en lo que pueden
hacer. En Ubuntu la cuenta root esta deshabilitada, y los comandos root pueden ejecutarse con su.
Cuando inicia sesión en el sistema directamente como root para ejecutar comandos, todo lo
relacionado con su sesión se ejecuta como usuario root. Si usa el entorno gráfico, esto es
especialmente peligroso ya que el proceso de inicio de sesión gráfico se compone de muchos
ejecutables diferentes

15.2.1 Switching Users

El comando su le permite ejecutar un shell como un usuario diferente.


su [options] [username]

Al cambiar de usuario se recomienda utilizar la opción de shell de login, ya que el shell de inicio de
sesión configura completamente el nuevo shell con la configuración del nuevo usuario, asegurando
que los comandos ejecutados se ejecuten correctamente. Si se omite esta opción, el nuevo shell
cambia el UID pero no inicia sesión completamente en el usuario. La opción de shell de inicio de
sesión se puede especificar de tres maneras:
su -
su -l
su –login

Por defecto, si no se especifica un nombre de usuario, el comando su abre un nuevo shell como
usuario root. Los siguientes dos comandos son formas equivalentes de iniciar un shell como usuario
root:
su - root
su -

Después ejecutar cualquiera de estos comandos, el usuario debe proporcionar la contraseña del
usuario root para iniciar el nuevo shell.
sysadmin@localhost:~ $ su -
Password: netlab123
sysadmin@localhost:~ $ id
uid=0(root) gid=0(root) groups=0(root)
Después de usar el shell iniciado por el comando su para realizar las tareas administrativas
necesarias, regrese a su shell original (y cuenta de usuario original) usando el comando de salida.
sysadmin@localhost:~ $ exit
logout
sysadmin@localhost:~ $ id
uid=1001(sysadmin) gid=1001(sysadmin) groups=1001(sysadmin),4(adm),27(sudo)

15.2.2 Executing Privileged Commands

El comando sudo permite a los usuarios ejecutar comandos como otro usuario. Similar al comando
su, el usuario root se asume por defecto.
En las distribuciones que no permiten que el usuario root inicie sesión directamente o mediante el
comando su, el proceso de instalación configura automáticamente una cuenta de usuario para poder
usar el comando sudo para ejecutar comandos como si el usuario root los ejecutara. Por ejemplo, los
privilegios administrativos son necesarios para ver el archivo / etc / shadow:
sysadmin@localhost:~ $ head /etc/shadow
head: cannot open '/etc/shadow' for reading: Permission denied

Cuando se usa el comando sudo para ejecutar un comando como usuario root, el comando solicita la
propia contraseña del usuario, no la del usuario root. Esta característica de seguridad podría evitar el
acceso administrativo no autorizado si el usuario dejara su computadora desatendida. La solicitud
de contraseña no aparecerá nuevamente mientras el usuario continúe ejecutando comandos sudo con
menos de cinco minutos de diferencia.

El siguiente comando sudo ejecutaría el comando head del ejemplo anterior como usuario root.
Solicita la contraseña del usuario sysadmin:
sysadmin@localhost:~ $ sudo head /etc/shadow
[sudo] password for sysadmin: netlab123
root:$6$4Yga95H9$8HbxqsMEIBTZ0YomlMffYCV9VE1SQ4T2H3SHXw41M02SQtfAdDVE9mqGp2hr20q
daemon:*:16463:0:99999:7:::
bin:*:16463:0:99999:7:::
sys:*:16463:0:99999:7:::
sync:*:16463:0:99999:7:::
games:*:16463:0:99999:7:::
man:*:16463:0:99999:7:::
lp:*:16463:0:99999:7:::
mail:*:16463:0:99999:7:::
news:*:16463:0:99999:7:::
El uso del comando sudo para ejecutar un comando administrativo da como resultado una entrada
colocada en un archivo log. Cada entrada incluye el nombre del usuario que ejecutó el comando, el
comando que se ejecutó y la fecha y hora de ejecución.
Una gran ventaja de usar sudo para ejecutar comandos administrativos es que reduce el riesgo de
que un usuario ejecute accidentalmente un comando como root.

15.3 User Accounts

Hay varios archivos de texto en el directorio /etc que contienen los datos de la cuenta de los
usuarios y grupos definidos en el sistema. Por ejemplo, para ver si se ha definido una cuenta de
usuario específica en el sistema, el lugar para verificar es el archivo /etc/passwd.
sysadmin@localhost:~ $ tail -5 /etc/passwd
syslog:x:101:103::/home/syslog:/bin/false
bind:x:102:105::/var/cache/bind:/bin/false
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
operator:x:1000:37::/root:/bin/sh
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash

Name:
Sysadmin: El primer campo contiene el nombre del usuario. El sistema utiliza el ID
internamente.
Password Placeholder:
x: indica al sistema que la contraseña está en el archivo /etc/shadow.
User ID:
1001: A cada cuenta se le asigna un ID de usuario (UID). Los nombres de usuario no son
utilizados directamente por el sistema, que generalmente define la cuenta por el UID. Por ejemplo,
los archivos son propiedad de UID, no de nombres de usuario.
Primary Group ID:
1001: Este campo indica que el usuario es miembro de ese grupo, lo que significa que el
usuario tiene permisos especiales en cualquier archivo que sea propiedad de este grupo.
Comment:
System Administrator,,,,: Este campo puede contener cualquier información sobre el usuario,
incluido su nombre real u otra información útil.
Home Directory:

/home/sysadmin: Este campo define la ubicación del directorio home del usuario. Para los
usuarios habituales, esto normalmente sería /home/”username”.

Shell:

/bin/bash: Este campo indica la ubicación del shell de inicio de sesión del usuario. De manera
predeterminada, el usuario se coloca en este shell cada vez que inicia sesión en un entorno de línea
de comandos o abre una ventana de terminal.

Para verificar si un usuario específico ha sido definido en un sistema es buscar el archivo


/etc/passwd usando el comando grep. Para buscar la cuenta de user sysadmin:
sysadmin@localhost:~ $ grep sysadmin /etc/passwd
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash

15.3.1 Passwords

El archivo /etc/shadow contiene información de la cuenta relacionada con la contraseña del usuario.
Este archivo hay que verlo con root.

sysadmin@localhost:~ $ su -
Password :netlab123
sysadmin@localhost:~ $ tail -5 /etc/shadow
syslog:*:16874:0:99999:7:::
bind:*:16874:0:99999:7:::
sshd:*:16874:0:99999:7:::
operator:!:16874:0:99999:7:::
sysadmin:$6$c75ekQWF$.GpiZpFnIXLzkALjDpZXmjxZcIll1/..c7v0.n0:16874:5:30:7:60:15050 ::

Username

sysadmin: El nombre de usuario de la cuenta, que coincide con el nombre de la cuenta en el


archivo /etc/passwd.
Password:
$6$c75ekQWF$.GpiZpFnIXLzkALjDpZXmjxZcIll14OvL2mFSIfnc1aU2cQ/
221QL5AX5RjKXpXPJRQ0uVN35TY3/..c7v0.n0: El campo de contraseña contiene la
contraseña cifrada para la cuenta. Esta cadena muy larga es un cifrado unidireccional, lo que
significa que no se puede "revertir" para determinar la contraseña original.

Si bien los usuarios habituales tienen contraseñas cifradas en este campo, las cuentas del sistema
tienen un asterisco * en este campo.

Last Change:

16874: Representa la última vez que se cambió la contraseña. El número 16874 es el


número de días desde el 1 de enero de 1970 (llamado La Época). Este valor se genera
automáticamente cuando se modifica la contraseña del usuario

Minimum:

5: Este campo indica el número mínimo de días entre cambios de contraseña. un valor
distinto de cero en este campo indica que después de que un usuario cambia su contraseña, la
contraseña no se puede volver a cambiar durante el número de días especificado, 5 días en este
ejemplo. Un valor 0, indica que siempre se puede cambiar la password.

Maximum:

30: Este campo indica el número máximo de días que la contraseña es válida. 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 se bloquee su cuenta.
Tenga en cuenta que si el campo mínimo se establece en 0, el usuario puede restablecer
inmediatamente su contraseña al valor original, lo que anula el propósito de obligar al usuario a
cambiar su contraseña cada 30 días. Entonces, si se establece el campo máximo, el campo mínimo
también se establece normalmente.
Si el campo máximo se establece en 99999, el valor máximo posible, el usuario esencialmente
nunca tiene que cambiar su contraseña (porque 99999 días son aproximadamente 274 años).

Warn: (advertencia)
7: El campo de advertencia indica el número de días antes de que caduque la
contraseña, el sistema advierte al usuario durante el inicio de sesión. Los administradores suben un
escalon en la advertencia
Inactive:

60: Si el usuario ignora las advertencias y excede el plazo de la contraseña, su cuenta


será bloqueada. En ese caso, el campo inactivo proporciona al usuario un período de "gracia" en el
que se puede cambiar su contraseña, pero solo durante el proceso de inicio de sesión.

Expire:
15050: Este campo indica el día en que caducará la cuenta, representado por el número de
días desde el 1 de enero de 1970. Una cuenta caducada está bloqueada, no eliminada, lo que
significa que el administrador puede restablecer la contraseña para desbloquear la cuenta. Cuando
un administrador establece este campo, se utiliza una herramienta para convertir de una fecha real a
epoch (Época).

Reserved:
:: Actualmente sin uso, esta reservado para uso futuro

Además del comando grep, otra técnica para recuperar la información del usuario contenida en los
archivos /etc/passwd y / etc/shadow es usar el comando getent. Una ventaja de este comando es que
puede recuperar información de la cuenta que se define localmente, en archivos como /etc/passwd y
/etc/shadow, o en un servidor de directorio de red.

Así recuperaría la información de la cuenta para el usuario sysadmin del archivo /etc/passwd:
sysadmin@localhost:~ $ getent passwd sysadmin
sysadmin:x:1001:1001:System Administrator,,,,:/home/sysadmin:/bin/bash

15.4 System Accounts

Por lo general las cuentas de usuario obtienen un UID superior a 500 (en algunos sistemas 1000).
Root tiene un UID 0 de acceso especial.
Las system accounts (cuentas del sistema) están diseñadas para proporcionar cuentas para los
servicios que se ejecutan en el sistema. Suelen tener asignado un UID del 1-499. Las system
accounts tienen algunos campos en los archivos /etc/passwd y /etc/shadow que son diferentes a
otras cuentas.
las cuentas del sistema rara vez tienen directorios de inicio, ya que generalmente no se utilizan para
crear o almacenar archivos. En el archivo /etc/passwd, las cuentas del sistema tienen un programa
nologin en el campo de shell:
sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin

En el archivo /etc/shadow, las cuentas del sistema suelen tener un asterisco * en lugar del campo de
contraseña:

sshd:*:16874:0:99999:7:::

15.5 Group Accounts

Su nivel de acceso a un sistema no está determinado únicamente por su cuenta de usuario. Cada
usuario puede ser miembro de uno o más grupos, lo que también puede afectar el nivel de acceso al
sistema. Anteriormente la limitación de pertenencia a grupos de un usuario era de 16, actualmente
de 65000.
El archivo /etc/passwd define la membresía del grupo primario para un usuario. La membresía de
grupo suplementaria (o membresía de grupo secundario) y los grupos mismos se definen en el15
archivo /etc/group.
El archivo /etc/group es otro archivo delimitado por dos puntos.

Group Name:

Este campo contiene el nombre del grupo. Al igual que con los nombres de usuario, los nombres
son más naturales para que la gente los recuerde que los números. El sistema generalmente usa ID
de grupo en lugar de nombres de grupo.

Password Placeholder:

Si bien hay contraseñas para grupos, rara vez se usan en Linux. Si el administrador crea una
contraseña de grupo, se almacenará en el archivo /etc/gshadow. La x en este campo se usa para
indicar que la contraseña no está almacenada en este archivo.
GID:

Cada grupo está asociado con un ID de grupo único (GID) que se coloca en este campo.

User List:

Este último campo se utiliza para indicar quién es miembro del grupo. Si bien la pertenencia al
grupo principal se define en el archivo /etc/passwd, los usuarios asignados a grupos adicionales
tendrían su nombre de usuario colocado en este campo del archivo /etc/group. En este caso, los15
usuarios de correo y postfix son miembros secundarios del grupo de correo.
Es muy común que un nombre de usuario también aparezca como nombre de grupo. También es
común que un usuario pertenezca a un grupo con el mismo nombre.

Para ver información sobre un grupo específico, se pueden usar los comandos grep o getent. Por
ejemplo, los siguientes comandos muestran la información de la cuenta del grupo de correo:

15.6 Viewing User Information

El comando id se usa para mostrar información de usuarios y grupos de un usuario específico.

Cuando se ejecuta sin un argumento, el comando id emite información sobre el usuario actual, lo
que le permite confirmar su identidad en el sistema.

sysadmin@localhost:~ $ id
uid=1001(sysadmin) gid=1001(sysadmin) groups=1001(sysadmin),4(adm),27(sudo)
La salida del comando id siempre enumera la información de la cuenta de usuario primero:

Después del nombre de usuario, se enumera el grupo primario, indicado tanto por la ID del grupo
como por el nombre del grupo:

Otra información incluida en la lista incluye los grupos a los que pertenece el usuario, denotados
nuevamente por ID de grupo seguidos de los nombres de grupo. El usuario que se muestra
pertenece a tres grupos:

Si el comando recibe un nombre de usuario como argumento, como root, muestra información sobre
la cuenta especificada:

Para imprimir solo el grupo primario del usuario, use la opción -g:

El comando id también se puede usar para verificar las pertenencias a grupos secundarios del
usuario, para imprimir esta información, use la opción -G:

La salida del ejemplo anterior se alinea con el contenido del archivo /etc/group, como revela una
búsqueda de sysadmin:
15.7 Viewing Current Users
getent
El comando who muestra una lista de usuarios que actualmente están conectados al sistema, desde
dónde están conectados y cuándo iniciaron sesión. Mediante el uso de opciones, este comando
también puede mostrar información como el nivel de ejecución actual (un estado funcional de la
computadora) y la hora en que se inició el sistema.

Username:

Esta columna indica el nombre del usuario que inició sesión. Tenga en cuenta que por "iniciar
sesión" nos referimos a "cualquier proceso de inicio de sesión y ventana de terminal abierta".

Terminal:

Esta columna indica en qué ventana de terminal está trabajando el usuario.

Si el nombre del terminal comienza con tty, esto es una indicación de un inicio de sesión local, ya
que se trata de un terminal de línea de comando normal. Si el nombre del terminal comienza con
pts, esto indica que el usuario está utilizando un pseudo terminal o está ejecutando un proceso que
actúa como un terminal.

Date:

Esta columna indica cuándo el usuario inició sesión.


Host:
Después de la fecha y la hora, puede aparecer información de ubicación. Si la información de
ubicación contiene un nombre de host, un nombre de dominio o una dirección IP, el usuario ha
iniciado sesión de forma remota:

Si hay dos puntos y un número, esto indica que han realizado un inicio de sesión gráfico local:

Si no se muestra información de ubicación en la última columna, esto significa que el usuario inició
sesión a través de un proceso de línea de comando local:

El comando who tiene varias opciones para mostrar información del estado del sistema. Por
ejemplo, la opción -b muestra la última vez que se inició (inició) el sistema, y la opción -r muestra
la hora en que el sistema alcanzó el nivel de ejecución actual:

El comando w proporciona una lista más detallada sobre los usuarios actualmente en el sistema que
el comando who:

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 salida del comando w es idéntica a la del comando uptime. Muestra la hora
actual, cuánto tiempo ha estado funcionando el sistema, el número total de usuarios actualmente
conectados y la carga promedio en el sistema durante los últimos períodos de 1, 5 y 15 minutos. El
promedio de carga es la utilización de la CPU donde un valor de 100 significaría el uso completo de
la CPU durante ese período de tiempo.

Command w
Column Example Description
USER root El nombre del usuario que ha iniciado sesión.
TTY tty2 En qué ventana de terminal está trabajando el usuario.
FROM example.com Desde donde el usuario inició sesión.
LOGIN@ 10:00 Cuando el usuario inició sesión.
IDLE 43:44 Cuánto tiempo ha estado inactivo el usuario desde que se ejecutó
el último comando.
JCPU 0.01s El tiempo total de CPU utilizado por todos los procesos
ejecutados desde el inicio de sesión.
PCPU 0.01s El tiempo total de la CPU para el proceso actual.
WHAT -bash El proceso actual que está ejecutando el usuario.

15.8 Viewing Login History

El comando last lee el historial de inicio de sesión completo del archivo /var/log/wtmp y muestra
todos los inicios de sesión y los registros de reinicio de forma predeterminada. Un detalle
interesante de los logs de reinicio es que muestra la versión del kernel de Linux que se inició en
lugar de la ubicación de inicio de sesión. El archivo /var/log/wtmp mantiene un registro de todos los
usuarios que han iniciado y cerrado sesión en el sistema.
Muestra el nombre de usuario, el terminal y la ubicación de inicio de sesión, no solo de las sesiones
de inicio de sesión actuales, sino también de las sesiones anteriores. A diferencia de los comandos
who y w, muestra la fecha y la hora en que el usuario inició sesión en el sistema. Si el usuario ha
cerrado sesión en el sistema, mostrará el tiempo total que el usuario pasó conectado; de lo contrario,
mostrará que todavía está conectado.

sysadmin@localhost:~ $ last
sysadmin console Tue Sep 18 02:31 still logged in
sysadmin console Tue Sep 18 02:31 - 02:31 (00:00)
wtmp begins Tue Sep 18 02:31:57 2018
El comando who lee del archivo /var/log/utmp que registra a los usuarios actuales, mientras que
el comando last lee del archivo /var/log/wtmp, que mantiene un historial de todos los inicios de
sesión de los usuarios.

Lab 15

su : Este comando normalmente se usa para intercambiar usuarios y abrir una nueva shell con un
nuevo user, por defecto suele ser root
sudo: Se usa para ejecutar un comando individual como root. Este comando debe ser configurado
por root antes de que un usuario normal lo pueda usar. Las iniciales su significan; substitute user,
switch user, and superuser. Con el comando id confirmamos que se ha realizado el cambio de user.
Cuando se ejecuta un comando con sudo, el sistema solicitará la contraseña del usuario actual, no la
contraseña de root. Si el usuario actual es parte del grupo sudo, se ejecutará el comando. Todos los
comandos ingresados durante los próximos 15 minutos se ejecutarán como root de forma
predeterminada en los sistemas Ubuntu. Otros sistemas pueden tener diferentes tiempos de espera.

Getent: El comando getent tiene la ventaja sobre el comando grep ya que también puede acceder a
cuentas de usuario que no están definidas localmente. En otras palabras, el comando getent puede
obtener información del usuario para los usuarios que pueden definirse en servidores de directorio
de red como LDAP, NIS, dominio de Windows o servidores de dominio de Active Directory.
El archivo /etc/group, junto con /etc/passwd, determina la membresía de su grupo. Su grupo
primario predeterminado se determina haciendo coincidir su GID encontrado en /etc/passwd con el
GID definido para un grupo en /etc/group. Cualquier pertenencia a un grupo secundario se define en
el archivo /etc/group. El formato de las entradas en el archivo /etc/group para cada línea es:

w: La salida del comando w muestra un resumen de cuánto tiempo ha estado funcionando el


sistema, cuántos usuarios han iniciado sesión y los promedios de carga del sistema durante los
últimos 1, 5 y 15 minutos.

También se muestra una entrada para cada usuario con su nombre de inicio de sesión, nombre de tty
(nombre de terminal), host, tiempo de inicio de sesión, tiempo de inactividad, JCPU (tiempo de
CPU utilizado por trabajos en segundo plano), PCPU (tiempo de CPU utilizado por el proceso
actual) y qué se está ejecutando en la línea de comando actual.
16.1 Introduction

Durante el proceso de instalación, la mayoría de los instaladores crean un usuario normal y le dan
permiso a este usuario para ejecutar comandos administrativos con sudo.
Hay varias ventajas para las personas que tienen sus propias cuentas separadas:
• Las cuentas se pueden usar para otorgar acceso selectivo a archivos o servicios.

• El comando sudo se puede configurar para otorgar la capacidad de ejecutar comandos


administrativos seleccionados.
• Cada cuenta puede tener membresías grupales y derechos asociados, lo que permite una
mayor flexibilidad de gestión.
• En algunas distribuciones, la creación de una nueva cuenta de usuario también crea
automáticamente una cuenta de grupo para el usuario, llamada User Private Group (UPG).
En estos sistemas, el grupo y el nombre de usuario serían los mismos, y el único miembro de
este nuevo grupo sería el nuevo usuario.
• Para las distribuciones que no crean un UPG, los usuarios nuevos generalmente reciben el
grupo de usuarios como su grupo principal. El administrador puede crear manualmente
cuentas grupales que son privadas para el usuario, pero es más común que el administrador
cree grupos para múltiples usuarios que necesitan colaborar. Los usuarios DEBEN
pertenecer al menos a un grupo para usar como su grupo principal.

Es más eficiente crear sus grupos primero y crear sus usuarios con sus membresías grupales. De lo
contrario, si primero crea sus usuarios, y luego sus grupos, deberá dar un paso adicional para
modificar a sus usuarios para que sean miembros de sus grupos.

16.2 Groups

La razón más común para crear un grupo es proporcionar una forma para que los usuarios
compartan archivos.
Después de crear o modificar un grupo, puede verificar los cambios visualizando la información de
configuración del grupo en el archivo /etc/group con el comando grep. Si trabaja con servicios de
autenticación basados en red, el comando getent puede mostrarle grupos locales y basados en red.
16.2.1 Creating A Group

El usuario root puede ejecutar el comando groupadd para crear un nuevo grupo. El comando solo
requiere que se cree el nombre del grupo. La opción -g se puede usar para especificar un GID (Id de
grupo) para el nuevo grupo:

Si no se proporciona la opción -g, el comando groupadd proporcionará automáticamente un GID


para el nuevo grupo. Para lograr esto, el comando groupadd mira el archivo /etc/group y usa un
número que es un valor más alto que el número GID más alto actual.

16.2.1.1 Group ID Considerations

En algunas distribuciones de Linux, particularmente aquellas basadas en Red Hat, cuando se crea
una ID de usuario (UID), también se crea un grupo privado de usuarios (UPG) con ese usuario
como único miembro. En estas distribuciones, se supone que el UID y el ID del UPG deben
coincidir.
Por lo tanto, debe evitar crear GID en los mismos rangos numéricos en los que espera crear UID,
para evitar un conflicto entre un GID que cree y un número UPG creado para que coincida con un
UID.

Los GID de menos de 500 (RedHat) o 1000 (Debian) están reservados para uso del sistema. Puede
haber ocasiones en las que desee asignar un valor GID más bajo. Para lograr esto, use la opción -r
que asigna al nuevo grupo un GID que es menor que el GID estándar más bajo:
Al usar la opción r se agregan en el rango reservado entre (1-999). Con esta opción los GIDs
(Group Identifiers) se asignan automáticamente con un valor inferior al UID de usuario normal. El
comando groupadd modifica el archivo /etc/group. La opción -n es para cambiar el nombre de
cualquiera de estos grupos, y la opcion -g para cambiar el GID

16.2.1.2 Group Naming Considerations

Seguir estas pautas para los nombres de grupos puede ayudar a seleccionar un nombre de grupo que
sea portátil (funciona correctamente con otros sistemas o servicios):
• El primer carácter del nombre debe ser un underscore (carácter de subrayado _ ) o un
carácter alfabético a-z en minúsculas.
• Se permiten hasta 32 caracteres en la mayoría de las distribuciones de Linux, pero usar más
de 16 puede ser problemático ya que algunas distribuciones pueden no aceptar más de 16.
• Después del primer carácter, los caracteres restantes pueden ser alfanuméricos, un carácter
de guión - (dash) o un underscore (carácter de subrayado _).

16.2.2 Modifying a Group

El comando groupmod se puede usar para cambiar el nombre de un grupo con la opción -n o
cambiar el GID del grupo con la opción -g.
Cambiar el nombre del grupo no afecta al sistema que se guia por GID, pero si puede confundir a
los usuarios que estaban familiarizados con el nombre anterior.
Groupmod [new_name] [old_name]

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 ahora están en el
grupo clerks por lo que todos esos usuarios aún pueden acceder al archivo index.html. Nuevamente,
esto se debe a que el sistema define el grupo por el GID, no el nombre del grupo.
Por otro lado, si cambia el GID para un grupo, todos los archivos que estaban asociados con ese
grupo ya no estarán asociados con ese grupo. De hecho, todos los archivos que estaban asociados
con ese grupo ya no estarán asociados con ningún nombre de grupo. En cambio, estos archivos
serán propiedad de un GID solamente, como se muestra a continuación:

Estos archivos sin nombre de grupo se denominan orphaned files (archivos huérfanos). Para buscar
todos los archivos que son propiedad de solo un GID (no asociado con un nombre de grupo) use la
opción -nogroup del comando

16.2.3 Deleting a Group

Si decide eliminar un grupo con el comando groupdel, tenga en cuenta que cualquier archivo que
sea propiedad de ese grupo quedará huérfano. Sólo se pueden borrar grupos suplementarios, ningún
grupo que sea principal de cualquier usuario se podrá borrar. El administrador puede modificar qué
grupo es el grupo primario de un usuario, por lo que un grupo que se estaba utilizando como grupo
primario se puede convertir en un grupo suplementario y luego se puede eliminar.
Estructura para borrar un grupo suplementario: groupdel [name_group]

16.3 Users
La información de la cuenta del usuario se almacena en el archivo /etc/passwd y la información de
autenticación del usuario (datos de contraseña) se almacena en el archivo /etc/shadow. La creación
de un nuevo usuario se puede lograr agregando manualmente una nueva línea a cada uno de estos
archivos, pero generalmente esa no es la técnica recomendada. Si modifica estos archivos
manualmente, correría el riesgo de cometer un error que podría impedir que todos los usuarios
puedan iniciar sesión normalmente.
Hay que verificar o establecer valores prácticos que se usan por defecto con el comando useradd.
16.3.1 User Configuration Files

La opción -D del comando useradd le permite ver o cambiar algunos de los valores
predeterminados utilizados por el comando useradd. Los valores mostrados por useradd -D
también se pueden ver o actualizar manipulando el archivo /etc/default/useradd:

Group:

En las distribuciones que no usan UPG, este es el grupo primario predeterminado para un nuevo
usuario, si no se especifica uno con el comando useradd. Este suele ser el grupo de usuarios con un
GID de 100.

Esta configuración afecta el campo de ID de grupo principal del archivo /etc/passwd resaltado a
continuación:

La opción -g del comando useradd le permite usar un grupo primario diferente al predeterminado
al crear una nueva cuenta de usuario.

Home:

El directorio /home es el directorio base predeterminado en el que se crea el nuevo directorio de


inicio del usuario. Esto significa que un usuario con un nombre de cuenta de bob tendría un
directorio de inicio de /home/ bob.
Esta configuración afecta el campo del directorio de inicio del archivo /etc/passwd resaltado a
continuación:

La opción -b del comando useradd le permite usar un grupo de directorio base diferente al
predeterminado al crear una nueva cuenta de usuario.

Este valor representa el número de días después de que caduca la contraseña que la cuenta está
deshabilitada. Un valor de -1 significa que esta función no está habilitada de forma predeterminada
y no se proporciona ningún valor "inactivo" para las cuentas nuevas de forma predeterminada.

La opción -f del comando useradd le permite usar un valor INACTIVO diferente al predeterminado
al crear una nueva cuenta de usuario.

Por defecto, no hay un valor establecido para la fecha de vencimiento. Por lo general, se establece
una fecha de vencimiento en una cuenta individual.

Esta configuración afecta el campo de shell del archivo /etc/passwd resaltado a continuación:

La opción -e del comando useradd le permite usar un valor EXPIRE diferente al predeterminado al
crear una nueva cuenta de usuario.
Shell

La configuración SHELL indica el shell predeterminado para un usuario cuando inicia sesión en el
sistema.
La opción -s del comando useradd le permite usar un shell de inicio de sesión diferente al
predeterminado al crear una nueva cuenta de usuario.
Skeleton Directory

El valor SKEL determina qué directorio skeleton tiene sus contenidos copiados en el directorio de
home del nuevo usuario. El contenido de este directorio se copia en el directorio de home del nuevo
usuario, y el nuevo usuario tiene la propiedad de los nuevos archivos.

Esta configuración proporciona a los administradores una manera fácil de llenar una nueva cuenta
de usuario con archivos de configuración clave.

La opción -k del comando useradd le permite usar un directorio SKEL diferente al predeterminado
al crear una nueva cuenta de usuario.

Create Mail Spool

Un Mail Spool es un archivo donde se coloca el correo electrónico entrante. El valor “yes” indica
que los usuarios están configurados de manera predeterminada para recibir y almacenar correo
local. El valor puede cambiarse a “no” si no se desea usar el correo.

Para modificar uno de los valores predeterminados de useradd, el archivo /etc/default/useradd


podría editarse con un editor de texto. Otra técnica (más segura) es usar el comando useradd -D.
Para permitir que los usuarios tengan contraseñas caducadas con las que aún pueden iniciar sesión
durante un máximo de treinta días, puede ejecutar:
16.3.2 User Configuration Files

El archivo /etc/login.defs también contiene valores que se aplican por defecto a los nuevos usuarios
creados con el comando useradd. A diferencia del archivo /etc/default/useradd, el administrador
suele editar directamente el archivo /etc/login.defs para modificar sus valores.
Este archivo contiene muchos comentarios y líneas en blanco, por lo que para ver solo las líneas que
no son comentarios o líneas en blanco (la configuración real), puede usar el siguiente comando
grep:

Este ejemplo representa una distribución típica de CentOS 6.

Mail Directory
El directorio en el que se crea el archivo de spool de correo del usuario.

Password Maximum Days


Esta configuración determina el número máximo de días que un usuario puede continuar usando la
misma contraseña. Como el valor predeterminado es 99999 días (más de 200 años), significa que
los usuarios nunca tendrán que cambiar su contraseña.

Las organizaciones con políticas efectivas para mantener contraseñas seguras suelen cambiar este
valor a 60 o 30 días.

Esta configuración afecta la configuración predeterminada del archivo /etc/shadow resaltado a


continuación:

Password Minimum Days

Con este valor predeterminado de cero, el tiempo más corto que se requiere que un usuario
mantenga una contraseña es de cero días, lo que significa que puede cambiar de inmediato una
contraseña que acaba de establecer.

Si el valor PASS_MIN_DAYS se estableció en tres días, luego de establecer una nueva contraseña,
el usuario tendría que esperar tres días antes de poder cambiarla nuevamente.

Esta configuración afecta la configuración predeterminada del archivo /etc/shadow resaltado a


continuación:

Password Minimum Length

Indica el número mínimo de caracteres que debe contener el password


Password Warning

Este es el valor predeterminado para el campo warning. A medida que un usuario se acerca al
número máximo de días que puede usar su contraseña, el sistema verifica si es hora de comenzar a
advertirle al usuario acerca de cambiar su contraseña al iniciar sesión.

Esta configuración afecta la configuración predeterminada del archivo /etc/shadow resaltado a


continuación:

UID Minimum

El UID_MIN determina el primer UID que se asigna a un usuario ordinario. Cualquier UID menor
que este valor, sería para una cuenta del sistema o la cuenta raíz.

UID Maximum

Un UID técnicamente podría tener un valor de más de cuatro mil millones. Para una máxima
compatibilidad, se recomienda dejarlo en su valor predeterminado de 60000.

GID Minimum

El GID_MIN determina el primer GID que se asigna a un grupo ordinario. Cualquier grupo con un
GID menor que este valor sería un grupo del sistema o el grupo raíz.
GID Maximum

Un GID, como un UID, podría tener un valor de más de cuatro mil millones. Cualquier valor que
use para su UID_MAX, debe usarse para que GID_MAX admita UPG (User Private Group).
Home Directory

El valor determina si se crea o no un nuevo directorio para el usuario cuando se crea su cuenta.

Umask

UMASK funciona en el momento en que se crea el directorio de /home; determina qué permisos
predeterminados se colocan en este directorio. El uso del valor predeterminado de 077 para
UMASK significa que solo el propietario del usuario tiene algún tipo de permiso para acceder a su
directorio.

3 UPG

4 En las distribuciones que cuentan con un grupo


privado para cada usuario, como muestra este ejemplo de
CentOS, USERGROUPS_ENAB tendrá un valor de yes. Si
UPG no se usa en la distribución, entonces tendrá un valor
de no.

Encryption

El método de cifrado que se utiliza para cifrar las contraseñas de los usuarios en el archivo
/etc/shadow. La configuración ENCRYPT_METHOD anula la configuración
MD5_CRYPT_ENAB.

Encryption (Deprecated) (Obsoleta)


Esta configuración en desuso originalmente permitió al administrador especificar el uso del cifrado
MD5 de contraseñas en lugar del cifrado DES original. Ha sido reemplazado por la configuración
ENCRYPT_METHOD.

16.3.3 Account Considerations

La creación de una cuenta de usuario para usar con un sistema Linux puede requerir que recopile
varios datos. Si bien todo lo que se puede requerir es
• El nombre de la cuenta

• planificar el UID, el primary group, los supplementary groups, el home directory, el


dskeleton directory
• El shell que se utilizará.

Cuando planifique estos valores, considere lo siguiente:

Username
El único argumento requerido para el comando useradd es el nombre que desea que tenga la
cuenta. El nombre de usuario debe seguir las mismas pautas que para los nombres de grupo. Seguir
estas pautas puede ayudarlo a seleccionar un nombre de usuario que sea portátil:
• El primer carácter del nombre debe ser un carácter de subrayado _ o un carácter alfabético a-
z en minúsculas.
• Se permiten hasta 32 caracteres en la mayoría de las distribuciones de Linux, pero usar más
de 16 puede ser problemático ya que algunas distribuciones pueden no aceptar más de 16.
• Después del primer carácter, pueden ser alfanuméricos, un carácter de guión - o un carácter
de subrayado _.
• El último carácter no debe ser un guión -

Si el usuario necesita acceder a múltiples sistemas, generalmente se recomienda que el nombre de la


cuenta sea el mismo en esos sistemas. El nombre de la cuenta debe ser único para cada usuario.
User Identifier (UID)

Una vez que crea un usuario con un UID específico, el sistema generalmente incrementa el UID en
uno para el siguiente usuario que cree. Si está conectado a una red con otros sistemas, es posible
que desee asegurarse de que este UID sea el mismo en todos los sistemas para ayudar a
proporcionar un acceso constante.

Agregar la opción -u al comando useradd le permite especificar el número de UID. Los UID
generalmente pueden oscilar entre cero y más de cuatro mil millones, pero para una mayor
compatibilidad con sistemas más antiguos, el valor de UID máximo recomendado es 60,000.

El usuario root tiene un UID de 0, lo que permite que esa cuenta tenga privilegios especiales.
Cualquier cuenta con un UID de 0 podría actuar efectivamente como administrador.

Las cuentas del sistema se usan generalmente para ejecutar servicios en segundo plano llamados
daemons. Al no ejecutar los servicios como usuario root, la cantidad de daño que se puede hacer
con una cuenta de servicio comprometida es limitada. Las cuentas del sistema utilizadas por los
servicios generalmente usan UID que están en el rango reservado. Una cuenta del sistema que es
una excepción a esta regla es el usuario nfsnobody, que tiene un UID de 65534.
El rango reservado utilizado para las cuentas de servicio se ha ampliado con el tiempo.
Inicialmente, era para UID entre 1 y 99. Luego, se expandió para estar entre 1 y 499. La tendencia
actual entre las distribuciones es que las cuentas del sistema son cualquier cuenta que tenga un UID
entre 1 y 999, pero el rango 1-499 sigue siendo de uso común.
Al configurar un nuevo sistema, es una buena práctica iniciar UID no inferiores a 1000 para
asegurarse de que haya suficientes UID disponibles para muchos servicios del sistema y darle la
posibilidad de crear muchos GID en el rango reservado.

Primary Group
En las distribuciones que cuentan con UPG, este grupo se crea automáticamente con un GID y un
nombre de grupo que coincide con el UID y el nombre de usuario de la cuenta de usuario recién
creada. En las distribuciones que no usan UPG, el grupo primario normalmente se predetermina al
grupo de usuarios con un GID de 100.
Para especificar un grupo primario con el comando useradd, use la opción -g con el nombre o GID
del grupo. Por ejemplo, para especificar usuarios como el grupo primario:
Supplementary Group
Para hacer que el usuario sea miembro de uno o más grupos suplementarios, la opción -G puede
usarse para especificar una lista separada por comas de nombres o números de grupos. Por ejemplo,
para especificar “sales and research “ como grupos complementarios:

Home Directory
De manera predeterminada, la mayoría de las distribuciones crean el directorio de inicio del usuario
con el mismo nombre que la cuenta de usuario debajo del directorio base especificado en la
configuración de HOME del archivo /etc/default/useradd, que generalmente especifica el directorio
/home. Por ejemplo, si crea una cuenta de usuario llamada jane, el nuevo directorio de inicio del
usuario sería /home/jane.

Hay varias opciones para el comando useradd que pueden afectar la creación del directorio home
del usuario:
• Si CREATE_HOME se establece en NO o esta configuración no está presente, el directorio
no se creará automáticamente. De lo contrario, la opción -M se usa para especificar al
comando useradd que NO debe crear el directorio de inicio, incluso si CREATE_HOME
está establecido en yes.
• Si la configuración CREATE_HOME en el archivo /etc/login.defs está establecida en yes, el
directorio home se crea automáticamente. De lo contrario, la opción -m se puede utilizar
para crear el directorio de inicio.
La opción -b le permite especificar un directorio base diferente bajo el cual se crea el directorio de
home del usuario. Por ejemplo, lo siguiente crea la cuenta de usuario jane con un /test/jane creado
como el directorio de inicio del usuario:

La opción -d le permite especificar un directorio existente o un nuevo directorio de inicio para crear
para el usuario. Esta debería ser una ruta completa para el directorio de home del usuario. Por
ejemplo, lo siguiente crea la cuenta de usuario jane con un /test/jane creado como el directorio de
inicio del usuario:

La opción -k para especifica un directorio de skeleton diferente. Cuando se usa la opción -k, se
requiere la opción -m.

Skeleton Directory
De forma predeterminada, el contenido del directorio /etc/skel se copia en el directorio de home del
nuevo usuario. Los archivos resultantes también son propiedad del nuevo usuario. Al usar la opción
-k con el comando useradd, los contenidos de un directorio diferente se pueden usar para llenar el
directorio de home de un nuevo usuario. Al especificar el directorio de esqueleto con la opción -k,
se debe usar la opción -m o, de lo contrario, el comando useradd fallará con un error.
El siguiente ejemplo usa /home/sysadmin como el directorio skeleton:

Shell
Si bien el shell predeterminado se especifica en el archivo /etc/default/useradd, también se puede
anular con el comando useradd utilizando la opción -s en el momento de la creación de la cuenta:

Es común especificar el shell /sbin/nologin para las cuentas que se utilizarán como cuentas del
sistema.
Comment
El campo de comentarios, originalmente llamado campo General Electric Operating System
(GECOS), generalmente se usa para contener el nombre completo del usuario. Muchos programas
de inicio de sesión gráficos muestran el valor de este campo en lugar del nombre de la cuenta. La
opción -c del comando useradd permite especificar el valor de este campo.

16.3.4 Creating a User


Una vez que haya verificado qué valores predeterminados usar y haya reunido la información sobre
el usuario, estará listo para crear una cuenta de usuario. Un ejemplo de un comando useradd que
utiliza algunas opciones tiene el siguiente aspecto:

root@localhost:~# useradd -u 1009 -g users -G sales,research -m -c 'Jane Doe' jane

Este ejemplo del comando useradd crea un usuario con un UID de 1009, un grupo primario de
users, membresías suplementarias en los grupos de sales and research, un comentario de "Jane
Doe" y un nombre de cuenta de jane.

Después de ejecutar el comando anterior, la información sobre la cuenta de usuario de jane se


agrega automáticamente a los archivos /etc/passwd y /etc/shadow, mientras que la información
sobre el acceso al grupo suplementario se agrega automáticamente a /etc/group y /etc/gshadow:

La cuenta todavía no tiene una contraseña válida


Además, si CREATE_MAIL_SPOOL se establece en yes, se crea el archivo de spool de correo
/var/spool/mail/jane:

Finalmente, debido a que se usa la opción -m, el directorio /home/jane se crea con permisos que
sólo permiten el acceso del usuario jane, y el contenido del directorio /etc/skel se copiará en el
directorio:

16.3.5 Passwords

Hay numerosos factores a tener en cuenta cuando intentas elegir una contraseña para una cuenta:
• Length: El archivo /etc/login.defs permite al administrador especificar la longitud mínima
de la contraseña
• Composition: Una buena contraseña debe estar compuesta por una combinación de
caracteres alfabéticos, numéricos y simbólicos.
• Lifetime: La cantidad máxima de tiempo que se puede usar una contraseña debe limitarse
por varias razones:
◦ Si una cuenta se ve comprometida y el tiempo de validez de la contraseña es limitado, el
intruso perderá el acceso cuando la contraseña deje de ser válida.
◦ Si no se está utilizando una cuenta, se puede deshabilitar automáticamente cuando la
contraseña ya no sea válida.
◦ Si los atacantes intentan un ataque de "fuerza bruta" probando todas las contraseñas
posibles, entonces la contraseña se puede cambiar antes de que el ataque pueda tener
éxito.
Sin embargo, requerir que un usuario cambie su contraseña con demasiada frecuencia puede
plantear problemas de seguridad, que incluyen:
◦ La calidad de la contraseña que elija el usuario podría verse afectada.

◦ El usuario puede comenzar a escribir su contraseña en papel, lo que aumenta la


posibilidad de que se descubra la contraseña.
◦ Raramente las cuentas de usuario usadas pueden caducar y requieren atención
administrativa para restablecer.
Para cuentas altamente sensibles, se recomienda cambiar las contraseñas con más frecuencia, como
cada 30 días. Por otro lado, para cuentas no críticas sin acceso a información confidencial, hay
menos necesidad de cambios frecuentes. Para cuentas con un riesgo mínimo, tener una duración de
90 días se consideraría más razonable.

16.3.5.1 Setting a User Password

Hay varias formas para cambiar el password:


• Como usuario : passwd [password]

• Como administrador : passwd [username] [password]

Si se completa con éxito, se actualiza el archivo /etc/shadow con la nueva password.


• Mediante aplicaciones gráficas

Mientras los usuarios normales deben seguir muchas reglas para establecer la contraseña, los
administradores solo deben seguir una, no dejarla en blanco. Cuando el root viola todas las demás
reglas de contraseña que se aplican a los usuarios normales, se imprime en pantalla un mensaje de
advertencia y la regla no se aplica.
Suponiendo que el administrador ha establecido una contraseña para una cuenta de usuario, el
usuario puede iniciar sesión con ese nombre de cuenta y contraseña. Después de que el usuario abre
una terminal, puede ejecutar el comando passwd sin argumentos para cambiar su propia contraseña.
Se les solicita su contraseña actual y luego se les solicita ingresar la nueva contraseña dos veces.

Como usuario común, puede ser difícil establecer una contraseña válida porque se deben 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.

Usando los privilegios de root, las contraseñas cifradas y otra información relacionada con la
contraseña se pueden ver al ver el archivo /etc/shadow. Recuerde que los usuarios normales no
pueden ver el contenido de este archivo.
16.3.5.2 Managing Password Aging
(Administrar el vencimiento de la contraseña)

El comando chage proporciona muchas opciones para administrar la información de antigüedad de


la contraseña que se encuentra en el archivo /etc/shadow.

Aquí hay un resumen de las opciones de cambio:


Short option Long option Description
-l --list Lista de información de vencimiento de la cuenta
-d LAST_DAY --lastday LAST_DAY Establecer la fecha del último cambio de password
-E EXPIRE_DATE --expiredate EXPIRE_DATE Establecer cuenta que caducará el EXPIRE_DATE
-h --help Muestra ayuda para el comando
Configura permisos de inicio de sesion en tiempo
-I INACTIVE --inactive INACTIVE
inactivo en cuenta con password caducada
Número mínimo de días para poder cambiar la
-m MIN_DAYS --mindays MIN_DAYS
password a MIN_DAYS
Número máximo de días antes de que una
-M MAX_DAYS --maxdays MAX_DAYS
contraseña se cambie a MAX_DAYS
Establezca el número de días antes de que
-W WARN_DAYS --warndays WARN_DAYS caduque una contraseña para comenzar a mostrar
una advertencia a WARN_DAYS

Ejemplo de password válida para 60 días.

16.3.6 Modifying a User

Antes de realizar cambios en una cuenta de usuario, comprenda que algunos comandos no
modificarán con éxito una cuenta de usuario si el usuario está actualmente conectado (como
cambiar el nombre de inicio de sesión del usuario).
Otros cambios que pueda realizar no serán efectivos si el usuario ha iniciado sesión, pero entrarán
en vigencia tan pronto como el usuario cierre sesión y luego vuelva a iniciar sesión. Por ejemplo, al
modificar las membresías de grupo, las nuevas membresías no estarán disponibles para el usuario
hasta la próxima
En cualquier caso, es útil saber cómo usar los comandos who, w y last, para que pueda saber quién
inició sesión en el sistema, ya que esto puede afectar los cambios que desea realizar en una cuenta
de usuario.
Tanto los comandos who como w muestran quién está actualmente conectado al sistema. El
comando w es el más detallado de los dos, ya que muestra el tiempo de actividad del sistema y la
información de carga, así como el proceso que ejecuta cada usuario. El comando last se puede usar
para determinar las sesiones de inicio de sesión actuales y anteriores, así como su fecha y hora
específicas. Al proporcionar un nombre de usuario o un nombre tty (terminal) como argumento, el
comando solo muestra registros que coinciden con ese nombre.
El comando usermod ofrece muchas opciones para modificar una cuenta de usuario existente.
Muchas de estas opciones también están disponibles con el comando useradd en el momento en
que se crea la cuenta. El siguiente cuadro proporciona un resumen de las opciones de usermod:

Short option Long option Description


-c COMMENT COMENTARIO Establece el valor del campo
GECOS o comentario en COMENTARIO.
-d HOME_DIR --home HOME_DIR Establece HOME_DIR como un nuevo directorio de
inicio para el usuario.
-e EXPIRE_DATE --expiredate EXPIRE_DATE Establezca la fecha de vencimiento de la cuenta en
EXPIRE_DATE.
-f INACTIVE --inactive INACTIVE Configure la cuenta para permitir el inicio de sesión
durante los días INACTIVOS después de que
caduque la contraseña.
-g GROUP --gid GROUP Establecer GRUPO como el grupo primario.

-G GROUPS --groups GROUPS Establezca grupos suplementarios en una lista


especificada en GRUPOS.
-a --append Agregue los grupos suplementarios del usuario con
los especificados por la opción -G.
-h --help Muestra la ayuda del comando usermod

-l NEW_LOGIN --login NEW_LOGIN Cambiar el nombre de usuario de inicio de sesión.

-L LOCK --lock Bloquear la cuenta de usuario.

-s SHELL --shell SHELL Especifique el shell de inicio de sesión para la


cuenta.
-u NEW_UID --uid NEW_UID Especifique el UID del usuario como NEW_UID.

-U --unlock Desbloquea la cuenta de usuario


Puede ser muy problemático cambiar el UID del usuario con la opción -u, ya que cualquier archivo
propiedad del usuario quedará huérfano. Por otro lado, especificar un nuevo nombre de inicio de
sesión para el usuario con -l no hace que los archivos queden huérfanos.
Eliminar un usuario con el comando userdel puede dejar huérfanos o eliminar los archivos del
usuario en el sistema. En lugar de eliminar la cuenta, otra opción es bloquear la cuenta con la
opción -L para el comando usermod. Bloquear una cuenta evita que se use, pero la propiedad de
los archivos permanece.
Si usa la opción -G sin la opción -a, debe enumerar todos los grupos a los que pertenecería el
usuario. El uso de la opción -G solo puede llevar a eliminar accidentalmente a un usuario de todos
los grupos suplementarios anteriores a los que pertenecía.

Si usa la opción -a con -G, solo tiene que enumerar los nuevos grupos a los que pertenecería el
usuario. Por ejemplo, si el usuario Jane actualmente pertenece a los grupos de sales & research,
para agregar su cuenta al grupo development, ejecute el siguiente comando:

16.3.7 Deleting a User

El comando userdel se usa para eliminar usuarios. Cuando elimina una cuenta de usuario, también
debe decidir si desea eliminar el directorio home del usuario. Los archivos del usuario pueden ser
importantes para la organización e incluso puede haber requisitos legales para mantener los datos
durante un cierto período de tiempo, así que tenga cuidado de no tomar esta decisión a la ligera.
Además, a menos que haya realizado copias de seguridad de los datos, una vez que haya ejecutado
el comando para eliminar al usuario y sus archivos, no se puede revertir la acción.
Para eliminar el usuario Jane sin eliminar el directorio home del usuario /home/jane, ejecute:

Tenga en cuenta que eliminar un usuario sin eliminar su directorio home significa que los archivos
del directorio de inicio del usuario quedarán huérfanos y estos archivos serán propiedad exclusiva
de su antiguo UID y GID.

Para eliminar también el usuario, el directorio de home y el spool de correo, use la opción -r:

WARNING
El comando anterior solo eliminará los archivos del usuario en su directorio de inicio y su cola
de correo. Si el usuario posee otros archivos fuera de su directorio de inicio, esos archivos
continuarán existiendo como archivos huérfanos.
LAB 16

Command:
groupadd → Crear grupo
groupmod → Hacer cambios en un grupo
useradd → Crear usuario
passwd → Establecer y resetear el password de usuario
usermod → Hacer cambios en un usuario
su - → Para cambiar al user (root por defecto)
lastb → Similar a last, pero muestra intentos de inicios de sesion fallidos

Para permitir a los usuarios con contraseñas caducadas iniciar sesión hasta treinta días antes de que
sus cuentas se deshabiliten, luego ver los nuevos valores predeterminados. La opción -D del
comando useradd le permitirá ver o cambiar algunos de los valores predeterminados utilizados por
el comando useradd.

Cree un nuevo usuario llamado estudent que sea un miembro secundario del grupo de research y un
miembro principal de su propio grupo privado. Use un comentario de Linux Student que aparecerá
como el nombre completo del usuario cuando realice un inicio de sesión gráfico. Asegúrese de que
su directorio home se creará especificando la opción -m. Luego use grep para verificar el nuevo
usuario y sus membresías de grupo:
La información de la cuenta del usuario se almacena en los archivos /etc/passwd y /etc/shadow. La
información del grupo del usuario se puede encontrar en los archivos /etc/passwd y /etc/group.

17.1 Introduction

Cada archivo tiene un propietario de usuario y un propietario de grupo.


Este capítulo se centra en cómo especificar la propiedad del usuario y el grupo de un archivo.
Además, se explora el concepto de permisos de archivos y directorios, incluida la forma de cambiar
los permisos en archivos y directorios. Los permisos predeterminados son los permisos otorgados a
los archivos y directorios cuando se crean inicialmente.
Por defecto, los usuarios poseen los archivos que crean. Si bien esta propiedad se puede cambiar,
esta función requiere privilegios administrativos. Aunque la mayoría de los comandos generalmente
muestran al propietario del usuario como un nombre, el sistema operativo está asociando la
propiedad del usuario con el UID para ese nombre de usuario.
Cada archivo también tiene un propietario de grupo. De manera predeterminada, el grupo principal
del usuario que crea el archivo es el propietario del grupo de cualquier archivo nuevo. Los usuarios
pueden cambiar el propietario del grupo de archivos que poseen a cualquier grupo al que
pertenezcan.
Similar a la propiedad del usuario, la asociación de un archivo con un grupo no se realiza
internamente por el sistema operativo por nombre, sino por el GID del grupo.
Dado que la propiedad está determinada por el UID y el GID asociados con un archivo, cambiar el
UID de un usuario (o eliminar el usuario) tiene el efecto de hacer que un archivo que fue
originalmente propiedad de ese usuario no tenga un propietario real. Cuando no hay un UID en el
archivo /etc/passwd que coincida con el UID del propietario del archivo, el UID (el número) se
muestra como el usuario propietario del archivo en lugar del nombre de usuario (que ya no existe).
Lo mismo ocurre para los grupos.
El comando id puede ser útil para verificar qué cuenta de usuario está usando y qué grupos tiene
disponibles para usar. El comando id muestra el UID y el nombre de la cuenta de usuario del
usuario actual seguido del GID y el nombre del grupo principal y los GID y los nombres de grupo
de todas las membresías de grupo:

El ejemplo anterior muestra que el usuario tiene un UID de 1001 para la cuenta de usuario
sysadmin. También muestra que el grupo primario para este usuario tiene un GID de 1001 para el
grupo sysadmin.

Debido a que la cuenta de usuario y la cuenta de grupo principal tienen el mismo identificador
numérico y nombre, esto indica que este usuario está en un Grupo privado de usuarios (UPG).
Además, el usuario en este ejemplo pertenece a cuatro grupos suplementarios: el grupo adm con un
GID de 4, el grupo sudo con un GID de 27, el grupo de investigación con un GID de 1005 y el
grupo de desarrollo con un GID de 1006.

Cuando se crea un archivo, pertenece al usuario actual y a su grupo primario actual. Si el usuario
del ejemplo anterior ejecuta el comando touch para crear un archivo, el usuario propietario del
archivo es el usuario sysadmin, y el propietario del grupo es el grupo sysadmin:

La propiedad del archivo también se aplica a los archivos ocultos en el sistema. Archivos ocultos,
que comienzan con el período “. “ los caracteres se enumeran usando la opción -a del comando ls.
Los dos primeros archivos ocultos enumerados son los actuales “ . ” y padre “ .. “ directorios
respectivamente. La propiedad de todos los archivos y subdirectorios dentro del directorio actual se
puede enumerar utilizando el comando ls -la.
17.3 Changing Groups

Si sabe que el archivo que está a punto de crear debe pertenecer a un grupo diferente de su grupo
primario actual, entonces puede usar el comando newgrp para cambiar su grupo primario actual.

El comando id enumera su información de identidad, incluidas las membresías de su grupo. Si solo


está interesado en saber a qué grupos pertenece, puede ejecutar el comando groups:

La salida del comando de groups puede no ser tan detallada como la salida del comando id, pero si
todo lo que necesita saber es a qué grupos puede cambiar utilizando el comando newgrp, entonces
el comando groups proporciona la información que necesita. La salida del comando id muestra su
grupo primario actual, por lo que es útil para verificar que el comando newgrp se haya realizado
correctamente.
Por ejemplo, si el usuario sysadmin planeaba tener un archivo propiedad del grupo de investigación,
pero ese no era el grupo primario del usuario, entonces el usuario podría usar el comando newgrp y
luego verificar el grupo primario correcto con el comando id antes de crear el nuevo archivo:

De acuerdo con la salida de los comandos anteriores, inicialmente el GID del usuario es 1001 para
el usuario sysadmin, luego se ejecuta el comando newgrp y el GID primario del usuario se
convierte en 1005, el grupo research. Después de ejecutar estos comandos, si el usuario creara otro
archivo y viera sus detalles, el nuevo archivo sería propiedad del grupo research:

El comando newgrp abre un nuevo shell; Mientras el usuario permanezca en ese shell, el grupo
primario no cambiará. Para volver a cambiar el grupo primario al original, el usuario puede
abandonar el nuevo shell ejecutando el comando de salida. Por ejemplo:
Se requieren privilegios administrativos para cambiar el grupo primario del usuario de forma
permanente. El usuario root ejecutaría el siguiente comando:

usermod -g [groupname] [username]

17.4 Changing Group Ownership

Para cambiar el propietario del grupo de un archivo existente, se puede usar el comando chgrp.

Como usuario root, el comando chgrp se puede usar para cambiar el propietario del grupo de
cualquier archivo a cualquier grupo. Como usuario sin privilegios administrativos, el comando
chgrp sólo se puede usar para cambiar el propietario del grupo de un archivo a un grupo del que el
usuario ya es miembro:

Si un usuario intenta modificar la propiedad del grupo de un archivo que no posee, recibirá un
mensaje de error:
Para cambiar la propiedad del grupo de todos los archivos de una estructura de directorio, use la
opción -R recursiva para el comando chgrp. Por ejemplo, el comando en el siguiente ejemplo
cambiaría la propiedad del grupo del directorio test_dir y todos los archivos y subdirectorios del
directorio test_dir.

Si bien puede ver la propiedad de un archivo con la opción -l del comando ls, el sistema
proporciona otro comando que es útil al ver la propiedad y los permisos de archivo: el comando
stat. El comando stat muestra información más detallada sobre un archivo, que incluye
proporcionar la propiedad del grupo por nombre de grupo y número GID:

17.5 Changing User Ownership

El comando chown permite al usuario root cambiar la propiedad del usuario de archivos y
directorios. Un usuario normal no puede usar este comando para cambiar el propietario del usuario
de un archivo, incluso para otorgar la propiedad de uno de sus propios archivos a otro usuario. Sin
embargo, el comando chown también permite cambiar la propiedad del grupo, lo que puede realizar
el usuario root o el propietario del archivo.

Hay tres formas diferentes de ejecutar el comando chown. El primer método se usa para cambiar
solo el propietario del usuario del archivo. Por ejemplo, si el usuario root quería cambiar la
propiedad del usuario del archivo abc.txt al usuario jane, se podría ejecutar el siguiente comando:
El segundo método es cambiar tanto el usuario como el grupo; Esto también requiere privilegios de
root. Para lograr esto, separa el usuario y el grupo por dos puntos o un punto. Por ejemplo:

Si un usuario no tiene privilegios de root, puede usar el tercer método para cambiar el propietario
del grupo de un archivo al igual que el comando chgrp. Para usar chown solo para cambiar la
propiedad del archivo del grupo, use dos puntos o un punto como prefijo al nombre del grupo:

17.6 Permissions
La salida del comando ls -l muestra diez caracteres al comienzo de cada línea. Estos caracteres
indican el tipo de archivo y los permisos del archivo:

El primer carácter indica el tipo de archivo;


Tabla de valores para el tipo de archivo:
Character Type of the file
- Un archivo normal, que puede estar vacío o contener texto o datos binarios.
d Un archivo de directorio, que contiene los nombres de otros archivos y enlaces a
ellos.
l Un enlace simbólico es un nombre de archivo que hace referencia (puntos) a otro
archivo.
b Un archivo de bloque es aquel que se relaciona con un dispositivo de hardware de
bloque donde los datos se leen en bloques de datos.
c Un archivo de caracteres es uno que se relaciona con un dispositivo de hardware de
caracteres donde los datos se leen un byte a la vez.
p Un archivo pipefunciona de manera similar al símbolo pipe, lo que permite que la
salida de un proceso se comunique con otro proceso a través del archivo de tubería,
donde la salida de un proceso se usa como entrada para el otro proceso.

s Un archivo de socket permite que dos procesos se comuniquen, donde ambos


procesos pueden enviar o recibir datos.

Aunque todos los tipos de archivos se enumeran en la tabla anterior, normalmente no encuentra
nada más que archivos de directorio y enlace normales a menos que explore el directorio / dev.

Permission Groups
Los siguientes nueve caracteres demuestran los permisos del archivo.

Los permisos establecidos en estos archivos determinan el nivel de acceso que un usuario tiene en el
archivo. Cuando un usuario ejecuta un programa y el programa accede a un archivo, se verifican los
permisos para determinar si el usuario tiene los derechos de acceso correctos al archivo.

Los permisos se agrupan en tres roles diferentes, que representan a los diferentes usuarios que
pueden intentar acceder al archivo.

Si no es el propietario y no es miembro del grupo de archivos / directorios, sus permisos serían


otros.

User Owner

Los caracteres 2-4 indican los permisos para el usuario que posee el archivo. Si es el propietario del
archivo, solo se utilizan los permisos del propietario del usuario para determinar el acceso a ese
archivo.
Group Owner

Los caracteres 5-7 indican los permisos para el grupo que posee el archivo. Si no es el propietario
pero es miembro del grupo propietario del archivo, solo se utilizan los permisos del propietario del
grupo para determinar el acceso a ese archivo.

Other Permissions

Los caracteres 8-10 indican los permisos para otros o lo que a veces se conoce como los permisos
del mundo. Este grupo incluye a todos los usuarios que no son propietarios del archivo o miembros
del grupo del archivo.

Permission Types

A cada grupo se le atribuyen tres tipos básicos de permisos: read, write, and execute:

Los permisos en sí son engañosamente simples y tienen un significado diferente dependiendo de si


se aplican a un archivo o directorio.

Read
El primer carácter de cada grupo representa el permiso de lectura. Carácter r = el grupo tiene
permiso; Carácter - = no tiene permiso.
• En un archivo, esto permite que los procesos lean el contenido del archivo, lo que significa
que los contenidos se pueden ver y copiar.
• En un directorio, se pueden enumerar los nombres de archivo en el directorio, pero otros
detalles no están disponibles.
Write
El segundo carácter de cada grupo representa el permiso de escritura. Hay un carácter w = el grupo
tiene permiso de escritura, o un carácter (guion) - = si el grupo no tiene permiso.
• El proceso puede escribir en un archivo, por lo que se pueden guardar los cambios en un
archivo. Tenga en cuenta que el permiso w realmente requiere tener el permiso r en el
archivo para funcionar correctamente.
• En un directorio, los archivos se pueden agregar o eliminar del directorio. Tenga en cuenta
que el permiso w requiere permiso x en el directorio para funcionar correctamente.

Execute
El tercer carácter de cada grupo representa el permiso de ejecución. Hay un carácter x si el grupo
tiene permiso de ejecución, o un carácter - si el grupo no lo tiene.
• Un archivo puede ejecutarse o ejecutarse como un proceso.

• En un directorio, el usuario puede usar el comando cd para "ingresar" al directorio y usar el


directorio en una ruta de acceso para acceder a archivos y, potencialmente, subdirectorios
bajo este directorio.

17.7 Understanding Permissions

Las descripciones de los tipos de permisos pueden ser útiles, pero solo ellas mismas, no
proporcionan una descripción clara de cómo funcionan los permisos. Para comprender mejor cómo
funcionan los permisos, considere los siguientes escenarios.

Para comprender estos escenarios, primero debe comprender el siguiente diagrama:

La primera línea representa el directorio /, con un usuario propietario de root, un propietario de


grupo de root y permisos de rwxr-xr-x. La segunda línea representa el directorio /data, un directorio
que está debajo del directorio /. La tercera línea representa el archivo abc.txt, que se almacena en el
directorio /data.
17.7.1 Scenario #1 - Directory Access

Pregunta: Según la siguiente información, ¿qué acceso tendría el usuario bob en el archivo abc.txt?

Respuesta: ninguna.

Explicación: Inicialmente, parecería que el usuario bob puede ver el contenido del archivo abc.txt,
así como copiar el archivo, modificar su contenido y ejecutarlo como un programa. Esta conclusión
errónea sería el resultado de observar únicamente los permisos del archivo (rwx para el usuario bob
en este caso).

Sin embargo, para hacer algo con el archivo, el usuario primero debe "ingresar" al directorio /data.
Los permisos para bob para el directorio /data son los permisos para "otros" (r--), lo que significa
que bob ni siquiera puede usar el comando cd para ingresar al directorio. Si se estableciera el
permiso de ejecución (--x) para el directorio, el usuario bob podría "ingresar" al directorio, lo que
significa que se aplicarían los permisos del archivo en sí.

Deben tenerse en cuenta los permisos de todos los directorios principales antes de considerar
los permisos en un archivo específico.

17.7.2 Escenario n. ° 2: visualización del contenido del directorio

Pregunta: Según la siguiente información, ¿quién puede usar el comando ls para mostrar el
contenido del directorio /data (ls /data)?
Respuesta: todos los usuarios.

Explicación: Todo lo que se requiere para poder ver el contenido de un directorio es r permiso en el
directorio (y la capacidad de acceder a los directorios principales). El permiso x para todos los
usuarios en el directorio / significa que todos los usuarios pueden usar / como parte de una ruta,
para que todos puedan pasar por el directorio / para llegar al directorio / data. El permiso r para
todos los usuarios en el directorio / data significa que todos los usuarios pueden usar el comando ls
para ver el contenido. Esto incluye archivos ocultos, por lo que el comando ls -a también funciona
en este directorio.

Sin embargo, tenga en cuenta que para ver los detalles del archivo (ls -l), el directorio también
requeriría permiso x. Entonces, mientras que el usuario raíz y los miembros del grupo raíz tienen
este acceso en el directorio / data, ningún otro usuario podrá ejecutar ls -l / data.

El permiso r permite a un usuario ver una lista del directorio.


17.7.3 Scenario #3 - Deleting Directory Contents

Pregunta: Según la siguiente información, ¿quién puede eliminar el archivo /data/abc.txt?

Respuesta: solo el usuario root.

Explicación: Un usuario no necesita ningún permiso en el archivo en sí para eliminar un archivo. Se


requiere el permiso w en el directorio en el que se almacena el archivo para eliminar un archivo en
un directorio. Basado en eso, parecería que todos los usuarios podrían eliminar el archivo
/data/abc.txt, ya que todos tienen permiso w en el directorio.

‌ in embargo, para eliminar un archivo, también debe poder "ingresar" al directorio. Como solo el
S
usuario root tiene permiso x en el directorio / data, solo el root puede "entrar" en ese directorio para
eliminar archivos en este directorio.
El permiso w permite a un usuario eliminar archivos de un directorio, pero solo si el usuario
también tiene permiso x en el directorio.

17.7.4 Scenario #4 - Accessing the Contents of a Directory

Pregunta: Verdadero o falso: según la siguiente información, el usuario bob puede ejecutar con éxito
el siguiente comando: más /data/abc.txt?

Respuesta: cierto.

Explicación: Como se mencionó anteriormente, para acceder a un archivo, el usuario debe tener
acceso al directorio. El acceso al directorio solo requiere permiso x; aunque el permiso r sería útil
para listar archivos en un directorio, no es necesario "entrar" en el directorio y acceder a los
archivos dentro del directorio.

Cuando se ejecuta el comando more /data/abc.txt, se verifican los siguientes permisos: permiso x
en el directorio /, permiso x en el directorio data y permiso r en el archivo abc.txt. Como el usuario
bob tiene todos estos permisos, el comando se ejecuta con éxito.

Se requiere el permiso x para "entrar" en un directorio, pero el permiso r en el directorio no


es necesario a menos que desee enumerar el contenido del directorio.
17.7.5 Scenario #5 - The Complexity of Users and Groups

Pregunta: Verdadero o falso: según la siguiente información, el usuario bob puede ejecutar con éxito
el siguiente comando: more /data/abc.txt?
Tenga en cuenta que el directorio / data tiene diferentes propietarios de usuarios y grupos que los
ejemplos anteriores.

Respuesta: No hay suficiente información para determinar.

Explicación: Para acceder al archivo /data/abc.txt, el usuario bob debe poder "ingresar" al directorio
/data. Esto requiere permiso x, que Bob puede tener o no, dependiendo de si es miembro del grupo
payroll.

Si bob es miembro del grupo payroll, entonces sus permisos en el directorio /data son r-x, y el
comando more se ejecutará con éxito (bob también necesita x en / y r en abc.txt, que ya tiene).

Si no es miembro del grupo payroll, sus permisos en el directorio /data son ---, y el comando more
fallará.

Lección aprendida: debe ver los permisos de cada archivo y directorio por separado y saber a
qué grupos pertenece la cuenta de usuario.

17.7.6 Scenario #6 - Permission Priority

Pregunta: Verdadero o falso: según la siguiente información, el usuario bob puede ejecutar con éxito
el siguiente comando: more /data/abc.txt?

Respuesta: falso.

Explicación: Recuerde que si usted es el propietario de un archivo, los únicos permisos que se
verifican son los permisos del propietario del usuario. En este caso, eso sería --- para bob en el
archivo /data/abc.txt.

En este caso, los miembros del grupo bob y "otros" tienen más permisos en el archivo que bob.

Lección aprendida: no otorgue permisos al propietario del grupo ni a "otros" sin aplicar al
menos el mismo nivel de acceso al propietario del archivo.

17.8 Changing Permissions

El comando chmod (change mode) se usa para cambiar permisos en archivos y directorios. Hay dos
técnicas que se pueden usar con este comando: simbólico y numérico. Ambas técnicas utilizan la
siguiente sintaxis básica:

Para cambiar los permisos de archivo, hay que ser propietario o hacerlo como root.

17.8.1 Symbolic Method

Si desea modificar algunos de los permisos actuales, el método simbólico suele ser más fácil de
usar. Con este método, usted especifica qué permisos desea cambiar en el archivo y los otros
permisos permanecen como están.

Cuando se especifica el argumento new_permission del comando chmod utilizando el método


simbólico, se requieren tres tipos de información.

Comience usando uno o más de los siguientes caracteres para indicar a qué grupo (s) de permisos
aplicar los cambios:
Entonces elija uno de los siguientes operadores para indicar cómo modificar los permisos:

Por último, use los siguientes caracteres para especificar los tipos de permisos a cambiar:

Por ejemplo, para dar permiso de escritura al propietario del grupo en un archivo llamado abc.txt,
puede usar el siguiente comando:

Solo se cambió el permiso del propietario del grupo. Todos los demás permisos permanecieron
como estaban antes de la ejecución del comando chmod.

Puede combinar valores para realizar múltiples cambios en los permisos del archivo. Por ejemplo,
considere el siguiente comando que agrega el permiso de ejecución al propietario del usuario y al
propietario del grupo y elimina el permiso de lectura para otros:
Por último, puede usar el carácter =, que agrega permisos específicos y hace que se eliminen los no
mencionados. Por ejemplo, para otorgar al propietario del usuario solo permisos de lectura y
ejecución, eliminando el permiso de escritura:

17.8.2 Numeric Method

El método numérico (también llamado método octal) es útil al cambiar muchos permisos en un
archivo. Se basa en el sistema de numeración octal en el que a cada tipo de permiso se le asigna un
valor numérico:

/usr/bin/wall
Al usar una combinación de números del 0 al 7, se puede especificar cualquier combinación posible
de permisos de lectura, escritura y ejecución para un solo grupo de permisos. Por ejemplo:
El argumento new_permission se especifica como tres números, un número para cada grupo de
permisos. Cuando se usa 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
algunos permisos, mientras que el método numérico es mejor para cambios que son más drásticos.

Por ejemplo, para configurar los permisos de un archivo llamado abc.txt para que sea rwxr-xr,
puede usar el siguiente comando:

Recuerde que el comando stat proporciona información más detallada que el comando ls -l. Debido
a esto, puede considerar usar el comando stat en lugar del comando ls -l al ver los permisos en un
archivo. Una gran ventaja del comando stat es que muestra los permisos utilizando los métodos
simbólicos y numéricos, como se resalta a continuación:

17.9 Default Permissions

El comando umask es una característica que se utiliza para determinar los permisos
predeterminados que se establecen cuando se crea un archivo o directorio. Los permisos
predeterminados se determinan cuando el valor de umask se resta de los permisos predeterminados
máximos permitidos. Los permisos predeterminados máximos son diferentes para archivos y
directorios:
Los permisos que se establecen inicialmente en un archivo cuando se crea no pueden exceder rw-
rw-rw-. Para establecer el permiso de ejecución en un archivo, primero debe crear el archivo y
luego cambiar los permisos.

El comando umask se puede usar para mostrar el valor actual de umask:

Un desglose de la salida:

El primer 0 indica que la umask se da como un número octal.


El segundo 0 indica qué permisos restar de los permisos del propietario del usuario predeterminado.
El tercer 0 indica qué permisos restar de los permisos del propietario del grupo predeterminado.
El último número 2 indica qué permisos restar de los permisos predeterminados del otro.

Tenga en cuenta que diferentes usuarios pueden tener diferentes umasks. Por lo general, el usuario
raíz tiene una máscara de usuario más restrictiva que las cuentas de usuario normales:

El 027 umask significa que los archivos nuevos recibirían 640 o rw-r ----- permisos por defecto,
como se demuestra a continuación:
Debido a que los permisos predeterminados para los directorios son diferentes que para los
archivos, una umask de 027 daría como resultado diferentes permisos iniciales en los nuevos
directorios:

El 027 umask significa que los archivos de directorios recibirían 750 o rwxr-x --- permisos por
defecto, como se demuestra a continuación:

La nueva umask solo se aplica a archivos y directorios creados durante esa sesión. Cuando se inicia
un nuevo shell, la umask predeterminada volverá a estar vigente.

Cambiar permanentemente la máscara de usuario de un usuario requiere modificar el


archivo .bashrc ubicado en el directorio de inicio de ese usuario.

LAB 17

Command

chown → Sólo puede ser ejecutado por root, y puede cambiar tanto el usuario como el grupo que
poseen un archivo.
chgrp → Puede ser ejecutado por root y por el usuario propietario del archivo. Si es utilizado por el
usuario sólo puede cambiar la propiedad del grupo a un grupo del que sea miembro. Root puede
cambiar la propiedad del grupo de cualquier archivo a cualquier grupo.ç
Para cambiar user owner con chown siendo root:
Para cambiar la propiedad del grupo de todos los archivos de una estructura de directorio, use la
opción -R recursiva para el comando chgrp. Cambie el propietario del grupo de priv-dir y priv-file
al grupo de users de forma recursiva con el comando chgrp y vea los archivos actualizados:

18.1 Introduction

En la mayoría de los casos, los permisos básicos de Linux, read, write y executable, son suficientes
para satisfacer las necesidades de seguridad de usuarios u organizaciones individuales.

Sin embargo, cuando varios usuarios necesitan trabajar de manera rutinaria en los mismos
directorios y archivos, estos permisos pueden no ser suficientes. Los permisos especiales setuid,
setgid y sticky bit están diseñados para abordar estas preocupaciones.

18.2 Setuid

Cuando el permiso setuid se establece en un archivo binario ejecutable (un programa), el archivo
binario se ejecuta como el propietario del archivo, no como el usuario que lo ejecutó. Este permiso
se establece en un puñado de utilidades del sistema para que puedan ser ejecutadas por usuarios
normales, pero ejecutadas con los permisos de root, proporcionando acceso a los archivos del
sistema a los que el usuario normal normalmente no tiene acceso.
Considere el siguiente escenario en el que el usuario sysadmin intenta ver el contenido del archivo
etc/shadow:

Los permisos en /etc/shadow no permiten a los usuarios normales ver (o modificar) el archivo.
Dado que el archivo es propiedad del usuario root, el administrador puede modificar temporalmente
los permisos para ver o modificar este archivo.
Ahora considere el comando passwd. Cuando se ejecuta este comando, modifica el archivo
/etc/shadow, lo que parece imposible porque fallan otros comandos que ejecuta el usuario sysadmin
que intentan acceder a este archivo. Entonces, ¿por qué el usuario sysadmin puede modificar el
archivo /etc/shadow mientras ejecuta el comando passwd cuando normalmente este usuario no tiene
acceso al archivo?
El comando passwd tiene el conjunto especial de permisos setuid. Cuando se ejecuta el comando
passwd, y el comando accede al archivo /etc/shadow, el sistema actúa como si el usuario que accede
al archivo sea el propietario del comando passwd (el usuario root), no el usuario que ejecuta el
comando.

Puede ver este conjunto de permisos ejecutando el comando ls -l:

El permiso setuid está representado por la s en los permisos del propietario donde normalmente se
representaría el permiso executable. Una s minúscula significa que se establecen tanto el permiso
setuid como el permiso executable, mientras que una S mayúscula significa que solo se establece
setuid y no el permiso executable del usuario.
Al igual que los permisos read, write y executable, se pueden establecer permisos especiales con el
comando chmod, utilizando los métodos simbólicos y octales.

Para agregar el permiso setuid simbólicamente, ejecute:

Para agregar el permiso setuid numéricamente, agregue 4000 a los permisos existentes del archivo
(suponga que el archivo originalmente tenía 775 para su permiso en el siguiente ejemplo):
Para eliminar el permiso setuid simbólicamente, ejecute:

Para eliminar el permiso setuid numéricamente, reste 4000 de los permisos existentes del archivo:

Anteriormente, 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. Solo cuando se especifican cuatro dígitos hay un conjunto de
permisos especial.

Si se especifican tres dígitos al cambiar el permiso en un archivo que ya tiene un conjunto de


permisos especial, el primer dígito se establecerá en 0 y el permiso especial se eliminará del
archivo.

18.3 Setgid

El permiso setgid es similar a setuid, pero utiliza los permisos del propietario del grupo. Hay dos
formas de permisos setgid: setgid en un archivo y setgid en un directorio. El comportamiento de
setgid depende de si está configurado en un archivo o directorio.

18.3.1 Setgid on Files

El permiso setgid en un archivo permite a un usuario ejecutar un archivo binario ejecutable de una
manera que le proporciona acceso grupal adicional (temporal). El sistema permite al usuario que
ejecuta el comando pertenecer al grupo que posee el archivo, pero solo en el programa setgid.
Un buen ejemplo del permiso setgid en un archivo ejecutable es el comando /usr/bin/wall. Observe
los permisos para este archivo, así como el propietario del grupo:

Puede ver que este archivo está establecido por la presencia de s en la posición de ejecución del
grupo. Debido a que este ejecutable es propiedad del grupo tty, cuando un usuario ejecuta este
comando, el comando puede acceder a los archivos que pertenecen al grupo tty.
Este acceso es importante porque el comando /usr/bin/wall envía mensajes a los terminales, lo que
se logra escribiendo datos en archivos como el siguiente:

Tenga 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.

18.3.2 Setgid on Directories

Cuando se establece en un directorio, el permiso setgid hace que los archivos creados en el
directorio sean propiedad del grupo que posee el directorio automáticamente. Este comportamiento
es contrario a cómo funcionaría normalmente la propiedad de un nuevo grupo de archivos, ya que
de manera predeterminada los archivos nuevos son propiedad del grupo principal del usuario que
creó el archivo.
Además, cualquier directorio creado dentro de un directorio con el conjunto de permisos setgid no
solo es propiedad del grupo que posee el directorio setgid, sino que el nuevo directorio también
tiene setgid establecido automáticamente. En otras palabras, si un directorio es setgid, los
directorios creados dentro de ese directorio heredan el permiso setgid.
Por defecto, cuando el comando ls se ejecuta en un directorio, genera información sobre los
archivos contenidos en el directorio. Para ver información sobre el directorio en sí, agregue la
opción -d. Utilizado con la opción -l, puede utilizarse para determinar si se establece el permiso
setgid. El siguiente ejemplo muestra que el directorio /tmp/data tiene el conjunto de permisos
setgid y que es propiedad del grupo demo.
chmod g+s [direectory]

Una s minúscula significa que se establecen los permisos de ejecución de grupo y setgid:

Una S mayúscula significa que solo se establece setgid y no el permiso de ejecución de grupo. Si ve
una S mayúscula en la posición de ejecución de los permisos del grupo, entonces indica que aunque
el permiso setgid está configurado, en realidad no está vigente porque el grupo carece del permiso
de ejecución para usarlo:

si el usuario sysadmin crea un archivo en el directorio / tmp / data, el directorio setgid del ejemplo
anterior, la propiedad del archivo del grupo no es el grupo sysadmin, sino el grupo demo propietario
del directorio:

¿Por qué querría un administrador configurar un directorio setgid? Primero, considere las siguientes
cuentas de usuario:
• El usuario bob es miembro del grupo payroll

• El usuario sue es miembro del grupo staff.

• La usuario tim es miembro del grupo acct

En este escenario, 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:
1. Crean un nuevo grupo llamado team
2. Agrega a bob, sue, y tim al grupo team
3. Hace un nuevo directorio llamado /home/team
4. Hace que el grupo team sea el grupo propietario del directorio /home/team
5. Da al directorio /home/team los siguientes permisos rwxrwx---

Como resultado, bob, sue y tim pueden acceder al directorio /home/team y agregar archivos. Sin
embargo, existe un problema potencial: cuando bob crea un archivo en el directorio /home/team, el
nuevo archivo es propiedad de su grupo principal:

Desafortunadamente, aunque 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 otros permisos (---).

Si el administrador establece el permiso setgid en el directorio /home/team, cuando bob crea un


archivo, es propiedad del grupo del equipo:
Como resultado, sue y Tim tendrían acceso al archivo a través de los permisos del propietario del
grupo (r--).Ciertamente, Bob podría cambiar la propiedad del grupo o los otros permisos después de
crear el archivo, pero eso sería tedioso si se crearan muchos archivos nuevos. El permiso setgid lo
hace más fácil para esta situación.

18.3.3 Setting Setgid

Use la siguiente sintaxis para agregar el permiso setgid simbólicamente:

Para agregar el permiso setgid numéricamente, agregue 2000 a los permisos existentes del archivo
(suponga en el siguiente ejemplo que el directorio originalmente tenía 775 para sus permisos):

Para eliminar el permiso setgid simbólicamente, ejecute:

Para eliminar el permiso setgid numéricamente, reste 2000 de los permisos existentes del archivo:

18.4 Sticky Bit

El permiso sticky bit se utiliza para evitar que otros usuarios eliminen archivos que no son de su
propiedad en un directorio compartido. Recuerde que cualquier usuario con permiso write en un
directorio puede crear archivos en ese directorio, así como eliminar cualquier archivo en el
directorio, ¡incluso si no posee el archivo!
El permiso sticky bit permite que los archivos se compartan con otros usuarios, al cambiar el
permiso write en el directorio para que los usuarios puedan agregar y eliminar archivos en el
directorio, pero los archivos solo pueden ser eliminados por el propietario del archivo o por root.
Un buen ejemplo del uso de directorios de bits fijos 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 escritos por todos los usuarios, están
configurados para usar sticky bit. Sin este permiso especial, los usuarios podrían eliminar cualquier
archivo en este directorio, incluidos los que pertenecen a otros usuarios.
La salida del comando ls -l muestra sticky bit por un carácter t en el bit executable del grupo de
permisos de otros:

Una t minúscula significa que tanto el sticky bit como los permisos de executable están
configurados para otros. Una T mayúscula significa que solo se establece el permiso de sticky bit.
Mientras que la S mayúscula indica un problema con los permisos setuid o setgid, una T
mayúscula no necesariamente indica un problema, siempre y cuando el propietario del grupo aún
tenga el permiso executable.
Para establecer el permiso de sticky bit simbólicamente, ejecute un comando como el siguiente:

Para establecer el permiso de sticky bit numéricamente, agregue 1000 a los permisos existentes del
directorio (suponga que el directorio en el siguiente ejemplo originalmente tenía 775 para sus
permisos):

Para eliminar el permiso sticky bit simbólicamente, ejecute:

‌ ara eliminar el permiso sticky bit numéricamente, reste 1000 de los permisos existentes del
P
directorio:
18.5 Links

Considere un escenario donde hay un archivo enterrado en el sistema de archivos llamado:


/usr/share/doc/superbigsoftwarepackage/data/2013/october/tenth/
valuable-information.txt

Otro usuario actualiza rutinariamente este archivo, y debe acceder a él regularmente. El nombre de
archivo largo no es una opción ideal para escribir, pero el archivo debe residir en esta ubicación.
También se actualiza con frecuencia, por lo que no puede simplemente hacer una copia del archivo.
En una situación como esta, los links son útiles. Puede crear un archivo que esté vinculado al que
está profundamente enterrado. Este nuevo archivo podría colocarse en el directorio de inicio o en
cualquier otra ubicación conveniente. Cuando accede al archivo vinculado, accede al contenido del
archivo valioso-información.txt.
Cada método de enlace, hard & symbolic, da como resultado el mismo acceso general, pero utiliza
diferentes técnicas. Hay ventajas y desventajas de cada método, por lo que es importante conocer
ambas técnicas y cuándo usarlas.

18.5.1 Creating Hard Links

Para comprender los hard links, es útil comprender un poco sobre cómo el sistema de archivos
realiza un seguimiento de los archivos. Para cada archivo creado, hay un bloque de datos en el
sistema de archivos que almacena los metadatos del archivo. Los metadatos incluyen información
sobre el archivo, como los permisos, la propiedad y las marcas de tiempo. Los metadatos no
incluyen el nombre del archivo o el contenido del archivo, pero sí incluyen casi toda otra
información sobre el archivo.
Este metadato se denomina tabla de inodo del archivo. La tabla de inodo también incluye punteros
a los otros bloques en el sistema de archivos llamados bloques de datos donde se almacenan los
datos.
Cada archivo en una partición tiene un número de identificación único llamado número de inodo. El
comando ls -i muestra el número de inodo de un archivo.

Al igual que los usuarios y grupos, lo que define un archivo no es su nombre, sino el número que se
le ha asignado. La tabla de inodo no incluye el nombre del archivo. Para cada archivo, también hay
una entrada que se almacena en el área de datos de un directorio (data block) que incluye una
asociación entre un número de inodo y un nombre de archivo.

En el bloque de datos para el directorio /etc, habría una lista de todos los archivos en este directorio
y su número de inodo correspondiente. Por ejemplo:

Cuando intenta acceder al archivo /etc/passwd, el sistema usa esta tabla para traducir el nombre del
archivo a un número de inodo. Luego recupera los datos del archivo mirando la información en la
tabla de inodo para el archivo.

Los hard links son dos nombres de archivo que apuntan al mismo inodo. Por ejemplo, considere
las siguientes entradas de directorio:

Debido a que tanto el archivo passwd como mypasswd tienen el mismo número de inodo,
esencialmente son el mismo archivo. Puede acceder a los datos del archivo con cualquier nombre de
archivo.
Cuando ejecuta el comando ls -li, el número que aparece para cada archivo entre los permisos y el
propietario del usuario es el link count number (contador de enlace):
El número de contador de enlaces indica cuántos enlaces duros se han creado. Cuando el número es
un valor de uno, el archivo solo tiene un nombre vinculado al inodo.

Para crear hard links, el comando ln se usa con dos argumentos. El primer argumento es un
nombre de archivo existente para vincular, llamado target, y el segundo argumento es el nuevo
nombre de archivo para vincular al target.

Cuando el comando ln se usa para crear un hard llink, el número de conteo de enlaces aumenta en
uno por cada nombre de archivo adicional:

18.5.2 Creating Symbolic Links

Un symbolic link, también llamado soft link, es simplemente un archivo que apunta a otro archivo.
Ya hay varios enlaces simbólicos en el sistema, incluidos varios en el directorio /etc:

En el ejemplo anterior, el archivo /etc/grub.conf "apunta" al archivo ../boot/grub/grub.conf.


Entonces, si intentara ver el contenido del archivo /etc/grub.conf, seguiría el puntero y le mostraría
el contenido del archivo ../boot/grub/grub.conf.

Para crear un enlace simbólico, use la opción -s con el comando ln:

Observe que el primer bit de la salida ls -l es el carácter l, lo que indica que el tipo de archivo es un
enlace.
18.5.3 Comparing Hard and Symbolic Links

Si bien los hard link y symbolics tienen el mismo resultado, las diferentes técnicas producen
diferentes ventajas y desventajas. De hecho, la ventaja de una técnica compensa una desventaja de
la otra técnica.
Uno de los beneficios de usar hard links es que cada nombre de archivo para el contenido del
archivo es equivalente. Si tiene cinco archivos enlazados entre sí, eliminar cuatro de estos archivos
no eliminará el contenido real del archivo.

Recuerde que un archivo está asociado con un número de inodo único. Mientras permanezca uno de
los archivos vinculados, entonces ese número de inodo todavía existe y los datos del archivo aún
existen.

Sin embargo, los symbolic links tienen un único punto de falla: el archivo original. Considere el
siguiente ejemplo en el que el acceso a los datos falla si se elimina el archivo original. El archivo
mytest.txt es un enlace simbólico al archivo text.txt:

Si el archivo original, el archivo test.txt se elimina, los archivos vinculados a él, incluido el archivo
mytest.txt, fallarán:

Ventaja: los soft links son más fáciles de ver.

A veces puede ser difícil saber dónde existen los hard links a un archivo. Si ve un archivo normal
con un contador de enlaces mayor que uno, puede usar el comando find con los criterios de
búsqueda -inum para ubicar los otros archivos que tienen el mismo número de inodo. Para
encontrar el número de inodo, primero debe usar el comando ls -i:
Los soft links son mucho más visuales, no requieren ningún comando adicional más allá del
comando ls para determinar el enlace:

Ventaja: los soft links pueden enlazar a cualquier archivo.

Como cada sistema de archivos (partición) tiene un conjunto separado de inodos, no se pueden
crear hard links que intenten cruzar sistemas de archivos:

En el ejemplo anterior, se intentó crear un hard link entre un archivo en el sistema de archivos /
boot y el sistema de archivos /; falló porque cada uno de estos sistemas de archivos tiene un
conjunto único de números de inodo que no se pueden usar fuera del sistema de archivos.

Sin embargo, debido a que un soft link apunta a otro archivo usando un nombre de ruta, puede crear
un enlace suave a un archivo en otro sistema de archivos:

Ventaja: los soft links pueden enlazar a un directorio.

Otra limitación de los hard links es que no se pueden crear en directorios. La razón de esta
limitación es que el propio sistema operativo utiliza hard links para definir la jerarquía de la
estructura del directorio. El siguiente ejemplo muestra el mensaje de error que se muestra si intenta
vincular a un directorio:
Se permite vincular a directorios utilizando un symbolic link (soft link):

LAB 18

Ver los permisos del archivo /usr/bin/passwd

Observe los s en la columna de permiso executable del usuario. Esto indica que este archivo tiene el
conjunto de permisos setuid, por lo que se ejecuta como el usuario propietario (root) en lugar del
usuario que ejecuta el comando.

Por lo tanto, el comando passwd puede actualizar el archivo /etc/shadow, ya que se ejecuta como
usuario root (recuerde que el usuario root puede editar cualquier archivo, independientemente de los
permisos del archivo).

Ver los permisos en el comando /usr/bin/wall :

La s en la columna executable del grupo indica que este archivo tiene el conjunto de permisos
setgid, por lo que se ejecuta como el grupo que lo posee (tty) en lugar del grupo del usuario que
ejecuta el comando. Por lo tanto, el comando wall puede escribir en todos los terminales (ttys)
mientras se ejecuta como el grupo tty.
Hasta ahora, ha visto tres tipos de permisos especiales: sticky bit en un directorio, setuid en un
archivo ejecutable y setgid en un archivo ejecutable. Como ha visto, estos tres tipos existen en un
sistema típico.

Se puede usar un tipo de permiso especial más; El permiso setgid también se puede aplicar a un
directorio:

drwxrwsrwx. 2 root demo 4096 Oct 30 23:20 /tmp/data

Si ve las s en la columna de ejecución para el grupo que posee el directorio, entonces el


directorio tiene el permiso setgid. Cuando un directorio tiene el permiso setgid, cualquier nuevo
archivo o directorio creado en ese directorio será automáticamente propiedad del grupo
propietario del directorio, no del grupo del usuario que creó el archivo.

Hard links

El sistema operativo Linux usa inodes para realizar un seguimiento de la información sobre un
archivo. Una entrada de directorio asocia un inodo con un nombre de archivo.

La creación de un hard link crea otra entrada de directorio asociada con un inodo existente y
aumentará el número de contador de enlaces.

Los hard links le permiten usar múltiples nombres para referirse al mismo archivo. Si alguno de
estos nombres se elimina, los otros nombres aún pueden usarse para referirse al archivo.

De hecho, estos otros nombres pueden incluso usarse para crear enlaces adicionales. Todos estos
nombres se consideran equivalentes, ya que todos se refieren a un inodo existente.

Important-
No puede crear hard links a directorios. Además, debe existir un hard link a un archivo
dentro del mismo sistema de archivos (partición) que el archivo al que se vincula.

Para crear hard links, el comando ln se usa con dos argumentos. El primer argumento es un
nombre de archivo existente para vincular, llamado target, y el segundo argumento es el nuevo
nombre de archivo que se vinculará al target
Otro tipo de enlace que se puede crear se conoce como symbolic link o soft link. Los symbolic
links no aumentan el recuento de enlaces de los archivos con los que están vinculados.

Los archivos de symbolic links tienen su propio inodo y tipo de archivo. En lugar de vincular y
compartir un inodo, se vinculan al nombre del archivo. A diferencia de los hard links, los soft links
pueden vincularse a directorios y pueden cruzar dispositivos y particiones a sus objetivos.

La opción -s para el comando ln crea un soft link en lugar de un enlace duro. Cree un enlace
simbólico al archivo de origen y vea los detalles de ambos archivos:

La salida resaltada muestra que el softlink y el archivo fuente tienen inodos diferentes. Tenga en
cuenta que el tipo de enlace del archivo se crea al hacer un enlace simbólico. Los permisos del
enlace son irrelevantes, ya que son los permisos del archivo de destino los que determinan el
acceso.

También podría gustarte