Terminal (3/3): administración del sistema

Terminal (3/3): administración del sistema

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 RAMlink image 1

Si solo queremos obtener información de la memoria podemos hacer uso del comando free

	
< > Input
Python
!free
Copied
>_ Output
			
total usado libre compartido búfer/caché disponible
Memoria: 32774516 6563544 20091804 276296 6119168 25479600
Swap: 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

	
< > Input
Python
!free -h
Copied
>_ Output
			
total usado libre compartido búfer/caché disponible
Memoria: 31Gi 6,3Gi 19Gi 270Mi 5,8Gi 24Gi
Swap: 2,0Gi 0B 2,0Gi

Gestión del disco durolink image 2

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

	
< > Input
Python
!du ~/Documentos/web/portafolio/posts/
Copied
>_ Output
			
8 /home/wallabot/Documentos/web/portafolio/posts/__pycache__
1648 /home/wallabot/Documentos/web/portafolio/posts/notebooks_translated
4288 /home/wallabot/Documentos/web/portafolio/posts/html_files
336 /home/wallabot/Documentos/web/portafolio/posts/prueba/tocompress
1132 /home/wallabot/Documentos/web/portafolio/posts/prueba
16 /home/wallabot/Documentos/web/portafolio/posts/introduccion_python/__pycache__
28 /home/wallabot/Documentos/web/portafolio/posts/introduccion_python
11232 /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

	
< > Input
Python
!du ~/Documentos/web/portafolio/posts/ -h
Copied
>_ Output
			
8,0K /home/wallabot/Documentos/web/portafolio/posts/__pycache__
1,7M /home/wallabot/Documentos/web/portafolio/posts/notebooks_translated
4,2M /home/wallabot/Documentos/web/portafolio/posts/html_files
336K /home/wallabot/Documentos/web/portafolio/posts/prueba/tocompress
1,2M /home/wallabot/Documentos/web/portafolio/posts/prueba
16K /home/wallabot/Documentos/web/portafolio/posts/introduccion_python/__pycache__
28K /home/wallabot/Documentos/web/portafolio/posts/introduccion_python
11M /home/wallabot/Documentos/web/portafolio/posts/

Gestión de interfaceslink image 3

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

	
< > Input
Python
!tty
Copied
>_ Output
			
/dev/pts/0

Manejo de paqueteslink image 4

Repositorios PPA (Personal Package Archives)link image 5

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.

	
< > Input
Python
terminal("cat /etc/apt/sources.list", max_lines_output=10)
Copied
>_ Output
			
# 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:

  1. 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).

  1. 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.

  1. 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
  1. 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
  1. Partner

Este repositorio contiene software propietario compilado por Ubuntu de sus socios.

  1. 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 repositorioslink image 6

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 repositorioslink image 7

Mediante el comando apt update podremos actualizar a las últimas versiones de los paquetes que tenemos en nuestro repositorio.

Actualizar los paqueteslink image 8

Mediante el comando apt upgrade podremos actualizar los programas que tengamos instalados y de los cuales antes hayamos actualizado su repositorio

Actualizar el kernellink image 9

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 paqueteslink image 10

Con el comando apt search <paquete> podemos encontrar paquetes

	
< > Input
Python
terminal("apt search vlc", max_lines_output=10)
Copied
>_ Output
			
Ordenando...
Buscar en todo el texto...
anacrolix-dms/focal 1.1.0-1 amd64
Go UPnP DLNA Digital Media Server with basic video transcoding
cubemap/focal 1.4.3-1build1 amd64
scalable video reflector, designed to be used with VLC
dvblast/focal 3.4-1 amd64
Simple and powerful dvb-streaming application
...
x264/focal 2:0.155.2917+git0a84d98-2 amd64
video encoder for the H.264/MPEG-4 AVC standard

Listado de paquetes instaladoslink image 11

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

	
< > Input
Python
terminal("dpkg -l", max_lines_output=10)
Copied
>_ Output
			
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 information
ii acl 2.2.53-6 amd64 access control list - utilities
ii acpi-support 0.143 amd64 scripts for handling many ACPI events
ii acpid 1:2.0.32-1ubuntu1 amd64 Advanced Configuration and Power Interface event daemon
ii adduser 3.118ubuntu2 all add and remove users and groups
...
ii zip 3.0-11build1 amd64 Archiver for .zip files
ii zlib1g:amd64 1:1.2.11.dfsg-2ubuntu1.5 amd64 compression library - runtime
ii zlib1g:i386 1:1.2.11.dfsg-2ubuntu1.5 i386 compression library - runtime
ii 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

	
< > Input
Python
terminal("dpkg -l | grep vlc")
Copied
>_ Output
			
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 fgrep
ii vlc 3.0.9.2-1 amd64 multimedia player and streamer

Instalar paquetes descargados y no de repositorioslink image 12

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 usuarioslink image 13

Información del usuario activo con idlink image 14

Mediante el comando id puedo ver qué usuario soy

	
< > Input
Python
!id
Copied
>_ Output
			
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 whoamilink image 15

Otro comando para saber qué usuario soy es whoami

	
< > Input
Python
!whoami
Copied
>_ Output
			
wallabot

Archivo con la información de todos los usuarioslink image 16

La información de los usuarios está en el archivo /etc/passwd

	
< > Input
Python
terminal("cat /etc/passwd", max_lines_output=10)
Copied
>_ Output
			
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
...
sshd:x:126:65534::/run/sshd:/usr/sbin/nologin
nvidia-persistenced:x:127:135:NVIDIA Persistence Daemon,,,:/nonexistent:/usr/sbin/nologin
fwupd-refresh:x:128:136:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
glances:x:129:137::/var/lib/glances:/usr/sbin/nologin

Cambiar la contraseña de un usuariolink image 17

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 useraddlink image 18

Para crear un nuevo usuario se usa el comando useradd <user name>, vamos a crear un nuevo usuario

	
< > Input
Python
!sudo useradd usertest1
Copied
>_ Output
			

Vamos a ver si está en el archivo con todos los usuarios

	
< > Input
Python
!cat /etc/passwd | grep usertest
Copied
>_ Output
			
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

	
< > Input
Python
!ls /home
Copied
>_ Output
			
wallabot

Solo está la carpeta del usuario wallabot, pero no la del usuario test1

Crear usuarios con adduserlink image 19

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

	
< > Input
Python
!sudo adduser usertest2
Copied
>_ Output
			
[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 correctamente
Cambiando la información de usuario para usertest2
Introduzca el nuevo valor, o presione INTRO para el predeterminado
Nombre 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

	
< > Input
Python
!cat /etc/passwd | grep usertest
Copied
>_ Output
			
usertest1:x:1001:1001::/home/usertest1:/bin/sh
usertest2:x:1002:1002:,,,:/home/usertest2:/bin/bash

Vemos que se ha creado el usuario usertest2

	
< > Input
Python
!ls /home
Copied
>_ Output
			
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>

	
< > Input
Python
!sudo userdel usertest1
Copied
>_ Output
			
	
< > Input
Python
!sudo userdel usertest2
Copied
>_ Output
			

Vamos a ver si están en el archivo con todos los usuarios.

	
< > Input
Python
!cat /etc/passwd | grep usertest
Copied

Vemos que ya no aparece nada, de hecho vemos el final de ese archivo.

	
< > Input
Python
!tail /etc/passwd
Copied
>_ Output
			
geoclue:x:122:127::/var/lib/geoclue:/usr/sbin/nologin
pulse:x:123:128:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin
gnome-initial-setup:x:124:65534::/run/gnome-initial-setup/:/bin/false
gdm:x:125:130:Gnome Display Manager:/var/lib/gdm3:/bin/false
wallabot:x:1000:1000:wallabot,,,:/home/wallabot:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
sshd:x:126:65534::/run/sshd:/usr/sbin/nologin
nvidia-persistenced:x:127:135:NVIDIA Persistence Daemon,,,:/nonexistent:/usr/sbin/nologin
fwupd-refresh:x:128:136:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
glances:x:129:137::/var/lib/glances:/usr/sbin/nologin

Hacer un usuario administradorlink image 20

Primero vamos a crear un usuario nuevo, que al inicio no será administrador

	
< > Input
Python
!sudo adduser noadmin
Copied
>_ Output
			
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 correctamente
Cambiando la información de usuario para noadmin
Introduzca el nuevo valor, o presione INTRO para el predeterminado
Nombre 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>

	
< > Input
Python
!groups noadmin
Copied
>_ Output
			
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

	
< > Input
Python
!groups wallabot
Copied
>_ Output
			
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>

	
< > Input
Python
!sudo gpasswd -a noadmin sudo
Copied
>_ Output
			
Añadiendo al usuario noadmin al grupo sudo

Vemos ahora a qué grupos pertenece el usuario noadmin

	
< > Input
Python
!groups noadmin
Copied
>_ Output
			
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>

	
< > Input
Python
!sudo gpasswd -d noadmin sudo
Copied
>_ Output
			
Eliminando al usuario noadmin del grupo sudo

Vemos que noadmin ya no pertenece al grupo sudo

	
< > Input
Python
!groups noadmin
Copied
>_ Output
			
noadmin : noadmin

El segundo comando para añadir a un usuario a un grupo es usermod -aG <group> <user>

	
< > Input
Python
!sudo usermod -aG sudo noadmin
Copied
>_ Output
			

Volvemos a ver a qué grupos pertenece el usuario noadmin

	
< > Input
Python
!groups noadmin
Copied
>_ Output
			
noadmin : noadmin sudo

Sacamos al usuario noadmin del grupo sudo y lo borramos

	
< > Input
Python
!sudo gpasswd -d noadmin sudo
Copied
>_ Output
			
Eliminando al usuario noadmin del grupo sudo
	
< > Input
Python
!sudo userdel noadmin
Copied
>_ Output
			

Historial de comandoslink image 21

historylink image 22

Si en la terminal introducimos el comando history, vemos un historial de los comandos utilizados

	
< > Input
Python
!history
Copied
>_ Output
			
1009 docker build . nvidia/cuda
1010 docker build --help
1011 docker build --build-arg nvidia/cuda
1012 docker build --build-arg [nvidia/cuda]
1013 cd ../docker/
1014 docker ps -a
1015 docker rm boring_wescoff
1016 docker compose up -d
1017 docker compose exec deepstream61 bash
1018 cd ..
....
1996 ps
1997 ps aux
1998 camerasIP.sh
1999 sudo su
2000 sudo useradd usertest
2001 sudo userdel usertest
2002 sudo useradd usertest
2003 sudo userdel usertest
2004 sudo su
2005 sudo apt install history
2006 history
2007 clear
2008 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

	
< > Input
Python
! !1996
Copied
>_ Output
			
PID TTY TIME CMD
6610 pts/0 00:00:00 bash
20826 pts/0 00:00:00 ps

Una manera más refinada de buscar en el historial es introducir CTRL+r. Al hacer esto, aparecerá el siguiente mensaje en la consola

	
< > Input
Python
!reverse-i-search)`':
Copied
>_ Output
			

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 historiallink image 24

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"

Seguridadlink image 25

Firewall ufwlink image 26

Ubuntu viene con el firewall ufw instalado, pero para comprobarlo usamos el siguiente comando

	
< > Input
Python
!sudo ufw status
Copied
>_ Output
			
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

	
< > Input
Python
!sudo ufw allow 22 comment 'ssh'
Copied
>_ Output
			
Regla añadida
Regla añadida (v6)

Como vemos, ha abierto el puerto 22 para IPv4 e IPv6. Vamos ahora a activar ufw con el comando ufw enable

	
< > Input
Python
!sudo ufw enable
Copied
>_ Output
			
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

	
< > Input
Python
!sudo ufw enable
Copied
>_ Output
			
Hasta Acción Desde
----- ------ -----
22 ALLOW Anywhere # ssh
22 (v6) ALLOW Anywhere (v6) # ssh

También podemos decirle que nos muestre las reglas numeradas con el comando ufw status numbered

	
< > Input
Python
!sudo ufw status numbered
Copied
>_ Output
			
Estado: activo
Hasta 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

	
< > Input
Python
!sudo ufw delete 2
Copied
>_ Output
			
Estado: activo
Borrando:
allow 22 comment 'ssh'
¿Continuar con la operación (s|n)? s
Regla eliminada (v6)

Volvemos a ver el estado

	
< > Input
Python
!sudo ufw status numbered
Copied
>_ Output
			
Estado: activo
Hasta 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>

	
< > Input
Python
!sudo ufw allow from 192.168.1.103 proto tcp to any port 22 comment 'ssh ip'
Copied
>_ Output
			
Regla añadida

Volvemos a comprobar las reglas

	
< > Input
Python
!sudo ufw status numbered
Copied
>_ Output
			
Estado: activo
Hasta 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

	
< > Input
Python
!sudo ufw reset
Copied
>_ Output
			
Estado: activo
Reiniciando todas las reglas a sus valores predeterminados instalados.
¿Continuar con la operación (s|n)? s
Respaldando «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

	
< > Input
Python
!sudo ufw status numbered
Copied
>_ Output
			
Estado: inactivo

Vemos que ya no hay ninguna regla

Para desactivar el firewall usamos el comando ufw disable

	
< > Input
Python
!sudo ufw disable
Copied
>_ Output
			
El cortafuegos está detenido y deshabilitado en el arranque del sistema

Volvemos a comprobar el estado

	
< > Input
Python
!sudo ufw status
Copied
>_ Output
			
Estado: inactivo

Auditoría de seguridad con Lynislink image 27

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 comandoslink image 28

Programación de comandos periódicos con cronlink image 29

Con el comando cron podemos programar comandos para que se ejecuten periódicamente. Para ello tenemos que editar el archivo /etc/crontab

	
< > Input
Python
!cat /etc/crontab
Copied
>_ Output
			
# /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/sh
PATH=/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 executed
17 * * * * root cd / &amp;&amp; run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / &amp;&amp; run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / &amp;&amp; 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 atlink image 30

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

	
< > Input
Python
!ls -l /tmp
Copied
>_ Output
			
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.log
drwx------ 2 wallabot wallabot 4096 sep 24 09:06 pyright-9853-BG3nXEXw0Tao
drwxrwxr-x 3 wallabot wallabot 4096 sep 24 09:06 python-languageserver-cancellation
drwx------ 3 root root 4096 sep 24 08:51 snap-private-tmp
drwx------ 2 wallabot wallabot 4096 sep 24 08:51 ssh-mHjlSPPoqCp7
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-colord.service-rpjPri
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-fwupd.service-FzPoQf
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-geoclue.service-F6pMWi
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-ModemManager.service-Orf6Bi
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-switcheroo-control.service-1QXRqj
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-logind.service-lL35tg
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-resolved.service-iaswSi
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-timesyncd.service-Yet8lj
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-upower.service-oTL7Gg
drwx------ 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

	
< > Input
Python
!at 09:55 touch /tmp/at.txt
Copied
>_ Output
			
warning: commands will be executed using /bin/sh
at&gt; touch /tmp/at.txt
at&gt; &lt;EOT&gt;
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

	
< > Input
Python
!ls -l /tmp
Copied
>_ Output
			
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.log
drwx------ 2 wallabot wallabot 4096 sep 24 09:06 pyright-9853-BG3nXEXw0Tao
drwxrwxr-x 3 wallabot wallabot 4096 sep 24 09:06 python-languageserver-cancellation
drwx------ 3 root root 4096 sep 24 08:51 snap-private-tmp
drwx------ 2 wallabot wallabot 4096 sep 24 08:51 ssh-mHjlSPPoqCp7
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-colord.service-rpjPri
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-fwupd.service-FzPoQf
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-geoclue.service-F6pMWi
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-ModemManager.service-Orf6Bi
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-switcheroo-control.service-1QXRqj
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-logind.service-lL35tg
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-resolved.service-iaswSi
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-systemd-timesyncd.service-Yet8lj
drwx------ 3 root root 4096 sep 24 08:51 systemd-private-371a1d9479324db8bd79b6844b8b589b-upower.service-oTL7Gg
drwx------ 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 tecladolink image 31

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 Linuxlink image 32

En la siguiente imagen podemos ver cómo es el sistema de carpetas en Linux

carpetas_linux

Esta imagen ha sido sacada del post de LinkedIn Roberto Morais

Fricadaslink image 33

Te olvidaste de usar sudolink image 34

¿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

	
< > Input
Python
!apt update
Copied
>_ Output
			
Leyendo lista de paquetes... Hecho
E: 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

	
< > Input
Python
!sudo !!
Copied
>_ Output
			
[sudo] contraseña para wallabot:

Mensajes del kernellink image 35

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

	
< > Input
Python
!dmesg | tail
Copied
>_ Output
			
[ 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

	
< > Input
Python
!dmesg --follow
Copied
>_ Output
			
[ 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
>_ Output
			
^C

Información del hardwarelink image 36

Con lshw podemos ver información del hardware de nuestro ordenador

	
< > Input
Python
!lshw
Copied
>_ Output
			
AVISO: debería ejecutar este programa como superusuario.
wallabot
descripción: Computer
anchura: 64 bits
capacidades: smp vsyscall32
*-core
descripción: Motherboard
id físico: 0
*-memory
descripción: Memoria de sistema
id físico: 0
tamaño: 32GiB
...
producto: PnP device PNP0501
id físico: 6
capacidades: pnp
configuración: driver=serial
*-pnp00:05
producto: PnP device PNP0c02
id físico: 7
capacidades: pnp
configuración: driver=system
AVISO: la salida puede ser incompleta o imprecisa, debería ejecutar este programa como superusuario.

Cowsaylink image 37

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 cowsay
	
< > Input
Python
terminal("cowsay MaximoFN")
Copied
>_ Output
			
__________
< MaximoFN >
----------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||

Si le añades el flag -f dragon, quien lo dice es un dragón.

	
< > Input
Python
terminal("cowsay -f dragon MaximoFN")
Copied
>_ Output
			
__________
< MaximoFN >
----------
\ / \ //\
\ |\___/| / \// \\
/0 0 \__ / // | \ \
/ / \/_/ // | \ \
@_^_@'/ \/_ // | \ \
//_^_/ \/_ // | \ \
( //) | \/// | \ \
( / /) _|_ / ) // | \ _\
( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.
(( / / )) ,-{ _ `-.|.-~-. .~ `.
(( // / )) '/\ / ~-. _ .-~ .-~^-. \
(( /// )) `. { } / \ \
(( / )) .----~-.\ \-' .~ \ `. \^-.
///.----..> \ _ -~ `. ^-` ^-_
///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~
/.-~
	
< > Input
Python
terminal("cowsay -f dragon-and-cow MaximoFN")
Copied
>_ Output
			
__________
< MaximoFN >
----------
\ ^ /^
\ / \ // \
\ |\___/| / \// .\
\ /O O \__ / // | \ \ *----*
/ / \/_/ // | \ \ \ |
@___@` \/_ // | \ \ \/\ \
0/0/| \/_ // | \ \ \ \
0/0/0/0/| \/// | \ \ | |
0/0/0/0/0/_|_ / ( // | \ _\ | /
0/0/0/0/0/0/`/,_ _ _/ ) ; -. | _ _\.-~ / /
,-} _ *-.|.-~-. .~ ~
\ \__/ `/\ / ~-. _ .-~ /
\____(oo) *. } { /
( (--) .----~-.\ \-` .~
//__\\ \__ Ack! ///.----..< \ _ -~
// \\ ///-._ _ _ _ _ _ _{^ - - - - ~

Limpiezalink image 38

Como se ha creado la carpeta prueba, la borramos para dejarlo todo como lo encontramos.

	
< > Input
Python
!rm -r prueba
Copied

Seguir leyendo

Últimos posts -->

¿Has visto estos proyectos?

Gymnasia

Gymnasia Gymnasia
React Native
Expo
TypeScript
FastAPI
Next.js
OpenAI
Anthropic

Aplicación móvil de entrenamiento personal con asistente de IA, biblioteca de ejercicios, seguimiento de rutinas, dieta y medidas corporales

Horeca chatbot

Horeca chatbot Horeca chatbot
Python
LangChain
PostgreSQL
PGVector
React
Kubernetes
Docker
GitHub Actions

Chatbot conversacional para cocineros de hoteles y restaurantes. Un cocinero, jefe de cocina o camaeror de un hotel o restaurante puede hablar con el chatbot para obtener información de recetas y menús. Pero además implementa agentes, con los cuales puede editar o crear nuevas recetas o menús

Naviground

Naviground Naviground
Ver todos los proyectos -->
>_ Disponible para proyectos

¿Tienes un proyecto con IA?

Hablemos.

maximofn@gmail.com

Especialista en Machine Learning e Inteligencia Artificial. Desarrollo soluciones con IA generativa, agentes inteligentes y modelos personalizados.

¿Quieres ver alguna charla?

Últimas charlas -->

¿Quieres mejorar con estos tips?

Últimos tips -->

Usa esto en local

Los espacios de Hugging Face nos permite ejecutar modelos con demos muy sencillas, pero ¿qué pasa si la demo se rompe? O si el usuario la elimina? Por ello he creado contenedores docker con algunos espacios interesantes, para poder usarlos de manera local, pase lo que pase. De hecho, es posible que si pinchas en alún botón de ver proyecto te lleve a un espacio que no funciona.

Flow edit

Flow edit Flow edit

Edita imágenes con este modelo de Flow. Basándose en SD3 o FLUX puedes editar cualquier imagen y generar nuevas

FLUX.1-RealismLora

FLUX.1-RealismLora FLUX.1-RealismLora
Ver todos los contenedores -->
>_ Disponible para proyectos

¿Tienes un proyecto con IA?

Hablemos.

maximofn@gmail.com

Especialista en Machine Learning e Inteligencia Artificial. Desarrollo soluciones con IA generativa, agentes inteligentes y modelos personalizados.

¿Quieres entrenar tu modelo con estos datasets?

short-jokes-dataset

HuggingFace

Dataset de chistes en inglés

Uso: Fine-tuning de modelos de generación de texto humorístico

231K filas 2 columnas 45 MB
Ver en HuggingFace →

opus100

HuggingFace

Dataset con traducciones de inglés a español

Uso: Entrenamiento de modelos de traducción inglés-español

1M filas 2 columnas 210 MB
Ver en HuggingFace →

netflix_titles

HuggingFace

Dataset con películas y series de Netflix

Uso: Análisis de catálogo de Netflix y sistemas de recomendación

8.8K filas 12 columnas 3.5 MB
Ver en HuggingFace →
Ver más datasets -->