Linux
Linux
Introducción 3
Conceptos Básicos 4
1. La Shell de Linux 4
1.1 Clear, history 4
1.2 Type 6
1.3 Help, man, info, whatis, apropos 7
1.4 Atajos de teclado de interés 9
1.5 Caso práctico: Creando nuestro propio Alias 9
2. Sistema de ficheros 10
2.1 Sistema de ficheros de Linux 11
2.2 Navegación 12
2.3 Creación de ficheros y editores de texto 13
2.4 Visualización de ficheros y directorios 14
2.4 Búsqueda de ficheros y directorios 16
2.5 Principales directorios de Linux 17
3. Conceptos avanzados del sistema de ficheros 18
3.1 Inodos: Asignación indexada 19
3.2 Dentries 23
3.3 Enlaces simbólicos 24
3.4 Enlaces duro 25
3.5 Wildcards 27
3.5 Shell Expansions 28
3.6 Command Substitution 29
3.7 Comillas en la Shell de Linux 29
3.8 Escapando caracteres 31
4. Redirecciones y pipelines 32
4.1 I/O Redirection 32
4.2 Standard Output 33
4.3 Standard Error 34
4.4 /dev/null 36
4.5 Standard Input 36
4.6 Pipelines 36
4.7 Filtros y búsquedas 37
5. Permisos y usuario 39
5.1 Permisos y usuarios 39
5.2 Lectura, escritura y ejecución 44
5.3 Usuario root 45
5.4 Modificación de permisos en octal 47
5.5 Modificación de permisos simbólica 48
5.6 Permisos por defecto 48
5.7 Setuid, Setgid, Sticky Bit 49
5.8 Cambio de identidad 51
5.9 Sudo 54
5.10 Sudoers 55
5.11 Gestión de usuarios y grupos 58
5.12 Cambio de propietario 61
6. Procesos 62
6.1 Procesos en Linux 62
6.2 Visualización estática de procesos 64
6.3 Visualización dinámica de procesos 66
6.4 Interrupción procesos 68
6.5 Señales 69
6.6 Init, demonios y servicios 72
6.7 Gestión de servicios 74
6.8 Apagado del sistema 76
6.9 Cambio de prioridad 77
6.10 Proceso de arranque de un ordenador 78
7. Redes 81
7.1 Interfaces de red 81
8. Gestión de paquetes y librerías 82
8.1 Buscar, instalar y actualizar paquetes 82
8.2 Instalación manual de paquetes 84
8.3 Eliminar, listar y buscar paquetes ya instalados 85
8.4 Actualizar la distribución de Linux 86
8.5 Añadir nuevos repositorios de paquetes 87
9. El entorno en Linux 88
9.1 El entorno en Linux 88
9.2 Como se establece el entorno 89
9.3 Modificando el entorno 91
9.4 Variables de entorno interesantes 93
10. Dispositivos de almacenamiento externos 93
10.1 Dispositivos extraibles 93
10.2 Montar y desmontar un dispositivo 94
10.3 Identificar el nombre del dispositivo 95
11. Archivando y comprimiendo archivos 96
11.1 Comprimiendo y descomprimiendo ficheros 96
Introducción
En 1969, Kenneth Thompson y Dennis Ritchie (AT&T Bell Labs) desarrollaron UNIX OS
en ensamblador. En 1971, Thompson y Ritchie crearon el lenguaje de programación C y
reimplementaron UNIX OS proporcionando portabilidad en base a este lenguaje. AT&T era
el único propietario de UNIX, por ello, en 1983, Richard Stallman inició el proyecto GNU
(GNU's Not Unix) para crear un sistema operativo similar a UNIX OS gratuito. Al mismo
tiempo, Richard Stallman escribió la licencia GPL (GNU General Public License). GNU
nunca llegó a ser un sistema operativo estable y completo. En 1987, Andrew S.
Tanenbaum desarrolló MINIX, un Sistema Operativo de uso académico similar a UNIX OS.
El código de MINIX era de acceso público; sin embargo, no podía modificarse o
distribuirse. Estos sucesos, unidos a la aparición de un nuevo procesador de Intel al que los
Sistemas Operativos anteriores no se adaptaban bien, dieron paso a Linux.
Linus Torvalds publica el primer Kernel de Linux bajo su propia licencia con ciertas
restricciones de actividades comerciales. Desde el primer momento Linux incluía software
de aplicación procedente del proyecto GNU, por ejemplo, GNU BASH.
Los usuarios pueden acceder a la shell a través de la terminal, que es una interfaz de texto
en la que ingresan comandos y reciben la salida correspondiente del sistema. También
existen entornos de escritorio en Linux que proporcionan interfaces gráficas, pero muchos
usuarios avanzados y administradores del sistema prefieren la eficiencia y flexibilidad de la
shell para ciertas tareas.
si@si-VirtualBox:~$
En este caso:
Después del prompt, el usuario puede escribir comandos y presionar Enter para que la shell
los ejecute. El prompt es una parte importante de la interfaz de línea de comandos,
proporcionando información sobre el estado actual y permitiendo la interacción del usuario
con el sistema.
1.2 Type
Existen diferentes tipos de comandos en el sistema que podemos ver con el comando
type, como pueden ser comandos directamente implementados dentro de la propia shell.
Otros, donde el ejecutable es un programa externo invocado por la shell y se encuentra en
una ruta específica. También hay comandos escritos en shell script y alias (shortcuts) con
diferentes argumentos que queremos que se ejecuten con el comando base; este es el caso
del comando ls.
Además de esto, tenemos que destacar que los comandos pueden aceptar parámetros
(aumentan o dan un comportamiento diferente a un comando) y argumentos (proporcionan
información específica sobre cómo ejecutar el comando).
También tenemos otras herramientas como los comandos man (man ls nos da información
del comando ls en detalle), info o whatis. Otro es el comando apropos en Linux se
utiliza para buscar y mostrar información sobre comandos disponibles en el sistema. Su
función principal es proporcionar una lista de comandos relacionados con una palabra clave
dada. Este comando es especialmente útil cuando no estás seguro del nombre exacto de un
comando, pero tienes una idea de lo que debería hacer.
Por otra parte, tenemos el manejo de comandos y expresiones lógicas que nos permiten
ejecutar varios comandos en una única línea. Si bien es cierto que podemos partir
comandos como en el siguiente ejemplo:
Podemos ejecutar comandos en una única línea separando por ; los comandos o añadiendo
operadores lógicos como && o || que permitan discriminar cuándo ejecutar según qué
comando.
Para crear un alias primero tenemos que asegurarnos de que no existe en el sistema ningún
comando o alias anteriormente creado y alias nombre_alias=’comando/s del
alias’. El resultado de nuestro alias será el siguiente:
Ya hemos visto que algunos programas externos de la shell, como el comando which, se
encuentran en una ruta determinada del sistema de ficheros, en este caso,
/usr/bin/which. Cada vez que nosotros ejecutamos un programa de este tipo, la shell
debe resolver la ruta e ir a buscar el archivo externo para ejecutarlo.
Para evitar tener que realizar todas estas acciones en comandos que utilizamos de manera
muy frecuente, la shell puede mantener una lista de programas con su ruta asociada
(entenderemos mejor en qué consiste la resolución de la ruta cuando hablemos del entorno
y de la variable PATH en siguientes secciones del curso). Esta lista se llama tabla hash
(hash table).
Cuando la shell nos dice que un comando "is hashed", significa que ya ha resuelto su ruta y
la ha guardado en la hash table para acceder a ella mucho más rápido. Si queréis
comprobar qué comandos tenéis en la hash table, podéis ejecutar el comando hash en la
shell de Linux. Por otro lado, si queréis eliminar todas las entradas de vuestra hash table y
que ningún comando aparezca como "is hashed" podéis ejecutar el comando hash -r
Tened en cuenta que aunque borréis la tabla, cuando volváis a ejecutar algunos comandos
como which, la shell los añadirá de nuevo a la hash table para evitar resolver su ruta en el
futuro.
2. Sistema de ficheros
Aquí hay algunos conceptos clave relacionados con el sistema de archivos en Linux:
Vamos a ejecutar un comando que es el comando tree, para ello tenemos que instalar el
comando con el comando: sudo apt install tree. Vamos a proceder a explorar el
sistema de ficheros desde el directorio / con una profundidad de un nivel.
2.2 Navegación
A mayores, tenemos múltiples comandos de interés para poder manejarnos por el sistema
de ficheros de Linux. Varios de estos son los comandos:
● Este comando muestra la ruta del directorio actual en el que te encuentras. Es útil
para saber en qué parte de la estructura de directorios estás trabajando.
ls - List:
cd - Change Directory:
● Este comando se utiliza para abrir o crear archivos en la terminal para su edición.
file: Este comando se utiliza para determinar el tipo de archivo. Nos dirá el tipo de
archivo, por ejemplo, si es un archivo de texto, un archivo binario, etc.
more: Este comando se utiliza para ver el contenido de un archivo página por página.
less: Similar a more, pero más potente. less permite navegar hacia adelante y hacia atrás
en el contenido de un archivo.
cat: Este comando se utiliza para mostrar el contenido completo de un archivo en la salida
estándar. Su nombre viene de "concatenar" ya que originalmente se usaba para concatenar
y mostrar el contenido de varios archivos.
cp origen destino
Por ejemplo, para copiar un archivo llamado archivo.txt a un directorio llamado
destino:
cp archivo.txt destino/
Si deseas copiar un directorio y su contenido recursivamente, usamos la opción -r o -R:
cp -r directorio_origen destino/
mv (move): Este comando se utiliza para mover o renombrar archivos y directorios. La
sintaxis básica es similar a cp:
mv origen destino
Para cambiar el nombre de un archivo, simplemente proporciona el nuevo nombre como
destino.
mv antiguo_nombre.txt nuevo_nombre.txt
También puedes utilizar mv para mover archivos y directorios a otro lugar:
mv archivo.txt directorio_destino/
rm (remove): Este comando se utiliza para eliminar archivos o directorios. La sintaxis básica
para eliminar un archivo es:
rm nombre_del_archivo
Si deseas eliminar un directorio y su contenido de manera recursiva, puedes usar la opción
-r o -R:
rm -r nombre_del_directorio
Ten mucho cuidado al utilizar rm -r porque eliminará los archivos y directorios sin solicitar
confirmación y de forma irreversible.
2.4 Búsqueda de ficheros y directorios
El comando find en sistemas Unix/Linux se utiliza para buscar archivos y directorios en un
sistema de archivos basándose en diversos criterios. Puede ser una herramienta muy
poderosa para buscar y filtrar archivos según diferentes parámetros. Aquí te dejo una
descripción básica de su uso: La sintaxis básica de find es la siguiente:
find ruta -opciones patrón
1. / (Raíz): El directorio raíz es el nivel superior del sistema de archivos. Todos los
demás directorios y archivos están contenidos dentro de este.
2. /bin (Binarios): Contiene binarios esenciales (ejecutables) del sistema. Estos son
programas que son necesarios para el sistema operativo, incluso cuando el sistema
de archivos principal no está montado. En la actualidad este no existe y tenemos un
enlace simbólico con usr/bin.
3. /boot: Contiene archivos relacionados con el proceso de arranque del sistema,
como el kernel del sistema operativo y otros archivos necesarios para el inicio del
sistema.
4. /dev (Dispositivos): Contiene archivos de dispositivo que representan hardware o
dispositivos del sistema. Por ejemplo, /dev/sda podría representar el primer disco
duro.
5. /etc (Configuración): Almacena archivos de configuración del sistema y de las
aplicaciones. Aquí se encuentran archivos de configuración importantes, como
/etc/passwd y /etc/network.
6. /home: Directorio base para los directorios personales de los usuarios. Cada usuario
tiene un subdirectorio aquí con su nombre de usuario.
7. /lib, lib32, /lib64 y libx32 (Bibliotecas): Contienen bibliotecas
compartidas necesarias para los programas del sistema y las aplicaciones.
8. /mnt (Montaje): Tradicionalmente utilizado como un lugar para montar
temporalmente sistemas de archivos externos.
9. /opt (Opcional): Algunas aplicaciones de software pueden ser instaladas en este
directorio (instalación de módulos de pago si lo deseara el usuario en función de sus
necesidades). Cada aplicación tiene su propio subdirectorio en /opt.
10. /proc: Un sistema de archivos virtual que proporciona información sobre los
procesos y el sistema en tiempo de ejecución.
11. /root: El directorio de inicio del usuario root (superusuario).
12. /sbin (Binarios de sistema): Similar a /bin, pero contiene programas ejecutables
utilizados principalmente por el superusuario para la administración del sistema.
13. /srv (Servicios): Contiene datos específicos de servicios proporcionados por el
sistema al exterior (servidores HTTP, FTP…).
14. /tmp (Temporal): Un directorio utilizado para almacenar archivos temporales.
15. /usr (Usuarios): Contiene archivos y subdirectorios relacionados con usuarios,
incluyendo binarios, bibliotecas, encabezados y documentación.
16. /var (Variables): Contiene archivos variables, como registros (/var/log), archivos
temporales (/var/tmp) y otros datos que pueden cambiar durante el tiempo de
ejecución del sistema.
A diferencia de lo que ocurría en los sistemas de tipo FAT, solo se mantendrán en memoria
los i-nodos de aquellos archivos y directorios que estén siendo utilizados en el momento. Se
produce fragmentación externa, pero dado que las asignaciones no se realizan de manera
contigua, esto no genera problemas de relevancia. La estructura básica de un sistema de
archivos EXT, con asignación indexada, es la siguiente:
● Un i-nodo guarda:
○ Como ya dijimos, metainformación sobre el archivo o directorio al que está
asociado.
○ Una serie de punteros a bloques (bloques directos) que contienen los datos
del archivo.
○ Un puntero a un bloque de indirección simple.
○ Un puntero a un bloque de indirección doble. o Un puntero a un bloque de
indirección triple.
● Un bloque de indirección simple guarda punteros a bloques (bloques directos) que
contienen datos del archivo.
● Un bloque de indirección doble guarda punteros a bloques de indirección simple.
● Un bloque de indirección triple guarda punteros a bloques de indirección doble.
En el ejemplo anterior, vemos un sistema en el que cada bloque dispone de 10 campos que
pueden ser utilizados para contener información, metadatos o punteros a otros bloques.
Tenemos:
Si nosotros creamos un nuevo fichero en el sistema, este fichero, al igual que cualquier otro
fichero o directorio del sistema, va a tener un inodo con la información de este (metadatos).
/dev/sda3 (Raíz del sistema): En esta partición del disco está el sistema
de archivos principal del equipo, montado en la raíz ("/"). Tiene un total de
3244032 inodos, de los cuales 223147 están en uso. Hay 3020885 inodos
libres, y el porcentaje de inodos utilizados es del 7%.
A mayores hay que decir que al tener un número de inodo asociado a cada
fichero podría darse el caso de que teniendo espacio libre en disco, ya se
hubiera cubierto todo el espacio libre de asignación de inodos y como
resultado no se podría crear más ficheros.
1. Inode: 2490817 Type: regular Mode: 0664 Flags: 0x80000: Información básica
sobre el inodo.
○ Inode: Número del inodo.
○ Type: Tipo de archivo (en este caso, regular para un archivo
regular→fichero). Podría ser un directorio, enlace simbólico…
○ Mode: Permisos del archivo en formato octal (0664).
○ Flags: Indicadores adicionales (en este caso, 0x80000).
2. Generation: 3193865586 Version: 0x00000000:00000001: Información sobre la
generación y versión del inodo.
3. User: 1000 Group: 1000 Project: 0 Size: 12: Información sobre el propietario del
archivo, el grupo, el proyecto (generalmente no utilizado), y el tamaño del archivo en
bytes.
4. File ACL: 0: Información sobre la lista de control de acceso (ACL) del archivo.
5. Links: 1 Blockcount: 8: Número de enlaces al inodo y el número de bloques
asignados al archivo.
6. Fragment: Address: 0 Number: 0 Size: 0: Información sobre fragmentos
(generalmente no utilizada).
7. ctime, atime, mtime, crtime: Información sobre las fechas y horas relacionadas con
el inodo, como la creación (crtime), modificación (mtime), último acceso (atime), y
último cambio de metadatos (ctime).
8. Size of extra inode fields: 32: Tamaño de campos adicionales en el inodo.
9. Inode checksum: 0x4bab51b2: Suma de comprobación del inodo, permite
comprobar la integridad del inodo.
10. EXTENTS: (0):7381716: Información sobre los bloques de datos del archivo. Indica
que el bloque de datos está en la posición 0 y tiene la dirección lógica 7381716.
3.2 Dentries
Si uno se fija en la imagen anterior, uno podría preguntarse dónde se almacena el nombre
del archivo, ya que en este comando, esa información no aparece. Para ello Linux hace uso
de los Dentries o entradas de directorio que permite asociar un nombre de ficheros o
directorios con un número de inodo gracias a la estructura de directorios que utiliza Linux.
Cuando navegas por un directorio en el sistema de archivos, el kernel utiliza las dentries
para mapear los nombres de los archivos con sus correspondientes inodos.
3.3 Enlaces simbólicos
Los enlaces simbólicos, también conocidos como "symlinks" o "soft links", son un tipo de
enlace en el sistema de archivos de Unix/Linux que apunta a otro archivo o directorio
mediante una ruta relativa o absoluta. A diferencia de los enlaces duros (hard links), que se
refieren directamente a la misma entrada del sistema de archivos, los enlaces simbólicos
son archivos independientes que contienen una referencia al destino.
Sin embargo, si vemos información más detallada de /bin podemos apreciar que lo que
tenemos es un espacio ocupado de 0 bloques pero una referencia a /usr/bin.
Para crear un enlace simbólico en Linux, puedes utilizar el comando ln con la opción -s.
Aquí tienes la sintaxis básica del comando para crear un enlace simbólico:
ln -s <ruta_del_origen> <nombre_del_enlace_simbolico>
ln <ruta_del_origen> <nombre_del_enlace_simbolico>
Existen algunos conceptos especialmente interesantes en esta captura. Por una parte,
podemos ver que el número de inodo de enlace_duro es el mismo que el del fichero.txt, lo
que significa que cuando eliminamos fichero.txt, seguimos accediendo al contenido
almacenado en disco. Por este motivo, cuando nosotros hacemos ls -li el enlace se
comporta como un fichero al uso y no tenemos el permiso lxxxxxxxxx como en los enlaces
simbólicos.
Por otra parte, si nos fijamos en la tercera columna el número cambia de 2 a 1, este número
se refiere al número de enlaces duros que tenemos sobre cada archivo. Podríamos
preguntarnos porque motivo al crear un nuevo directorio automáticamente aparece un 2.
Esto es porque el . cuando hacemos ls es un enlace duro, al igual que los .. son un enlace
duro con el director anterior.
3.5 Wildcards
En Linux, los "wildcards" (comodines o caracteres comodín) son caracteres especiales que
se utilizan como patrones para hacer coincidir nombres de archivos o directorios en
comandos de la línea de comandos. Los wildcards son una forma poderosa de realizar
operaciones en lotes y trabajar con múltiples archivos de manera eficiente. Aquí tienes
algunos de los wildcards más comunes:
Estos wildcards son utilizados por muchos comandos en la línea de comandos de Linux,
como ls, cp, mv, rm, etc. Puedes combinar varios wildcards para realizar operaciones más
complejas.
3.5 Shell Expansions
La "shell expansion" (expansión de la shell) en Linux se refiere al proceso mediante el cual
la línea de comandos expande o interpreta ciertos caracteres o patrones antes de ejecutar
un comando. La expansión de la shell facilita la manipulación de archivos, la especificación
de conjuntos de archivos y la generación de listas de argumentos. Aquí hay algunas de las
principales técnicas de expansión de la shell:
1. Wildcard Expansion:
○ Se refiere a la coincidencia de patrones mediante caracteres comodín (*, ?,
[]).
○ Ejemplo: ls *.txt listaría todos los archivos con extensión ".txt" en el
directorio actual.
2. Tilde Expansion:
○ Sustituye ~ con la ruta del directorio del usuario actual o de un usuario
específico.
○ Ejemplo: cd ~ cambiaría al directorio del usuario actual.
3. Variable Expansion:
○ Sustituye variables por su valor.
○ Ejemplo: echo $USER imprimiría el nombre del usuario actual.
4. Command Substitution:
○ Permite ejecutar un comando dentro de otro y sustituir el resultado en la línea
de comandos.
○ Ejemplo: echo "Fecha actual es $(date)" mostraría la fecha actual.
5. Brace Expansion:
○ Genera combinaciones a partir de patrones dentro de llaves {}.
○ Ejemplo: echo file{1,2,3}.txt mostraría "file1.txt file2.txt file3.txt".
6. Pathname Expansion:
○ Expande nombres de archivos coincidentes con un patrón.
○ Ejemplo: rm *.txt eliminaría todos los archivos con extensión ".txt".
7. Arithmetic Expansion:
○ Permite realizar operaciones aritméticas en la línea de comandos.
○ Ejemplo: echo $((2 + 2)) imprimiría "4".
A diferencia de todo lo que nos permiten las “ “, las ‘ ‘ eliminan el funcionamiento de los
caracteres especiales $, \ y ``.
3.8 Escapando caracteres
El carácter \ permite hacer que ciertos caracteres pierdan su significado original o darle otro.
4. Redirecciones y pipelines
4.1 I/O Redirection
1. En el entorno de Linux y otros sistemas Unix, stdin, stdout y stderr son canales
estándar que permiten la entrada y salida de datos de los programas. Aquí tienes
una descripción de cada uno de ellos:
○ stdin (Standard Input):
■ Es el canal de entrada estándar. Por defecto, está conectado al
teclado.
■ En los programas de línea de comandos, stdin recibe la entrada
desde el teclado o desde la salida de otro comando cuando se utiliza
una tubería (|).
cat
○ En este caso, puedes escribir texto y presionar Enter. El programa cat lee
ese texto desde stdin.
2. stdout (Standard Output):
○ Es el canal de salida estándar. Por defecto, está conectado a la pantalla.
○ Los programas envían su salida normal a stdout.
comando_inexistente
4.6 Pipelines
En el contexto de Linux y otros sistemas Unix, un pipeline es una forma de conectar la
salida de un comando con la entrada de otro, permitiendo así la ejecución de una secuencia
de comandos de manera eficiente. Los pipelines son fundamentales para la filosofía de
diseño de Unix, que fomenta la creación de pequeños programas que hacen una cosa bien
y la posibilidad de combinar estos programas para realizar tareas más complejas. La
notación para un pipeline en la línea de comandos es el símbolo de barra vertical (|), no
podemos hacer uso de > para enviar la salida de un comando como stdin de un comando
ya que crearemos un fichero con el nombre del comando.
4.7 Filtros y búsquedas
1. grep: Descripción: grep (Global Regular Expression Print) es una herramienta de
búsqueda que busca patrones de texto en archivos o en la salida de otros
comandos.
○ Uso Básico: grep "patrón" archivo Ejemplo: grep "error"
archivo.txt
2. sort: Descripción: sort ordena líneas de texto en orden alfabético o numérico.
○ Uso Básico: sort archivo Ejemplo: sort lista.txt
3. head: Descripción: head muestra las primeras líneas de un archivo o la salida de
un comando.
○ Uso Básico: head -n N archivo Ejemplo: head -n 10 archivo.txt
4. tail: Descripción: tail muestra las últimas líneas de un archivo o la salida de un
comando.
○ Uso Básico: tail -n N archivo Ejemplo: tail -n 20 archivo.txt
5. uniq: Descripción: uniq elimina líneas duplicadas consecutivas en un archivo o la
salida de un comando.
○ Uso Básico: uniq archivo Ejemplo: uniq lista.txt
Existe otro comando de mucho interés. Supongamos que en el comando anterior, el cual es
bastante largo, nos estuviera devolviendo algún tipo de error.
tee: Descripción: Utilizado para leer desde la entrada estándar y escribir simultáneamente
en la salida estándar y uno o más archivos.
Este comando lista el contenido del directorio actual y escribe esa lista tanto en la salida
estándar como en el archivo salida.txt.
Es importante decir que puede combinarse con los comandos vistos en este tema utilizando
pipelines para realizar otras muchas tareas. Algunos casos de uso de este comando pueden
ser los siguientes.
Permisos en Linux:
1. Propietario (owner): El usuario que creó el archivo o directorio. Tiene control total
sobre el objeto y puede cambiar sus permisos.
2. Grupo: Un conjunto de usuarios que comparten ciertos permisos sobre el archivo o
directorio. Puedes asignar un grupo a un archivo o directorio y especificar permisos.
3. Otros (others): Todos los demás usuarios del sistema que no son ni el propietario ni
miembros del grupo asociado al archivo o directorio.
Usuarios en Linux:
Linux es un sistema multiusuario, lo que significa que varios usuarios pueden interactuar
con el sistema al mismo tiempo. Cada usuario tiene un nombre único (nombre de usuario) y
un identificador único (UID). Además, los usuarios pueden pertenecer a uno o varios
grupos.
Los comandos principales relacionados con usuarios son useradd (para agregar usuarios),
passwd (para establecer o cambiar la contraseña de un usuario) y usermod (para modificar
la configuración del usuario).
El comando id en Linux se utiliza para mostrar información sobre el usuario y el grupo del
proceso actual, o sobre un usuario y grupo específico si se proporciona un nombre como
argumento. La salida del comando id incluye el identificador de usuario (UID), el
identificador de grupo (GID) y la lista de grupos secundarios a los que pertenece el usuario.
Aquí está el formato básico del comando id [nombre_de_usuario] .Si no se
proporciona un nombre de usuario, el comando id mostrará información sobre el usuario y
grupo del proceso actual. Si se proporciona un nombre de usuario como argumento,
mostrará información sobre ese usuario en particular.
uid=1000(si) gid=1000(john)
groups=1000(si),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lxd)
Explicación de la salida:
Fichero /etc/passwd
El fichero /etc/passwd tiene típicamente los permisos -rw-r--r-- (644) y pertenece al usuario
root grupo root. Contiene es información pública sobre los usuarios del sistema (nombre, id
de usuario, grupo principal, directorio home, algun dato de contacto y shell).
El fichero /etc/shadow tiene típicamente los permisos -rw-r----- (640) y pertenece al usuario
root y grupo shadow. Este fichero define información complementaria y que debe tener
privacidad de los usuarios del sistema. Complementa, por tanto, la información de los
usuarios que se consigna en /etc/passwd. El formato del fichero se presenta en la siguiente
figura:
El algoritmo MD5 ($1) ha sido usado tradicionalmente en la primera década del siglo
XXI, aunque en la actualidad se ha popularizado el uso de sha-512 ($6). Para
cambiar los métodos de codificación de las claves se modificarán los ficheros
/etc/pam.d/common-password y /etc/login.defs.
3. El tercer campo contiene un timestamp de la última vez que se cambió la clave. Este
timestamp se representa mediante el número de días que han pasado desde el 1 de
enero de 1970.
4. El cuarto campo indica cuál es el número mínimo de días que hay que esperar para
cambiar una clave.
5. El quinto campo indica cuál es el número máximo de días de validez de la
contraseña actual.
6. El sexto campo indica el número de días antes de la caducidad de la contraseña a
partir de los cuales se le avisará al usuario que cambie la contraseña.
7. Los dos últimos campos (séptimo y octavo) suelen estar vacíos. El séptimo, indica el
número de días que pasarán entre la expiración de la clave y la deshabilitación
automática de la cuenta.
8. Por último el octavo campo indica cuando la cuenta se deshabilitará totalmente
(número de días desde 1970) de forma automática. Este último campo permite
definir cuentas por un tiempo limitado.
Fichero /etc/group
El fichero /etc/group tiene típicamente los permisos rw-r--r-- (644) y pertenece al usuario
root y grupo root. Define los grupos que hay en el sistema y contiene información pública
sobre ellos como el identificador o la lista de usuarios pertenecen de forma secundaria o
complementaria a cada grupo. El formato del fichero tiene la siguiente estructura:
Fichero etc/gshadow
El fichero /etc/group tiene típicamente los permisos rw-r----- (640) y pertenece al usuario
root y grupo shadow. Define información privada de los grupos como por ejemplo la clave
que se le asigna para implementar grupos privilegiados. El formato del fichero tiene la
siguiente estructura:
En el caso de directorios, “r” significa poder ver el contenido del directorio (listado de
ficheros y directorios. Por otro lado, “w” significa poder añadir, borrar o renombrar ficheros
en el directorio. Finalmente, “x” significa poder acceder al directorio (cd) y hacer cualquier
operación con el directorio. En la práctica, la existencia del permiso “r” o “w” en un
directorio, implica la necesidad del permiso “x”. Por lo tanto, los permisos de un directorio
deberían estar formados por 0, 5 ó 7 (4 y 6 no son técnicamente útiles).
$ ls -l /etc/shadow
Para cambiar los permisos de un fichero se usa la herramienta chmod. chmod permite
emplear la representación de carácter de los permisos así como el formato numérico como
argumento. No obstante es típico el empleo del formato numérico. A continuación se
muestran algunos ejemplos de uso que muestran el abanico de posibilidades de uso de esta
herramienta:
Permisos en directorios:
● El permiso de ejecución en los directorios permite acceder a los archivos dentro del
directorio.
● El permiso de lectura permite enumerar las entradas del directorio.
● El permiso de escritura permite crear y eliminar entradas en el directorio.
La notación octal representa los permisos utilizando números en base octal (base 8). Cada
permiso se representa mediante un número de 3 dígitos, donde cada dígito representa los
permisos para el propietario, el grupo y otros usuarios, respectivamente.
Cada dígito se puede calcular sumando los valores asociados a los permisos. Por ejemplo:
Se puede ajustar los números en el comando chmod según tus necesidades. Es importante
entender la relación entre los valores octales y los permisos que representan para utilizar
correctamente esta notación.
● who: Representa a quién se le aplicarán los cambios de permisos. Puede ser uno o
más de los siguientes:
○ u: Usuario (propietario)
○ g: Grupo
○ o: Otros (resto)
○ a: Todos (equivalente a ugo)
● operator: Indica qué acción se realizará con los permisos. Puede ser uno de los
siguientes:
○ +: Agregar permisos
○ -: Quitar permisos
○ =: Establecer permisos exactos
● permission: Representa el permiso específico que se va a modificar. Puede ser
uno o más de los siguientes:
○ r: Lectura
○ w: Escritura
○ x: Ejecución
● file: Especifica el archivo o directorio al cual se le aplicarán los cambios.
La umask se establece para el usuario y define qué permisos se deben "mascarar" o quitar
de los permisos predeterminados al crear nuevos archivos o directorios. En otras palabras,
la umask especifica qué permisos no se deben asignar a los nuevos elementos.
1. Se toma el permiso predeterminado para un nuevo archivo (por ejemplo, 666 para
archivos) o un nuevo directorio (por ejemplo, 777 para directorios).
2. Se resta la umask a estos permisos predeterminados.
El resultado final será el conjunto de permisos que realmente se asignarán al nuevo archivo
o directorio.
Es un mecanismo en sistemas Unix y Unix-like que permite que un programa sea ejecutado
con los privilegios del propietario del archivo, en lugar de los del usuario que lo ejecuta. Se
denota por la letra 's' en el lugar del bit de ejecución del propietario.
Este permiso es fundamental para que un usuario pueda hacer cosas tan simples como
cambiar su contraseña de acceso. Básicamente cambiar la contraseña de un usuario
distinto de root implica modificar el fichero /etc/shadow el cual tiene permisos rw-r----- y
pertenece al usuario root grupo shadow. Con esta configuración de permisos sólo el usuario
root puede realizar modificaciones sobre este fichero. Para realizar este cambio de
contraseña se usa la herramienta passwd la cual tiene unos permisos especiales (rwsr-xr-x):
El cambio está en que en los permisos del usuario propietario se ha sustituido una x por una
s. Y así es como se representa el permiso Set UID en los ficheros ejecutables el cual es un
acrónimo de “set user ID upon execution”. Un ejecutable con este permiso activado se
ejecuta como el usuario propietario (el usuario root en este caso) y no con los privilegios del
usuario actual.
Por último, en Linux cuando un fichero tiene permiso Set UID pero no tiene permiso de
ejecución, Linux marca esta circunstancia con una “S” (mayúscula).
Setgid (Set Group ID)
Similar al setuid, el setgid es un mecanismo que permite que un programa se ejecute con
los privilegios del grupo del archivo, en lugar de los del usuario que lo ejecuta. Se denota
por la letra 's' en el lugar del bit de ejecución del grupo. El permiso Set GID, de forma
paralela a Set UID, hace que el grupo de ejecución de un fichero sea el grupo propietario
del fichero y no el grupo principal al que pertenece el usuario que lo ejecuta. El ejemplo más
conocido de este tipo de permisos está relacionado también con el fichero /etc/shadow y
con /sbin/unix_chkpwd que es un programa que participa en la autentificación de los
usuarios junto con PAM.
Como se puede ver en el ejemplo, el fichero /etc/shadow tiene permiso de lectura para el
grupo propietario (shadow) de la misma forma que /sbin/unix_chkpwd es un ejecutable cuyo
grupo propietario es shadow. Si se ejecuta este programa con el grupo shadow, se
obtendrán permisos de acceso de sólo lectura a /etc/shadow y, de esta forma, será posible
comprobar la contraseña.
Para asignar permisos de Set GID habrá que anteponer un 2 al permiso en formato
numérico (2755) ó usar g+s. Por otra banda, es posible activar Set UID y Set GID a la vez
empleando chmod con las especificaciones de permisos 6755 ó u+s g+s.
Sticky Bit
Este permiso permite proteger ficheros dentro de un directorio. Concretamente evita que un
usuario pueda borrar ficheros de otros usuarios que se sitúan en una carpeta pública como
el directorio /tmp.
Por otro lado, indicar que con la T (mayúscula) indica que no existe el permiso de ejecución
para el colectivo otros usuarios que en carpetas significa poder acceder a la carpeta
su [opciones] [usuario]
Por ejemplo, para cambiar al usuario "john", puedes escribir: su john. Luego, se te pedirá
que ingreses la contraseña del usuario "john" para autenticarte. Si deseas cambiar a la
cuenta de superusuario (root), simplemente puedes escribir: su. Luego, se te pedirá la
contraseña de root.
Para ver todo esto vamos a crear un usuario de prueba usuario: testuser contraseña:1234
Una vez añadido este usuario, como podemos comprobar, se ha creado una nueva linea en
el fichero /etc/passwd para el nuevo usuario.
Una vez que existe este usuario podemos cambiar de usuario con el comando su e
introduciendo la contraseña de testuser tendremos a nuestra disposición una nueva shell
donde somos ese usuario. Esto podemos comprobarlos con el comando id.
Nota: Cuando este nuevo usuario no sea de interés, podemos eliminarlo del sistema con el
comando: sudo deluser usuario_erroneo.
Llegados a este punto puede que alguien quisiera realizar su root para tener una sesión
de root. El problema es que hasta este punto no sabemos todavía la contraseña de root y
en la actualidad la contraseña de la cuenta root va a estar bloqueada por defecto. Para
ejecutar comandos simulando que somos root se hace uso del comando sudo.
5.9 Sudo
sudo, que significa "Superuser Do", es un comando en sistemas operativos basados en
Unix (como Linux) que permite a un usuario ejecutar programas con los privilegios de
seguridad de otro usuario, generalmente el superusuario (root). Esto proporciona una forma
segura de realizar tareas administrativas sin necesidad de iniciar sesión directamente como
root. A continuación, se muestran algunos aspectos clave sobre sudo:
5.10 Sudoers
El archivo /etc/sudoers es un archivo de configuración en sistemas basados en Unix,
como Linux, que especifica qué usuarios y grupos de usuarios tienen permiso para ejecutar
comandos con privilegios de superusuario a través del comando sudo. El archivo sudoers
es esencial para la seguridad y administración de sistemas, ya que determina quién puede
realizar tareas administrativas y qué comandos específicos pueden ejecutar.
En la imagen anterior podemos ver algunas configuraciones interesantes de sudoers:
1. Defaults env_reset:
○ Esta línea indica que las variables de entorno del usuario original se
restablecerán al entorno seguro al ejecutar comandos con sudo. Esto ayuda
a evitar que un usuario malintencionado configure variables de entorno que
puedan afectar la ejecución de comandos con privilegios elevados.
2. Defaults mail_badpass:
○ Esta línea especifica que se envíe un correo electrónico al usuario root
cuando alguien intente ejecutar un comando con sudo y falle al ingresar la
contraseña correctamente. Esto puede ser útil para la administración de
sistemas y la detección de intentos de uso no autorizado.
3. Defaults
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
:/sbin:/bin:/snap/bin":
○ Define la variable de entorno secure_path que establece las rutas seguras
para la ejecución de comandos con sudo. Limita las rutas donde se buscarán
los comandos ejecutados con sudo, reduciendo el riesgo de ejecutar binarios
maliciosos desde rutas no seguras.
4. Defaults use_pty:
○ Habilita la asignación de un pseudoterminal (PTY) cuando se ejecutan
comandos con sudo. Un PTY es un emulador de terminal y su uso puede ser
necesario para algunas aplicaciones y scripts que esperan un entorno de
terminal interactivo.
La regla tres como nos indica dice que cualquier usuario que pertenezca al grupo sudo
puede ejecutar cualquier comando. Si ejecutamos el comando id vemos el usuario sí que
pertenecemos a este grupo, a diferencia de test_user que no pertenece y por lo tanto no
podrá hacer uso de sudo.
Tenemos que crear una nueva norma para permitirle a test_user ver el archivo /etc/shadow.
Para ello creamos u nuevo archivo de configuración como se nos indica en la norma de
imagenes anteriores:
# See sudoers(5) for more information on "@include" directives:
@includedir /etc/sudoers.d
Una vez creado el archivo y añadida la norma procedemos a probar si podemos visualizar el
contenido del archivo /etc/shadow.
Como podemos ver en la imagen anterior, ahora ya podemos ver el contenido de test_user.
Aunque el resultado es correcto, es importante mencionar que se puede entender como una
mala práctica ya que es mucho más simple gestionar grupos de usuarios que usuarios.
Dicho de otro modo, lo suyo sería crear un nuevo grupo al que añadirle la nueva regla y
añadir el usuario test_user a ese grupo.
adduser nombre_usuario
○ También puedes utilizar useradd, pero adduser es más amigable y
automatiza algunas configuraciones adicionales.
addgroup:
usermod:
deluser:
deluser nombre_usuario
También puedes utilizar userdel, pero deluser es más amigable y realiza
algunas limpiezas adicionales, como la eliminación del correo del usuario.
5.12 Cambio de propietario
Los comandos chown y chgrp son utilizados en sistemas basados en Unix, como Linux,
para cambiar el propietario y el grupo de archivos y directorios. Aquí te doy una descripción
de cada uno:
Por otra parte tenemos los procesos, un proceso es una instancia activa en ejecución de
un programa. Los procesos son las estructuras que utiliza el kernel para gestionar la
asignación de recursos, organizar la actividad que están realizando, ficheros utilizados…
Este comando muestra una lista detallada de todos los procesos en ejecución en el
sistema.
Muestra una vista jerárquica de los procesos, lo que facilita entender las relaciones
de parentesco entre ellos.
1. Encabezado:
○ PID: Identificador del proceso (Process ID).
○ TTY: Terminal asociada al proceso.
○ TIME: Tiempo total de CPU utilizado por el proceso.
○ CMD: Comando o nombre del proceso.
2. Información de Procesos:
○ 3879: PID del proceso. En este caso, el proceso con ID 3732 es una
instancia de la shell Bash.
○ pts/0: Terminal asociada al proceso. En este caso, el proceso está asociado
al pseudo terminal (pts) 0.
○ 00:00:00: Tiempo total de CPU utilizado por el proceso.
○ bash: Nombre del comando o proceso. Indica que este proceso es una
instancia de la shell Bash.
3. Proceso del Comando ps:
○ 3886: PID del proceso. Este es el proceso del comando ps que estás
ejecutando.
○ pts/0: Terminal asociada al proceso. El proceso ps también está asociado
al pseudo terminal (pts) 1.
○ 00:00:00: Tiempo total de CPU utilizado por el proceso.
○ ps: Nombre del comando o proceso. Indica que este proceso es la ejecución
del comando ps.
La salida que proporciona el resultado del comando ps aux en una terminal de Linux
muestra información más detallada que los casos anteriores y es la opción que se suele
utilizar:
Estados (STAT) del proceso pueden variar, y algunos de los códigos más comunes son:
Encabezado:
%Cpu(s):
%Cpu(s): 12,5 us, 15,6 sy, 0,0 ni, 71,9 id, 0,0 wa, 0,0 hi, 0,0
si, 0,0 st
○ 12,5 us: Porcentaje de tiempo de CPU utilizado por procesos de usuario.
○ 15,6 sy: Porcentaje de tiempo de CPU utilizado por procesos del sistema
(kernel).
○ 0,0 ni: Porcentaje de tiempo de CPU utilizado por procesos con prioridad
modificada (nice).
○ 71,9 id: Porcentaje de tiempo de CPU inactivo.
○ 0,0 wa: Porcentaje de tiempo de CPU esperando operaciones de
entrada/salida (I/O).
○ 0,0 hi: Porcentaje de tiempo de CPU utilizado para tareas de manejo de
interrupciones hardware.
○ 0,0 si: Porcentaje de tiempo de CPU utilizado para tareas de manejo de
interrupciones software.
○ 0,0 st: Porcentaje de tiempo de CPU robado en máquinas virtuales.
MiB Mem:
MiB Swap:
1. Interrupción de procesos:
○ La interrupción de procesos se refiere a la capacidad de detener la ejecución
de un programa o proceso en un sistema operativo.
○ En un terminal de Linux, puedes interrumpir un proceso que está en
ejecución presionando Ctrl + C. Esto enviará una señal de interrupción
(SIGINT) al proceso actual, lo que generalmente provoca su terminación.
○ La interrupción de procesos es útil cuando deseas detener la ejecución de un
programa de manera controlada, por ejemplo, durante la ejecución de un
script o un comando en un terminal.
2. Ejecución en segundo plano:
○ La ejecución en segundo plano se refiere a la capacidad de ejecutar un
programa o comando sin bloquear el terminal, permitiendo que el usuario
continúe utilizando el terminal para otras tareas.
○ Para ejecutar un programa en segundo plano, puedes agregar el carácter &
al final del comando. Por ejemplo, comando &.
○ Los procesos en segundo plano continúan ejecutándose en segundo plano
incluso después de cerrar el terminal. Puedes ver una lista de procesos en
segundo plano usando el comando jobs.
○ Para enviar un proceso en ejecución al segundo plano, puedes suspenderlo
(Ctrl + Z) y luego usar el comando bg para reanudarlo en segundo plano.
● $ comando_en_segundo_plano &
● $ proceso_en_ejecucion
● (presionar Ctrl + C para interrumpir el proceso)
6.5 Señales
En sistemas operativos tipo Unix/Linux, las señales son mecanismos de comunicación entre
procesos y entre el kernel y los procesos. Las señales son eventos asíncronos que informan
a un proceso de eventos específicos, como una solicitud de terminación o la recepción de
datos en un socket.
Envío de Señales:
La señal más común es SIGTERM (15), que solicita al proceso que se termine de manera
ordenada. SIGKILL (9) es otra señal común que fuerza la terminación inmediata del
proceso. Ejemplo de envío de señal a un proceso con PID 1234: $ kill -SIGTERM 1234
Señales Comunes:
Además de las señales enviadas manualmente, el kernel también puede enviar señales a
los procesos para notificar eventos del sistema, como la terminación de hijos o errores de
división por cero.
Visualización de Señales:
Puedes ver las señales que un proceso puede recibir utilizando el comando kill -l:
$ kill -l
En la shell, puedes enviar señales a procesos en segundo plano utilizando comandos como
Ctrl + C para SIGINT y Ctrl + Z para SIGTSTP (detener).
Ejemplo de uso:
En las siguiente capturas hacemos uso de señales para detener el proceso como:
Otro comando de mucho interés es killall que permite eliminar todos los procesos por
nombre. Supongamos que tenemos varios procesos emacs, este killall permitirá
eliminarlo todos.
Si bien es cierto que podemos realizar estas acciones sobre los procesos, esto es posible si
somos los usuarios propietarios del proceso o el superusuario. Si esto no fuera así y
cualquier usuario pudiera eliminar procesos de otros usuarios sería imposible trabajar
dentro del sistema. Si ejecutamos ps aux podemos ver los usuarios propietarios de cada
proceso.
2. Demonios (Daemons):
○ Un demonio es un proceso en segundo plano que se ejecuta de manera
continua y proporciona servicios específicos en el sistema.
○ Los demonios pueden ser iniciados por el sistema o por el usuario. Algunos
ejemplos de demonios comunes son httpd (servidor web), sshd (servidor
SSH), y cron (programador de tareas).
3. Servicios y systemd:
○ systemd es un sistema de inicialización y gestión de servicios ampliamente
adoptado en distribuciones Linux modernas, como Ubuntu, Fedora y CentOS.
○ systemd reemplaza el tradicional init y presenta características más
avanzadas, como la paralelización del inicio, la gestión de dependencias y la
activación bajo demanda de servicios.
○ Los servicios gestionados por systemd se conocen como unidades de
servicio (service units). Cada servicio es definido por un archivo de
configuración con extensión .service.
○ La diferencia con los demonios es que los servicios van a recibir cierta
interacción con el usuario u otros procesos. Un demonio es un programa en
segundo plano con el que no vamos a interactuar.
Scripts de Inicio:
Los scripts en /etc/init.d son ejecutables y contienen instrucciones sobre cómo iniciar,
detener y gestionar un servicio específico en base al proceso init. Estos procesos son
demonios en ejecución en segundo plano. Estos scripts suelen aceptar argumentos como
start, stop, restart, entre otros, para realizar acciones específicas.
Por otro lado, en la ruta /etc/default se encuentran los archivos de configuración de los
scripts de inicio (s scripts), que son los segundos en ejecutarse por init, después de los
scripts de terminación (k scripts) que se ejecutan primero. También tienen su respectivo
archivo de configuración en /etc/init.d .
stop:
La acción stop se utiliza para detener la ejecución del demonio. Esto implica terminar el
proceso del demonio de manera controlada.
start:
La acción start se utiliza para iniciar el demonio. Si el demonio no está en ejecución, esta
acción lo pondrá en marcha.
Estos comandos son solo ejemplos generales, y el nombre del demonio puede variar según
el sistema operativo y la configuración específica de tu entorno. En algunos sistemas,
también puedes encontrar estos comandos utilizando systemctl, que es el comando
principal para interactuar con systemd, el sistema de inicialización utilizado en muchos
sistemas Linux modernos.
$ sudo halt
poweroff:
reboot:
$ sudo reboot
shutdown:
shutdown es un comando más versátil que permite programar un apagado o reinicio del
sistema en el futuro. También puede enviar mensajes a los usuarios del sistema antes de la
acción planificada.
La relación entre el valor de "niceness" y la prioridad del proceso es gestionada por el kernel
del sistema operativo. Cuanto menor sea el valor de "niceness", más tiempo de CPU
obtendrá el proceso, ya que se considera más prioritario.
Las siguientes son las 6 etapas de alto nivel de un típico proceso de arranque de Linux.
1. BIOS
● BIOS significa Sistema Básico de Entrada/Salida
● Realiza algunas comprobaciones de integridad del sistema
● Busca, carga y ejecuta el programa cargador de arranque.
● Busca el gestor de arranque en el disquete, cd-rom o disco duro. Puede pulsar una
tecla (normalmente F12 o F2, pero depende de su sistema) durante el arranque de
la BIOS para cambiar la secuencia de arranque.
● Una vez que el programa de arranque es detectado y cargado en la memoria, la
BIOS le da el control.
● Así que, en términos simples, BIOS carga y ejecuta el cargador de arranque MBR.
2. MBR
3. GRUB
4. Kernel
● Cuando el sistema Linux está arrancando, puede ver que se inician varios servicios.
Estos son los programas de nivel de ejecución, ejecutados desde el directorio de
nivel de ejecución definido por su nivel de ejecución.
● Dependiendo de su configuración de nivel de init por defecto, el sistema ejecutará
los programas desde uno de los siguientes directorios.
○ Nivel de ejecución 0 - /etc/rc.d/rc0.d/
○ Nivel de ejecución 1 - /etc/rc.d/rc1.d/
○ Ejecuta el nivel 2 - /etc/rc.d/rc2.d/
○ Ejecutar el nivel 3 - /etc/rc.d/rc3.d/
○ Ejecutar el nivel 4 - /etc/rc.d/rc4.d/
○ Ejecutar el nivel 5 - /etc/rc.d/rc5.d/
○ Ejecutar el nivel 6 - /etc/rc.d/rc6.d/
● Ten en cuenta que también hay enlaces simbólicos disponibles para estos directorios
bajo /etc directamente. Así, /etc/rc0.d está vinculado a /etc/rc.d/rc0.d.
● Bajo los directorios /etc/rc.d/rc*.d/, verá programas que comienzan con S y K.
● Los programas que empiezan por S se utilizan durante el arranque. S para el
arranque.
● Los programas que comienzan con K se utilizan durante el apagado. K para matar.
● Hay números justo al lado de S y K en los nombres de los programas. Estos son el
número de secuencia en el que los programas deben ser iniciados o eliminados.
● Por ejemplo, S12syslog es para iniciar el deamon del syslog, que tiene el número de
secuencia 12. S80sendmail es para iniciar el demonio sendmail, que tiene el número
de secuencia 80. Así, el programa syslog se iniciará antes que sendmail.
7. Redes
Con gestión de paquetes en Linux nos referimos al método para instalar y mantener el
software en los sistemas Linux. En Linux el software tiene cambios y actualizaciones
periódicas por lo que existen una serie de herramientas de gestión de paquetes donde
figuran todos los ficheros propios de un programa y será esta herramienta quien se
encargará de hacer las modificaciones necesarias para mantener el Software funcionando.
Estos repositorios donde se almacena el contenido de los paquetes están mantenidos por la
propia distribución de Linux.
Los repositorios de paquetes que tenemos añadidos en nuestro sistema y que podemos
consultar con el anterior comando están en el fichero /etc/apt/sources.list.
También puedo buscar si un paquete está en alguno de los repositorios que tengo
configurados en mi equipo. Para ello hago uso del comando apt-cache search ___.
Por otra parte, si nosotros tenemos un paquete que existe en alguno de los repositorios de
nuestro sistema podemos instalarlo haciendo uso del comando apt-install.
Nos dirigimos a descargas y con el comando dpkg nos encargamos de instalarlo. Este
comando es una herramienta de gestión de paquetes en sistemas operativos basados en
Debian, como Ubuntu. Permite instalar, desinstalar y gestionar paquetes de software en el
sistema. Ejemplo: sudo dpkg -i Nombre.deb
Por otra parte, tenemos otro comando muy interesante que es sudo apt upgrade, el cual
actualiza tanto paquetes como dependencias a la última versión disponible en el repositorio.
También podría darse el caso de actualizar un paquete ya instalado. Para ello haríamos el
mismo proceso de instalación que con Nessus.
También puedo ver que paquete es responsable de la instalación de un fichero concreto con
el comando dpkg -S nombre.
Si utilizas un sistema operativo Linux como Ubuntu, es una buena idea comprobar y
actualizar el kernel regularmente. Para ello, podemos seguir el siguiente proceso:
1. Comprobamos cuál es la versión actual del kernel. Para ello, ejecutamos el comando:
uname -sr
El comando sudo apt dist-upgrade realiza también todas las funciones que incluye el
comando sudo apt upgrade
Entorno de Linux:
Variables de entorno en Linux: Las variables de entorno son valores dinámicos que
afectan el comportamiento de los procesos en un sistema. En Linux, estas variables se
almacenan en el entorno del sistema y pueden ser accedidas por los programas en
ejecución. Algunas variables de entorno comunes incluyen:
1. PATH: Especifica los directorios donde el sistema busca ejecutables. Cada directorio
está separado por dos puntos (:).
2. HOME: Indica la ruta del directorio personal del usuario.
3. USER: Representa el nombre del usuario actual.
4. SHELL: Especifica el intérprete de comandos predeterminado para el usuario.
5. LANG y LC_*: Establecen la configuración regional y de idioma del sistema.
Una forma de poder ver las variables de entorno es con el comando printenv. Otro
comando de interés es set que a mayores de las variables de entorno muestra funciones
propias del sistema.
Estos son los ficheros que afectan a todo el sistema y a todos los usuarios. Por otra parte,
los archivos de configuración a nivel de usuario que se utilizan para personalizar el entorno
de shell Bash para usuarios específicos. Cada uno de ellos tiene un propósito particular en
el ciclo de vida de una sesión de Bash:
~/.bashrc: Propósito: Este archivo se ejecuta cada vez que se inicia una nueva instancia
de Bash (interactiva o no). Es utilizado para configurar preferencias de usuario, personalizar
el prompt, definir alias y funciones, y más.
Ficheros con aplicación a todo el sistema (todos los usuarios del sistema)
Por este motivo, en función del alcance que queramos que tengan nuestras variables vamos
a tener que modificar unos ficheros u otros.
A continuación, voy a añadir una nueva variable en /etc/enviroment, donde solo se pueden
definir variables y no scripts y va a tener alcance de todos los usuarios.
Para que este cambio se aplique es necesario reiniciar el sistema. En resumen, si queremos
añadir una variable para todos los usuarios lo hacemos en este archivo.
Si queremos añadir un script que afecte a todos los usuarios vamos a realizarlo en
/etc/profile.d si la shell necesita de autenticación y sino en /etc/bash.bashrc.
Vamos a crear nuevas variables de entorno para nuestra propia shell en /etc/bash.bashrc y
vamos a emplear el comando profile para que se apliquen los cambios sobre esta shell
y no tener que abrir otra nueva.
9.4 Variables de entorno interesantes
A continuación se muestra un listado de variables de entorno interesantes.
El comando mount en sistemas basados en Unix y Linux se utiliza para montar sistemas de
archivos en dispositivos de almacenamiento. Montar un sistema de archivos permite al
sistema operativo acceder a los archivos y directorios presentes en ese sistema de
archivos.
Este proceso que realizamos de forma automática. En primer lugar, vemos que tenemos un
nuevo dispositivo sdb1 al final del comando mount y podemos dirigirnos a la ruta y hacer las
modificaciones necesarias podemos hacerlo de forma manual. Para ello vamos a utilizar los
comandos mount y umount para poder hacer el proceso nosotros mismos.
Para monitorear los cambios de dispositivos USB y asignar letras a los dispositivos, puedes
revisar el archivo de registro /var/log/syslog en muchos sistemas basados en Debian,
como Ubuntu. Este archivo registra varios eventos del sistema, incluidos los cambios en
dispositivos y mensajes del kernel. Puedes utilizar el siguiente comando para ver las últimas
líneas del archivo syslog y buscar cambios relacionados con dispositivos USB: tail -n
50 /var/log/syslog | grep usb Este comando muestra las últimas 50 líneas del
archivo syslog y filtra las líneas que contienen la palabra "usb". Puedes ajustar el número de
líneas según tus necesidades. Además, algunos sistemas también registran eventos de
dispositivos USB en archivos como /var/log/messages o /var/log/udev. La
ubicación exacta del registro puede variar según la distribución del sistema operativo.
Revisa la documentación específica del sistema operativo que estás utilizando para obtener
información detallada sobre la ubicación del registro de eventos de dispositivos.
11. Archivando y comprimiendo archivos