Linux Essential
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.
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.
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
Cost
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.
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.
Life Cycle
Las distribuciones de Linux pueden clasificarse en dos categorías principales:
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.
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
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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. .
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.
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
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.
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.
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.
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 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.
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.
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.
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.
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.
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
Flexibilidad
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.
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.
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.
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.
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.
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.
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:
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.
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
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.
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'
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:
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.
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:
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:
/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.
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.
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:
El uso de la opción « -a » del comando type muestra todas las ubicaciones que contienen el
comando al que se llama:
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.
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:
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.
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 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.
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:
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:
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
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
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
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
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
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
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.
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
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.
-a, --all
do not ignore entries starting with .
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
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
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
REPORTING BUGS
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report ls translation bugs to <http://translationproject.org/team/>
COPYRIGHT
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'
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).
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)
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:
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:
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:
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:
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]]
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.
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.
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.
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:
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.
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.
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.
sysadmin@localhost:~$ info ls
The `ls' program lists information about files (of any type, including directories). Options and file arguments
* Menu:
Next: Details about version sort, Prev: What information is listed, Up: ls in\
vocation
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.
'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
Examples:
cat f - g Output f's contents, then standard input, then g's contents.
cat Copy standard input to standard output.
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.
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
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:
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)
sysadmin@localhost:~$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
sysadmin@localhost:~$ \ls
Desktop Documents Downloads Music Pictures Public Templates Videos
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.
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:
Los siguientes nueve caracteres muestran los permisos del archivo. Como ciertos usuarios pueden
acceder al archivo.
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.
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:
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.
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.
File Name
El campo final contiene el nombre del archivo o directorio:
En el caso de symbolic links, el nombre del enlace se muestra junto con una flecha y la ruta del
archivo original.
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 -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.
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
Para ordenar los archivos por tamaño, podemos usar la opción -S.
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.
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:
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:
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:
El siguiente comando enumerará los archivos por fecha de modificación, de la más antigua a la más
nueva:
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:
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:
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
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:
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:
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
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:
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:
El patrón / etc / * [0-9] * muestra cualquier archivo que contenga al menos un número:
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.
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:
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
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
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.
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.
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
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:
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/..'
sysadmin@localhost:~$ cp -n /etc/skel/.* ~
cp: -r not specified; omitting directory '/etc/skel/.'
cp: -r not specified; omitting directory '/etc/skel/..'
***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! ***
En el siguiente ejemplo se mueve el archivo hosts, del directorio actual al directorio videos.
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:
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***
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$ 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
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
9.1 Introduction
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.
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.
***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:
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:
El siguiente ejemplo muestra el mismo comando que el ejemplo anterior, pero con la adición de la
opción -z.
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.
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.
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:
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.
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
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
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:
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.
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:
Un segundo intento pasa el componente del directorio junto con el nombre del archivo, que extrae
solo ese archivo.
La tercera versión usa un comodín, que extrae los cuatro archivos que coinciden con el patrón, al
igual que tar.
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.
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
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.
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
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
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.
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.
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
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.
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
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.
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:
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:
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>:
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
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.
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:
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 < :
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.
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.
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.
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:
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:
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
Para ver estadísticas específicas, hay opciones que se pueden usar solas o combinadas:
• -l : To show just the number of lines
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+):
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:
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.
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
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.
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:
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
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.
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”:
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:
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 $:
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
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:
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:
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
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:
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.
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:
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
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!
#!/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.
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.
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
• 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
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.
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).
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
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
#!/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
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 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
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
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:
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
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.
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.
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:
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:
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:
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:
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
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
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 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:
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 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
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.
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
Descriptive Header:
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:
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:
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
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.
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.
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:
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.
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.
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.
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
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.
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.
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
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.
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.
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.
Para realizar cambios en una interfaz de red estos son los pasos aunque hay más métodos:
• ifdown eth0 (Tirar la 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)
Output Omitted...
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.
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
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
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.
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
sysadmin@localhost:~ ss -s
Total: 1000 (kernel 0)
TCP: 7 (estab 0, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
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.
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
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
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:
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
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.
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
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)
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.
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.
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
Si bien los usuarios habituales tienen contraseñas cifradas en este campo, las cuentas del sistema
tienen un asterisco * en este campo.
Last Change:
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:
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
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:::
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:
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:
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:
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.
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:
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.
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:
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
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 _).
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
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:
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.
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.
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:
Mail Directory
El directorio en el que se crea el archivo de spool de correo del usuario.
Las organizaciones con políticas efectivas para mantener contraseñas seguras suelen cambiar este
valor a 60 o 30 días.
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.
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.
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
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.
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
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 -
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.
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.
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.
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)
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:
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:
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
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.
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:
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:
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:
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.
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:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
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:
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.
Un desglose de la salida:
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.
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.
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 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.
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.
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.
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
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 (---).
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 numéricamente, reste 2000 de los permisos existentes del archivo:
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):
ara eliminar el permiso sticky bit numéricamente, reste 1000 de los permisos existentes del
P
directorio:
18.5 Links
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.
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:
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:
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:
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:
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:
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
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).
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:
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.