En las partes anteriores vimos los fundamentos de la terminal y las utilidades de red, compresión y procesos. En este último capítulo nos ponemos el sombrero de administrador: **gestión de memoria, disco e interfaces**, **manejo de paquetes**, **usuarios y permisos de administración**, **seguridad**, **programación de comandos** y algunas **fricadas** finales.
📚 **Esta entrada es parte de la serie _Introducción a la terminal_**, dividida en tres capítulos que se leen en orden:
> * Parte 1: Navegación, archivos y comandos
* Parte 2: Red, compresión y procesos
* 👉 **Parte 3: Administración del sistema**
Gestión de memoria RAM
Si solo queremos obtener información de la memoria podemos hacer uso del comando free
InputPython!freeCopied
total usado libre compartido búfer/caché disponibleMemoria: 32774516 6563544 20091804 276296 6119168 25479600Swap: 2097148 0 2097148
Pero como esta información no es muy fácil de digerir, añadimos el flag -h (human) para que sea más fácil de leer
InputPython!free -hCopied
total usado libre compartido búfer/caché disponibleMemoria: 31Gi 6,3Gi 19Gi 270Mi 5,8Gi 24GiSwap: 2,0Gi 0B 2,0Gi
Gestión del disco duro
Para obtener información del disco duro hacemos uso del comando du, si solo introducimos este comando por terminal nos dará la información de todas las carpetas de nuestra máquina, por eso, para no obtener demasiada información, es necesario introducirle una ruta que queramos escanear
InputPython!du ~/Documentos/web/portafolio/posts/Copied
8 /home/wallabot/Documentos/web/portafolio/posts/__pycache__1648 /home/wallabot/Documentos/web/portafolio/posts/notebooks_translated4288 /home/wallabot/Documentos/web/portafolio/posts/html_files336 /home/wallabot/Documentos/web/portafolio/posts/prueba/tocompress1132 /home/wallabot/Documentos/web/portafolio/posts/prueba16 /home/wallabot/Documentos/web/portafolio/posts/introduccion_python/__pycache__28 /home/wallabot/Documentos/web/portafolio/posts/introduccion_python11232 /home/wallabot/Documentos/web/portafolio/posts/
Al igual que antes, añadimos el flag -h (human) para que sea más fácil de leer
InputPython!du ~/Documentos/web/portafolio/posts/ -hCopied
8,0K /home/wallabot/Documentos/web/portafolio/posts/__pycache__1,7M /home/wallabot/Documentos/web/portafolio/posts/notebooks_translated4,2M /home/wallabot/Documentos/web/portafolio/posts/html_files336K /home/wallabot/Documentos/web/portafolio/posts/prueba/tocompress1,2M /home/wallabot/Documentos/web/portafolio/posts/prueba16K /home/wallabot/Documentos/web/portafolio/posts/introduccion_python/__pycache__28K /home/wallabot/Documentos/web/portafolio/posts/introduccion_python11M /home/wallabot/Documentos/web/portafolio/posts/
Gestión de interfaces
En Ubuntu, por defecto arrancamos en una interfaz gráfica, pero podemos abrir otras interfaces, que no serán gráficas, introduciendo CTRL+ALT+F<num> donde el número puede ir desde el 1 hasta el 6. Solo la 2 tendrá la interfaz gráfica y la 1 será el inicio de sesión
Al manejar varias interfaces, podemos no saber en cuál nos encontramos, así que, introduciendo el comando tty, nos dirá en cuál estamos
InputPython!ttyCopied
/dev/pts/0
Manejo de paquetes
Repositorios PPA (Personal Package Archives)
En Linux, la gestión de paquetes se hace a través de repositorios. Esto es una lista de direcciones donde se encuentran los binarios de nuestros programas. Así, cuando queremos actualizar o instalar nuestros programas (luego explicaremos cómo), lo que hará el sistema operativo es ver la lista de estos repositorios e ir a las direcciones indicadas a buscar los binarios
Esta lista de repositorios se encuentra en /etc/apt/sources.list y dentro de la carpeta /etc/apt/sources.list.d. Vamos a ver esta lista.
InputPythonterminal("cat /etc/apt/sources.list", max_lines_output=10)Copied
# deb cdrom:[Ubuntu 20.04.2.0 LTS _Focal Fossa_ - Release amd64 (20210209.1)]/ focal main restricted# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to# newer versions of the distribution.deb http://es.archive.ubuntu.com/ubuntu/ focal main restricted# deb-src http://es.archive.ubuntu.com/ubuntu/ focal main restricted## Major bug fix updates produced after the final release of the## distribution.deb http://es.archive.ubuntu.com/ubuntu/ focal-updates main restricted...deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /# deb-src https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /deb https://apt.kitware.com/ubuntu/ focal main# deb-src https://apt.kitware.com/ubuntu/ focal main
Las primeras líneas que incluyen la palabra cd-rom son referencias al CD de instalación, siempre vienen con las palabras deb cdrom: aunque se haya instalado a través de la red o de un USB.
A partir de aquí empiezan a aparecer diversas líneas que empiezan con deb o deb-src. En deb se encuentran los binarios y en deb-src se encuentra el código fuente.
Toda dirección válida de repositorio tiene uno de estos formatos:
- deb http://dirección_del_servidor/nombre_carpeta nombre_de_versión (main o universe o multiverse o main restricted, etc)
- deb-src http://direccion_del_servidor/nombre_carpeta nombre_de_version (main o universe o multiverse o main restricted, etc)
Los seis tipos de repositorios de Ubuntu son:
- Main
El repositorio Main está activado por defecto y contiene solo software libre y de código abierto o FOSS por sus siglas en inglés (Free and Open-Source Software).
- Universe
Como Main, Universe también ofrece FOSS. La diferencia es que en este repositorio no es Ubuntu quien garantiza actualizaciones de seguridad regulares, sino que es la comunidad quien se encarga de su soporte. Viene activado por defecto, pero no siempre. Algunos sistemas operativos lo tienen desactivado por defecto y podríamos tener que activarlo si estamos ejecutando una Live Session. Si no lo tenemos añadido, podemos hacerlo con este comando:
sudo add-apt-repository universe¿Qué encontramos en «Universe»? Yo diría que la mayoría del software que merece la pena, entre lo que tenemos VLC y OpenShot.
- Multiverse
A partir de aquí vienen los repositorios de Ubuntu con menos libertad. Multiverse contiene software que ya no es FOSS y Ubuntu no puede activar este repositorio por defecto por problemas legales y de licencias. Por otra parte, tampoco puede proporcionar parches y actualizaciones. Con esto en mente, tenemos que valorar si lo añadimos o no, algo que podremos hacer con este comando:
sudo add-apt-repository multiverse- Restricted
En los repositorios de Ubuntu podremos encontrar software libre y de código abierto, pero esto no es posible cuando se trata de algo relacionado con el hardware. En los repositorios Restricted encontraremos drivers, como los de las tarjetas gráficas, paneles táctiles o tarjetas de red.
sudo add-apt-repository restricted- Partner
Este repositorio contiene software propietario compilado por Ubuntu de sus socios.
- Repositorios de Ubuntu de terceros
Por último, tenemos los repositorios de terceros. Ubuntu trata de ofrecer siempre la mejor experiencia de usuario y ese es uno de los motivos por los que rechaza cierto software. También hay desarrolladores que prefieren tener un control total sobre lo que ofrecen y por ese motivo crean sus propios repositorios.
Añadir repositorios
Si estamos en Ubuntu, podemos añadir un repositorio mediante el comando add-apt-repository <repository>. Pero como en otras distribuciones que no sean Ubuntu, no tenemos este comando
Actualizar los repositorios
Mediante el comando apt update podremos actualizar a las últimas versiones de los paquetes que tenemos en nuestro repositorio.
Actualizar los paquetes
Mediante el comando apt upgrade podremos actualizar los programas que tengamos instalados y de los cuales antes hayamos actualizado su repositorio
Actualizar el kernel
Si usamos el comando apt dist-upgrade se actualizarán también paquetes del kernel
¡Cuidado!: Actualizar paquetes del kernel puede llevar a que algunos paquetes se rompan
Recordatorio: Al actualizar paquetes del kernel, para que hagan efecto es necesario reiniciar el ordenador
Búsqueda de paquetes
Con el comando apt search <paquete> podemos encontrar paquetes
InputPythonterminal("apt search vlc", max_lines_output=10)Copied
Ordenando...Buscar en todo el texto...anacrolix-dms/focal 1.1.0-1 amd64Go UPnP DLNA Digital Media Server with basic video transcodingcubemap/focal 1.4.3-1build1 amd64scalable video reflector, designed to be used with VLCdvblast/focal 3.4-1 amd64Simple and powerful dvb-streaming application...x264/focal 2:0.155.2917+git0a84d98-2 amd64video encoder for the H.264/MPEG-4 AVC standard
Listado de paquetes instalados
Para ver qué paquetes tenemos instalados podemos usar dpkg -l, esto nos dará una lista de todos los paquetes que tenemos instalados en nuestro ordenador
InputPythonterminal("dpkg -l", max_lines_output=10)Copied
Deseado=desconocido(U)/Instalar/eliminaR/Purgar/retener(H)| Estado=No/Inst/ficheros-Conf/desempaqUetado/medio-conF/medio-inst(H)/espera-disparo(W)/pendienTe-disparo|/ Err?=(ninguno)/requiere-Reinst (Estado,Err: mayúsc.=malo)||/ Nombre Versión Arquitectura Descripción+++-==========================================-=====================================-============-===========================================================================================================================================================================================================================================================================================================================================================================================================================================ii accountsservice 0.6.55-0ubuntu12~20.04.5 amd64 query and manipulate user account informationii acl 2.2.53-6 amd64 access control list - utilitiesii acpi-support 0.143 amd64 scripts for handling many ACPI eventsii acpid 1:2.0.32-1ubuntu1 amd64 Advanced Configuration and Power Interface event daemonii adduser 3.118ubuntu2 all add and remove users and groups...ii zip 3.0-11build1 amd64 Archiver for .zip filesii zlib1g:amd64 1:1.2.11.dfsg-2ubuntu1.5 amd64 compression library - runtimeii zlib1g:i386 1:1.2.11.dfsg-2ubuntu1.5 i386 compression library - runtimeii zlib1g-dev:amd64 1:1.2.11.dfsg-2ubuntu1.5 amd64 compression library - development
Si queremos buscar si tenemos un paquete instalado, podemos usar el comando anterior y crear un pipe y buscar el nombre del paquete con grep
InputPythonterminal("dpkg -l | grep vlc")Copied
Deseado=desconocido(U)/Instalar/eliminaR/Purgar/retener(H)| Estado=No/Inst/ficheros-Conf/desempaqUetado/medio-conF/medio-inst(H)/espera-disparo(W)/pendienTe-disparo|/ Err?=(ninguno)/requiere-Reinst (Estado,Err: mayúsc.=malo)||/ Nombre Versión Arquitectura Descripción+++-==============-============-============-=================================ii grep 3.4-1 amd64 GNU grep, egrep and fgrepii vlc 3.0.9.2-1 amd64 multimedia player and streamer
Instalar paquetes descargados y no de repositorios
En algunas ocasiones, cuando te quieres instalar un programa, lo que hacen es que te dan un archivo .deb, por lo que, para instalarlo, usamos el comando dpkg -i <file.deb>
Administrador de usuarios
Información del usuario activo con id
Mediante el comando id puedo ver qué usuario soy
InputPython!idCopied
uid=1000(wallabot) gid=1000(wallabot) grupos=1000(wallabot),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),131(lxd),132(sambashare),998(docker)
Con este comando puedo ver mi id, la ID de grupo gid y los grupos a los que pertenezco. Las distribuciones basadas en Debian a los usuarios se les da una ID a partir de la 1000, mientras que al usuario root se le asigna la ID 0
Información del usuario activo con whoami
Otro comando para saber qué usuario soy es whoami
InputPython!whoamiCopied
wallabot
Archivo con la información de todos los usuarios
La información de los usuarios está en el archivo /etc/passwd
InputPythonterminal("cat /etc/passwd", max_lines_output=10)Copied
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/usr/sbin/nologinman:x:6:12:man:/var/cache/man:/usr/sbin/nologinlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologinmail:x:8:8:mail:/var/mail:/usr/sbin/nologinnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin...sshd:x:126:65534::/run/sshd:/usr/sbin/nologinnvidia-persistenced:x:127:135:NVIDIA Persistence Daemon,,,:/nonexistent:/usr/sbin/nologinfwupd-refresh:x:128:136:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologinglances:x:129:137::/var/lib/glances:/usr/sbin/nologin
Cambiar la contraseña de un usuario
Si quiero cambiar la contraseña de un usuario hay que usar el comando passwd <user> <password>, si no se especifica el usuario, se cogerá lo que devuelva el comando whoami
Crear usuarios con useradd
Para crear un nuevo usuario se usa el comando useradd <user name>, vamos a crear un nuevo usuario
InputPython!sudo useradd usertest1Copied
Vamos a ver si está en el archivo con todos los usuarios
InputPython!cat /etc/passwd | grep usertestCopied
usertest1:x:1001:1001::/home/usertest1:/bin/sh
Como vemos, se ha creado el usuario con la id 1001, la siguiente a la que tenía mi usuario wallabot, que era el último
Sin embargo, al crear este usuario no nos ha pedido que le asignemos una contraseña. Además, si miramos qué hay dentro de home
InputPython!ls /homeCopied
wallabot
Solo está la carpeta del usuario wallabot, pero no la del usuario test1
Crear usuarios con adduser
Por lo tanto, vamos a ver otro comando para crear usuarios que sí pide una contraseña y sí crea una carpeta en home. Este comando es adduser
InputPython!sudo adduser usertest2Copied
[sudo] contraseña para wallabot:Añadiendo el usuario `usertest2' ...Añadiendo el nuevo grupo `usertest2' (1002) ...Añadiendo el nuevo usuario `usertest2' (1002) con grupo `usertest2' ...Creando el directorio personal `/home/usertest2' ...Copiando los ficheros desde `/etc/skel' ...Nueva contraseña:Vuelva a escribir la nueva contraseña:passwd: contraseña actualizada correctamenteCambiando la información de usuario para usertest2Introduzca el nuevo valor, o presione INTRO para el predeterminadoNombre completo []:Número de habitación []:Teléfono del trabajo []:Teléfono de casa []:Otro []:¿Es correcta la información? [S/n] s
Si miramos en el archivo con todos los usuarios
InputPython!cat /etc/passwd | grep usertestCopied
usertest1:x:1001:1001::/home/usertest1:/bin/shusertest2:x:1002:1002:,,,:/home/usertest2:/bin/bash
Vemos que se ha creado el usuario usertest2
InputPython!ls /homeCopied
usertest2 wallabot
Y vemos que se ha creado una carpeta para él en home
Para borrar un usuario hay que usar el comando userdel <username>
InputPython!sudo userdel usertest1Copied
InputPython!sudo userdel usertest2Copied
Vamos a ver si están en el archivo con todos los usuarios.
InputPython!cat /etc/passwd | grep usertestCopied
Vemos que ya no aparece nada, de hecho vemos el final de ese archivo.
InputPython!tail /etc/passwdCopied
geoclue:x:122:127::/var/lib/geoclue:/usr/sbin/nologinpulse:x:123:128:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologingnome-initial-setup:x:124:65534::/run/gnome-initial-setup/:/bin/falsegdm:x:125:130:Gnome Display Manager:/var/lib/gdm3:/bin/falsewallabot:x:1000:1000:wallabot,,,:/home/wallabot:/bin/bashsystemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologinsshd:x:126:65534::/run/sshd:/usr/sbin/nologinnvidia-persistenced:x:127:135:NVIDIA Persistence Daemon,,,:/nonexistent:/usr/sbin/nologinfwupd-refresh:x:128:136:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologinglances:x:129:137::/var/lib/glances:/usr/sbin/nologin
Hacer un usuario administrador
Primero vamos a crear un usuario nuevo, que al inicio no será administrador
InputPython!sudo adduser noadminCopied
Añadiendo el usuario `noadmin' ...Añadiendo el nuevo grupo `noadmin' (1001) ...Añadiendo el nuevo usuario `noadmin' (1001) con grupo `noadmin' ...Creando el directorio personal `/home/noadmin' ...Copiando los ficheros desde `/etc/skel' ...Nueva contraseña:Vuelva a escribir la nueva contraseña:passwd: contraseña actualizada correctamenteCambiando la información de usuario para noadminIntroduzca el nuevo valor, o presione INTRO para el predeterminadoNombre completo []:Número de habitación []:Teléfono del trabajo []:Teléfono de casa []:Otro []:¿Es correcta la información? [S/n] s
Vamos a ver a qué grupos pertenece el usuario que acabamos de crear, para ello usamos el comando groups <user>
InputPython!groups noadminCopied
noadmin : noadmin
Como vemos, solo está en el grupo noadmin, que es un grupo que se creó al crear el usuario
Vamos a ver a qué grupos pertenece mi usuario
InputPython!groups wallabotCopied
wallabot : wallabot adm cdrom sudo dip plugdev lpadmin lxd sambashare docker
Como vemos, mi usuario pertenece a varios grupos más, entre ellos a uno llamado sudo. Los usuarios que tengan acceso a este grupo tienen poderes de administrador, por lo que para que el nuevo usuario que hemos creado tenga estos poderes hay que añadirle al grupo sudo
Para añadir a un usuario a un grupo hay dos maneras: una es con el comando gpasswd -a <user> <group>
InputPython!sudo gpasswd -a noadmin sudoCopied
Añadiendo al usuario noadmin al grupo sudo
Vemos ahora a qué grupos pertenece el usuario noadmin
InputPython!groups noadminCopied
noadmin : noadmin sudo
Como vemos, ya pertenece al grupo sudo, por lo que ya tendría poderes de administrador
Eliminamos al usuario noadmin del grupo sudo con el comando gpasswd -d <user> <group>
InputPython!sudo gpasswd -d noadmin sudoCopied
Eliminando al usuario noadmin del grupo sudo
Vemos que noadmin ya no pertenece al grupo sudo
InputPython!groups noadminCopied
noadmin : noadmin
El segundo comando para añadir a un usuario a un grupo es usermod -aG <group> <user>
InputPython!sudo usermod -aG sudo noadminCopied
Volvemos a ver a qué grupos pertenece el usuario noadmin
InputPython!groups noadminCopied
noadmin : noadmin sudo
Sacamos al usuario noadmin del grupo sudo y lo borramos
InputPython!sudo gpasswd -d noadmin sudoCopied
Eliminando al usuario noadmin del grupo sudo
InputPython!sudo userdel noadminCopied
Historial de comandos
history
Si en la terminal introducimos el comando history, vemos un historial de los comandos utilizados
InputPython!historyCopied
1009 docker build . nvidia/cuda1010 docker build --help1011 docker build --build-arg nvidia/cuda1012 docker build --build-arg [nvidia/cuda]1013 cd ../docker/1014 docker ps -a1015 docker rm boring_wescoff1016 docker compose up -d1017 docker compose exec deepstream61 bash1018 cd ......1996 ps1997 ps aux1998 camerasIP.sh1999 sudo su2000 sudo useradd usertest2001 sudo userdel usertest2002 sudo useradd usertest2003 sudo userdel usertest2004 sudo su2005 sudo apt install history2006 history2007 clear2008 history
Si queremos ejecutar uno de los comandos del historial, lo hacemos mediante !<num command>, por ejemplo, si quiero volver a ejecutar el comando 1996
InputPython! !1996Copied
PID TTY TIME CMD6610 pts/0 00:00:00 bash20826 pts/0 00:00:00 ps
reverse-i-search
Una manera más refinada de buscar en el historial es introducir CTRL+r. Al hacer esto, aparecerá el siguiente mensaje en la consola
InputPython!reverse-i-search)`':Copied
De manera que según vayas escribiendo, irán apareciendo comandos que coincidan con lo que has introducido. Por ejemplo, si introduzco if me aparece la última vez que utilicé ifconfig.
Si volvemos a introducir CTRL+r irán apareciendo coincidencias más antiguas
Eliminar comandos del historial
Hay comandos como ls, cd, pwd que no nos aportan mucho que estén en el historial, por lo que se puede configurar para que no se guarden en el historial. Para hacerlo modificamos el archivo ~/.bashrc y añadimos la línea HISTIGNORE="pwd:ls:cd"
Seguridad
Firewall ufw
Ubuntu viene con el firewall ufw instalado, pero para comprobarlo usamos el siguiente comando
InputPython!sudo ufw statusCopied
Estado: inactivo
Como vemos, por defecto está inactivo, por lo que vamos a crear un conjunto de reglas. Por ejemplo, vamos a empezar abriendo el puerto 22 (SSH), para ello usamos el comando sudo allow <port> comment "<coment>", con el que abrimos un puerto y añadimos un comentario
InputPython!sudo ufw allow 22 comment 'ssh'Copied
Regla añadidaRegla añadida (v6)
Como vemos, ha abierto el puerto 22 para IPv4 e IPv6. Vamos ahora a activar ufw con el comando ufw enable
InputPython!sudo ufw enableCopied
El cortafuegos está activo y habilitado en el arranque del sistema
Si queremos ver las reglas que tenemos en el firewall usamos el comando ufw status
InputPython!sudo ufw enableCopied
Hasta Acción Desde----- ------ -----22 ALLOW Anywhere # ssh22 (v6) ALLOW Anywhere (v6) # ssh
También podemos decirle que nos muestre las reglas numeradas con el comando ufw status numbered
InputPython!sudo ufw status numberedCopied
Estado: activoHasta Acción Desde----- ------ -----[ 1] 22 ALLOW IN Anywhere # ssh[ 2] 22 (v6) ALLOW IN Anywhere (v6) # ssh
Como las tenemos numeradas, podemos eliminar una mediante el comando ufw delete <rule number>, por lo que para borrar la regla para IPv6 hacemos
InputPython!sudo ufw delete 2Copied
Estado: activoBorrando:allow 22 comment 'ssh'¿Continuar con la operación (s|n)? sRegla eliminada (v6)
Volvemos a ver el estado
InputPython!sudo ufw status numberedCopied
Estado: activoHasta Acción Desde----- ------ -----[ 1] 22 ALLOW IN Anywhere # ssh
Vemos que efectivamente se ha eliminado la regla número 2.
Si queremos habilitar la conexión SSH desde una sola IP usamos el flag from <IP>
InputPython!sudo ufw allow from 192.168.1.103 proto tcp to any port 22 comment 'ssh ip'Copied
Regla añadida
Volvemos a comprobar las reglas
InputPython!sudo ufw status numberedCopied
Estado: activoHasta Acción Desde----- ------ -----[ 1] 22 ALLOW IN Anywhere # ssh[ 2] 22/tcp ALLOW IN 192.168.1.103 # ssh ip
Si queremos borrar todas las reglas, usamos el comando reset
InputPython!sudo ufw resetCopied
Estado: activoReiniciando todas las reglas a sus valores predeterminados instalados.¿Continuar con la operación (s|n)? sRespaldando «user.rules» en «/etc/ufw/user.rules.20221205_171730»Respaldando «before.rules» en «/etc/ufw/before.rules.20221205_171730»Respaldando «after.rules» en «/etc/ufw/after.rules.20221205_171730»Respaldando «user6.rules» en «/etc/ufw/user6.rules.20221205_171730»Respaldando «before6.rules» en «/etc/ufw/before6.rules.20221205_171730»Respaldando «after6.rules» en «/etc/ufw/after6.rules.20221205_171730»
Volvemos a comprobar el estado
InputPython!sudo ufw status numberedCopied
Estado: inactivo
Vemos que ya no hay ninguna regla
Para desactivar el firewall usamos el comando ufw disable
InputPython!sudo ufw disableCopied
El cortafuegos está detenido y deshabilitado en el arranque del sistema
Volvemos a comprobar el estado
InputPython!sudo ufw statusCopied
Estado: inactivo
Auditoría de seguridad con Lynis
Para instalar Lynis tienes que usar el comando sudo apt install lynis
Para hacer una auditoría de tu sistema hay que usar el comando lynis audit system. Esto comienza a hacer un escaneo de todo el sistema y te lo reporta.
No voy a mostrar el resultado del escaneo de mi sistema para no mostrar en Internet mis vulnerabilidades
Programación de comandos
Programación de comandos periódicos con cron
Con el comando cron podemos programar comandos para que se ejecuten periódicamente. Para ello tenemos que editar el archivo /etc/crontab
InputPython!cat /etc/crontabCopied
# /etc/crontab: system-wide crontab# Unlike any other crontab you don't have to run the `crontab'# command to install the new version when you edit this file# and files in /etc/cron.d. These files also have username fields,# that none of the other crontabs do.SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed17 * * * * root cd / && run-parts --report /etc/cron.hourly25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )#
Cómo se puede ver, en este archivo hay una serie de comandos que se ejecutan periódicamente. El formato de estos comandos es el siguiente
<minuto> <hora> <día del mes> <mes> <día de la semana> <usuario> <comando>Para crear bien la fecha en la que quieres que se ejecute el comando, hay un montón de páginas online que te ayudan a escribirlo bien, como por ejemplo crontab guru
Programación de comandos de una sola ejecución con at
Cuando queremos que en el futuro se ejecute un comando, pero no queremos que se haga periódicamente, sino que solo se haga una sola vez, podemos usar el comando at. Por ejemplo, enciendes una máquina de Azure, o Amazon, por la que te cobran y quieres estar seguro de que se va a apagar y no te va a llegar una sorpresa en la factura, puedes dejar programado que por la noche se apague. Así, aunque se te olvide apagarla, se apagará sola
Hacemos un ls a la carpeta /tmp
InputPython!ls -l /tmpCopied
total 60-rw------- 1 wallabot wallabot 0 sep 24 08:51 config-err-QM3AAe-rw-r--r-- 1 root root 2049 sep 24 08:51 glances-root.logdrwx------ 2 wallabot wallabot 4096 sep 24 09:06 pyright-9853-BG3nXEXw0Taodrwxrwxr-x 3 wallabot wallabot 4096 sep 24 09:06 python-languageserver-cancellationdrwx------ 3 root root 4096 sep 24 08:51 snap-private-tmpdrwx------ 2 wallabot wallabot 4096 sep 24 08:51 ssh-mHjlSPPoqCp7drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-colord.service-rpjPridrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-fwupd.service-FzPoQfdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-geoclue.service-F6pMWidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-ModemManager.service-Orf6Bidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-switcheroo-control.service-1QXRqjdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-logind.service-lL35tgdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-resolved.service-iaswSidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-timesyncd.service-Yet8ljdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-upower.service-oTL7Ggdrwx------ 2 wallabot wallabot 4096 sep 24 09:31 tracker-extract-files.1000
Ahora vamos a programar que se cree un archivo nuevo en /tmp dentro de 5 minutos
InputPython!at 09:55 touch /tmp/at.txtCopied
warning: commands will be executed using /bin/shat> touch /tmp/at.txtat> <EOT>job 1 at Sun Sep 24 09:55:00 2023
Como vemos, hay que escribir at <time> y en la siguiente línea el comando que queramos que se ejecute
Vemos ahora los archivos que hay en /tmp
InputPython!ls -l /tmpCopied
total 60-rw-rw-r-- 1 wallabot wallabot 0 sep 24 09:55 at.txt-rw------- 1 wallabot wallabot 0 sep 24 08:51 config-err-QM3AAe-rw-r--r-- 1 root root 2049 sep 24 08:51 glances-root.logdrwx------ 2 wallabot wallabot 4096 sep 24 09:06 pyright-9853-BG3nXEXw0Taodrwxrwxr-x 3 wallabot wallabot 4096 sep 24 09:06 python-languageserver-cancellationdrwx------ 3 root root 4096 sep 24 08:51 snap-private-tmpdrwx------ 2 wallabot wallabot 4096 sep 24 08:51 ssh-mHjlSPPoqCp7drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-colord.service-rpjPridrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-fwupd.service-FzPoQfdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-geoclue.service-F6pMWidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-ModemManager.service-Orf6Bidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-switcheroo-control.service-1QXRqjdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-logind.service-lL35tgdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-resolved.service-iaswSidrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-timesyncd.service-Yet8ljdrwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-upower.service-oTL7Ggdrwx------ 2 wallabot wallabot 4096 sep 24 09:31 tracker-extract-files.1000
Como vemos, hay un at.txt que se ha creado a las 09:55
Atajos de teclado
A continuación se muestran unos cuantos atajos de teclado útiles en el uso de la terminal
- Ctrl+a: lleva el cursor al inicio de la línea de comandos.
- Ctrl+e: lleva el cursor al final de la línea de comandos.
- Ctrl+l: limpia la terminal, similar a lo que hace el comando
clear. - Ctrl+u: limpia desde la posición del cursor hasta el inicio de la línea. Si se está al final, limpia la línea entera.
- Ctrl+k: limpia desde la posición del cursor hasta el final de la línea. Si se está al inicio, limpia la línea entera.
- Ctrl+h: hace lo mismo que la tecla backspace, borra el carácter inmediatamente anterior a la posición del cursor.
- Ctrl+w: borra la palabra inmediatamente anterior al cursor.
- Alt+d o Esc+d: borra la palabra siguiente después del cursor.
- Ctrl+p: establece la línea de comandos con el último comando introducido.
- Ctrl+r: inicia la búsqueda de comandos usados anteriormente, tecleando parte de un comando usados anteriormente que hayamos realizado incluyendo las opciones y parámetros. Hecha una búsqueda pulsando de nuevo la combinación de teclas encontraremos coincidencias anteriores.* Ctrl+c: termina el proceso que se esté ejecutando, útil para recuperar el control del sistema.
- Ctrl+d: sale de la terminal, similar al comando exit.
- Ctrl+z: suspende la ejecución del proceso que se está ejecutando y lo pone en segundo plano; con el comando fg, podremos volver a continuar su ejecución.
- Ctrl+t: intercambia la posición de los dos caracteres antes del cursor, útil para corregir malos tecleos.
- Esc+t: intercambia la posición de las dos palabras antes del cursor, útil para corregir malos tecleos.
- Alt+f: mueve el cursor al inicio de la palabra siguiente de la línea, lo mismo que Ctrl+right en la terminal de GNOME.
- Alt+b: mueve el cursor al inicio de la palabra anterior de la línea, lo mismo que Ctrl+left en la terminal de GNOME.
- Tab: autocompleta comandos o rutas de directorios o archivos.
- Ctrl+Shift+F: abre un diálogo para hacer una búsqueda de texto en la salida de la terminal.* Ctrl+Shift+g: busca la siguiente ocurrencia de la búsqueda previa en la terminal.
- Ctrl+Shift+h: busca la anterior ocurrencia de la búsqueda previa en la terminal.
- Ctrl+Shift+c: copia el texto seleccionado de la terminal al portapapeles.
- Ctrl+Shift+v: pega el texto del portapapeles en la línea de comandos.
- Up: establece en la línea de comandos el comando anterior del historial, igual que Ctrl+p.
- Down: establece en la línea de comandos el siguiente comando del historial.
- Left Mouse: selecciona líneas de texto de la terminal.
- Ctrl+Left Mouse: selecciona bloques de texto de la terminal.
Sistema de carpetas en Linux
En la siguiente imagen podemos ver cómo es el sistema de carpetas en Linux
Esta imagen ha sido sacada del post de LinkedIn Roberto Morais
Fricadas
Te olvidaste de usar sudo
¿Nunca te ha pasado que has ido a usar un comando que tenías que ejecutarlo con sudo, pero te olvidaste de escribir sudo? Pues, después de recibir el correspondiente error, si haces sudo !! se ejecutará el comando anterior con sudo
InputPython!apt updateCopied
Leyendo lista de paquetes... HechoE: No se pudo abrir el fichero de bloqueo «/var/lib/apt/lists/lock» - open (13: Permiso denegado)E: No se pudo bloquear el directorio /var/lib/apt/lists/W: Se produjo un problema al desligar el fichero /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permiso denegado)W: Se produjo un problema al desligar el fichero /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permiso denegado)
Como se puede ver, al hacer sudo update nos da un error, pero si ahora ejecutamos sudo !! se ejecutará sudo apt update
InputPython!sudo !!Copied
[sudo] contraseña para wallabot:
Mensajes del kernel
Con el comando dmesg (display kernel ring buffer messages) podemos ver los mensajes del kernel. Por ejemplo, esto es muy útil para ver si se ha conectado un dispositivo USB, o para depurar errores HW de nuestro ordenador
InputPython!dmesg | tailCopied
[ 35.812312] input: LogiOps Virtual Input as /devices/virtual/input/input33[ 35.916406] input: LogiOps Virtual Input as /devices/virtual/input/input34[ 36.002064] input: LogiOps Virtual Input as /devices/virtual/input/input35[ 63.879806] input: MX Master 3 as /devices/virtual/misc/uhid/0005:046D:B023.0006/input/input36[ 63.879931] logitech-hidpp-device 0005:046D:B023.0006: input,hidraw3: BLUETOOTH HID v0.15 Keyboard [MX Master 3] on 4c:77:cb:1d:66:d0[ 63.902120] logitech-hidpp-device 0005:046D:B023.0006: HID++ 4.5 device connected.[ 69.604899] input: MX Keys Keyboard as /devices/virtual/misc/uhid/0005:046D:B35B.0007/input/input37[ 69.605221] input: MX Keys Mouse as /devices/virtual/misc/uhid/0005:046D:B35B.0007/input/input38[ 69.606204] hid-generic 0005:046D:B35B.0007: input,hidraw4: BLUETOOTH HID v0.13 Keyboard [MX Keys] on 4c:77:cb:1d:66:d0[ 188.285030] input: T9 (AVRCP) as /devices/virtual/input/input40
Con el flag --follow podemos ver en tiempo real los nuevos mensajes que se vayan generando
InputPython!dmesg --followCopied
[ 0.000000] Linux version 5.15.0-84-generic (buildd@lcy02-amd64-005) (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #93~20.04.1-Ubuntu SMP Wed Sep 6 16:15:40 UTC 2023 (Ubuntu 5.15.0-84.93~20.04.1-generic 5.15.116)[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.15.0-84-generic root=UUID=59002381-d88d-44a6-b83d-8c5a226ce058 ro quiet splash vt.handoff=7[ 0.000000] KERNEL supported cpus:[ 0.000000] Intel GenuineIntel[ 0.000000] AMD AuthenticAMD[ 0.000000] Hygon HygonGenuine[ 0.000000] Centaur CentaurHauls[ 0.000000] zhaoxin Shanghai[ 0.000000] BIOS-provided physical RAM map:[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ffff] usable[ 0.000000] BIOS-e820: [mem 0x00000000000a0000-0x00000000000fffff] reserved[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x0000000009d01fff] usable[ 0.000000] BIOS-e820: [mem 0x0000000009d02000-0x0000000009ffffff] reserved[ 0.000000] BIOS-e820: [mem 0x000000000a000000-0x000000000a1fffff] usable[ 0.000000] BIOS-e820: [mem 0x000000000a200000-0x000000000a20bfff] ACPI NVS[ 0.000000] BIOS-e820: [mem 0x000000000a20c000-0x00000000b8983fff] usable[ 0.000000] BIOS-e820: [mem 0x00000000b8984000-0x00000000b8acdfff] reserved[ 0.000000] BIOS-e820: [mem 0x00000000b8ace000-0x00000000b8c56fff] ACPI data[ 0.000000] BIOS-e820: [mem 0x00000000b8c57000-0x00000000b9107fff] ACPI NVS[ 0.000000] BIOS-e820: [mem 0x00000000b9108000-0x00000000ba55cfff] reserved[ 0.000000] BIOS-e820: [mem 0x00000000ba55d000-0x00000000bcffffff] usable[ 0.000000] BIOS-e820: [mem 0x00000000bd000000-0x00000000bfffffff] reserved[ 0.000000] BIOS-e820: [mem 0x00000000f8000000-0x00000000fbffffff] reserved...[ 35.916406] input: LogiOps Virtual Input as /devices/virtual/input/input34[ 36.002064] input: LogiOps Virtual Input as /devices/virtual/input/input35[ 63.879806] input: MX Master 3 as /devices/virtual/misc/uhid/0005:046D:B023.0006/input/input36[ 63.879931] logitech-hidpp-device 0005:046D:B023.0006: input,hidraw3: BLUETOOTH HID v0.15 Keyboard [MX Master 3] on 4c:77:cb:1d:66:d0[ 63.902120] logitech-hidpp-device 0005:046D:B023.0006: HID++ 4.5 device connected.[ 69.604899] input: MX Keys Keyboard as /devices/virtual/misc/uhid/0005:046D:B35B.0007/input/input37[ 69.605221] input: MX Keys Mouse as /devices/virtual/misc/uhid/0005:046D:B35B.0007/input/input38[ 69.606204] hid-generic 0005:046D:B35B.0007: input,hidraw4: BLUETOOTH HID v0.13 Keyboard [MX Keys] on 4c:77:cb:1d:66:d0[ 188.285030] input: T9 (AVRCP) as /devices/virtual/input/input40
^C
Información del hardware
Con lshw podemos ver información del hardware de nuestro ordenador
InputPython!lshwCopied
AVISO: debería ejecutar este programa como superusuario.wallabotdescripción: Computeranchura: 64 bitscapacidades: smp vsyscall32*-coredescripción: Motherboardid físico: 0*-memorydescripción: Memoria de sistemaid físico: 0tamaño: 32GiB...producto: PnP device PNP0501id físico: 6capacidades: pnpconfiguración: driver=serial*-pnp00:05producto: PnP device PNP0c02id físico: 7capacidades: pnpconfiguración: driver=systemAVISO: la salida puede ser incompleta o imprecisa, debería ejecutar este programa como superusuario.
Cowsay
Hay un comando llamado cowsay al que le pasas como parámetro un texto y te dibuja una vaca diciendo ese texto.
Es posible que no lo tengas instalado, por lo que, para instalarlo, tienes que introducir el comando
sudo apt install cowsayInputPythonterminal("cowsay MaximoFN")Copied
__________< MaximoFN >----------\ ^__^\ (oo)\_______(__)\ )\/\||----w ||| ||
Si le añades el flag -f dragon, quien lo dice es un dragón.
InputPythonterminal("cowsay -f dragon MaximoFN")Copied
__________< MaximoFN >----------\ / \ //\\ |\___/| / \// \\/0 0 \__ / // | \ \/ / \/_/ // | \ \@_^_@'/ \/_ // | \ \//_^_/ \/_ // | \ \( //) | \/// | \ \( / /) _|_ / ) // | \ _\( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.(( / / )) ,-{ _ `-.|.-~-. .~ `.(( // / )) '/\ / ~-. _ .-~ .-~^-. \(( /// )) `. { } / \ \(( / )) .----~-.\ \-' .~ \ `. \^-.///.----..> \ _ -~ `. ^-` ^-_///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~/.-~
InputPythonterminal("cowsay -f dragon-and-cow MaximoFN")Copied
__________< MaximoFN >----------\ ^ /^\ / \ // \\ |\___/| / \// .\\ /O O \__ / // | \ \ *----*/ / \/_/ // | \ \ \ |@___@` \/_ // | \ \ \/\ \0/0/| \/_ // | \ \ \ \0/0/0/0/| \/// | \ \ | |0/0/0/0/0/_|_ / ( // | \ _\ | /0/0/0/0/0/0/`/,_ _ _/ ) ; -. | _ _\.-~ / /,-} _ *-.|.-~-. .~ ~\ \__/ `/\ / ~-. _ .-~ /\____(oo) *. } { /( (--) .----~-.\ \-` .~//__\\ \__ Ack! ///.----..< \ _ -~// \\ ///-._ _ _ _ _ _ _{^ - - - - ~
Limpieza
Como se ha creado la carpeta prueba, la borramos para dejarlo todo como lo encontramos.
InputPython!rm -r pruebaCopied