🖇️
Apuntes LPIC-1
  • General
  • Ejercicios de utilidades
  • 1️Examen 101
    • Tema 101: Arquitectura del Sistema
    • Tema 102: Instalación de Linux y gestión de paquetes
    • Tema 103: Comandos GNU y Unix
      • 103.1 - Trabajar desde la línea de comandos
      • 103.2 - Procesar secuencias de texto usando filtros
        • Listado de texto plano
        • Ejercicios 103.2
      • 103.3 - Administración básica de archivos
      • 103.4 - Uso de secuencias de texto, tuberías y redireccionamientos
      • 103.5 - Crear, supervisar y matar procesos
        • 🚧Ejercicios 103.5
      • 103.6 Modificar la prioridad de ejecución de los procesos
      • 103.7 - Realizar búsquedas en archivos de texto usando expresiones regulares
      • 103.8 - Edición básica de archivos
    • Tema 104: Dispositivos, sistemas de archivos Linux y el estándar de jerarquía de archivos
    • Test prueba
  • 2️Examen 102
    • Tema 105: Shells y scripts
    • Tema 106: Interfaces de usuario y escritorios
    • Tema 107: Tareas administrativas
    • Tema 108: Servicios esenciales del sistema
    • Tema 109: Fundamentos de redes
    • Tema 110: Seguridad
Powered by GitBook
On this page
  • Topic 103.2
  • Topic 103.4
  • Topic 105.1

Ejercicios de utilidades

Aquí iré recopilando algunos ejemplos de pequeñas utilidades del sistema empleando comandos.

PreviousGeneralNextTema 101: Arquitectura del Sistema

Last updated 3 months ago

Script de información del sistema

A continuación te pongo un script que refleja algunos comandos usados a lo largo de los topics para sacar información de un sistema, por ejemplo al hacer el mantenimiento:

echo "================================================"
echo "Información del sistema"
echo "================================================"

echo "Sistema Operativo:"
uname -a

echo ""
echo "Distribución de Linux"
lsb_release -a 2>/dev/null || echo "lsbe_release ha fallado"

echo ""
echo "Versión del kernel:"
uname -r

echo ""
echo "Tiempo de actividad del Sistema:"
uptime

echo ""
echo "Espacio en Disco:"
df -h

echo ""
echo "Información de la red:"
ip a

echo ""
echo "Conexiones de red activas:"
ss -tuln

echo ""
echo "Archivos de configuración de Red:"
cat /etc/hosts
cat /etc/resolv.conf

echo ""
echo "Binarios con permisos SUID:"
find / -perm -4000 2>/dev/null

echo ""
echo "Comandos ejecutables con sudo:"
sudo -l

echo "================================================"

Gestionar archivos desde terminal con find

Topic 103.2

Ejemplo 1) Vamos a crear un directorio de correos electrónicos y contraseñas a partir de un listado de usuarios

Imaginemos que tenemos el siguiente fichero users.csv:

nombre,apellido,telefono,puesto de trabajo
Juan,Pérez,555-1234,Desarrollador
Ana,López,555-5678,Analista
Luis,García,555-8765,Administrador de Sistemas
María,Fernández,555-4321,Gerente de Proyectos
Carlos,Sánchez,555-3456,Soporte Técnico
Laura,Rodríguez,555-6543,Consultora

A partir de aquí, nuestro trabajo es añadir estas personas a un servidor LDAP por ejemplo por lo que necesitamos generarles un correo de login, una contraseña y conservar el resto de datos.

Lo primero sería conservar el archivo original:

cp users.csv users.csv.bkp

Ahora ya podemos trabajar cómodamente:

# 1- Generamos un archivo a parte de logins
cut -d "," -f 1,2 users.csv | tr 'A-Z,' 'a-z.' 1>usernames.csv

# 2- Creamos un archivo con los dominios "dominio.com" con el mismo numero de lineas y lo juntamos
# Esto de momento lo haremos a mano, más adelante veremos como hacerlo en vi o automático con un script con un bucle.
paste usernames.csv domains.csv | expand -t 1 | tr ' ' '@' >logins.csv

# 3- Instalamos la herramienta de generación de contraseñas y creamos
sudo apt install pwgen
pwgen -yB -s 8 6 >passwords.txt
#Esto creará un archivo de contraseñas con simbolos especiales y letras de 6 lineas con 8 caracteres cada una.

# 4- Lo pegamos todo y eliminamos 
paste users.csv logins.csv passwords.txt |expand -t 1 | tr ' ' ';' >users.csv

Seguro que hay formas más sencilla de hacer esto mismo con Linux pero no deja de ser una práctica de comandos útil.

Más info sobre pwdgen:

Ejemplo 2) Hagamos un listado de IPs de bancos europeos

Lo primero es descargar la base de datos con la que vamos a trabajar que es la de (si no tienes instalado wget puedes instalarlo como ya sabes):

wget https://ftp.ripe.net/ripe/dbase/ripe.db.gz

Podemos dividir este archivo en paquetes mas pequeños de 10MB:

split -b 10M ripe.db ripe_

Vamos con el procedimiento:

# 1- Vamos primero a leer (cierralo con Ctrl+C) y descomprimir la bd
zcat ripe.db.gz
gunzip ripe.db.gz

# 2- Busquemos coincidencias por bancos:
grep -i -B 1 bank ripe.db 
# -i hara la busqueda case-insensitive
# -B 1 nos mostrará la fila coincidente y la superior 

# 3- Añadimos aquellas entradas de IP
grep -i -B 1 bank ripe.db | grep inetnum 
#El inetnum es el campo de rango de IPs

# 4- Damos formato al documento
#Eliminamos espacios
#Nos quedamos con lo que hay despues de ":"
#Ordenamos las filas
grep -i -B 1 bank ripe.db | grep inetnum | tr -d ' ' | cut -d ':' -f 2 | sort >bank-ip.txt

Podemos leer o comprobar ahora el recuento de entradas:

more bank-ip.txt
wc -l bank-ip.txt

Esta práctica no está afinada ya que como puedes ver se nos cuela alguna entrada en texto y ordena mal las IPs.

Esta misma práctica podría hacerse con nombres de empresas concretas o gobiernos y luego se puede usar esta información para comparar con resultados de conexiones, intrusiones, etc.

De nuevo, estamos aquí para aprender!

Ejemplo 3) Trabajar con un registro de intrusiones

Partiendo de un registro de intrusiones de un servidor público cualquiera (extraido de /var/log/secure de RedHat), vamos a usar el ejemplo que tienes arriba para practicar:

# 1- Comprobamos las lineas de fechas de inicio y final
head -1 secure.log
tail -1 secure.log

# 2- Comprobamos cuantos intentos ha habido:
grep "Failed password for root" secure.log | wc -l

# 3- Extraemos IPs de intrusión
grep "Failed password for root" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7

# 4- Ponemos formato a las entradas 
grep "Failed password for root" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq

# 5- Comprobamos cuantos intentos hay por IP
grep "Failed password for root" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq -c | sort -n

# 6- Comprobemos una IP cualquiera (hay que instalarlo a parte)
whois XXX.XXX.XXX.XXX

# 7- Revisamos que IPs de red 

(REVISAR)
grep "Failed password for root" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq | sort | cut -d '.' -f 1,2,3 | uniq -c | sort -n

# 8- Revisamos ahora intentos de usuarios no root y que nombres han usado
grep "Failed password for invalid user" secure.log

# 9- Hacemos una lista de nombres intentados para conexión
grep "Failed password for invalid user" secure.log | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq

# 10- Revisamos intentos de usuarios que SI existen en el sistema

(REVISAR)
grep "Failed password for invalid user" secure.log | grep -v "root" | grep -v "invalid" | cut -d ':' -f 5 | cut -d ' ' -f 5 | sort | uniq -c | sort -n

Ejemplo 4) Crear atajo de consulta de IP

Esta práctica es bastante sencilla y muy útil, como ya sabrás el comando ip address show (ip a para los amigos) te permite ver las interfaces e IPs de tu sistema. Vamos a ello:

# 1- Vamos a quedarnos con la fila de la IP:
ip address show | grep -w inet 

# 2- De momento nos aparecen todas las interfaces pero nos interesa la principal (normalmente tendremos 2 como ya sabes):
ip address show | grep -w inet | grep -vw enp0s3 

# 3- Damos formato a la entrada:
ip address show | grep -w inet | grep -vw enp0s3 | tr ' ' ';' | cut -d ';' -f 6

Ahora esto lo podemos poner en un alias temporal:

alias myip="ip address show | grep -w inet | grep -vw enp0s3 | tr ' ' ';' | cut -d ';' -f 6"

O bien añadirlo al sistema como una utilidad más, para ello, debes añadirlo al archivo de configuración de tu shell (.bashrc, .bash_profile, o .zshrc), dependiendo del shell que estés utilizando, en mi caso, para Ubuntu es /home/user/.bashrc.

sudo nano ~/.bashrc

En la última línea añadimos el alias de arriba y guardamos el archivo. Ahora debemos abrir nueva shell o hacer los cambios persistentes con:

source ~/.bashrc

Listo! Ahora deberias probarlo:

myip
#20.0.20.4/24

.

31- Dividir el fichero ripe.db en ficheros de 10M

Topic 103.4

Ejemplo 1) Copias de seguridad con pipes y tee

Debemos crear una rutina de copia de seguridad simple que cree periódicamente una imagen de la partición /dev/sda1 con dd.

dd if=/dev/sda1 of=sda1.img
#ó tambien aceptado:
dd </dev/sda1 >sda1.img

Adicionalmente podemos añadir para futuras comprobaciones de integridad de datos, que la rutina también genere un hash SHA1 del archivo de imagen:

#Esto generará el archivo con el HASH + nombre del archivo
sha1sum sda1.img >sda1.sha1
#Esto generará un archivo solo con el HASH
sha1sum <sda1.img >sda1.sha1

Estos dos podemos combinarlo con pipes y el comando tee:

dd </dev/sda1 | tee sda1.img | sha1sum > sda1.sha1

Si quisiéramos comprobar el SHA1 simplemente:

sha1sum -c sda1.sha1

Topic 105.1

Usos útiles de alias

Algunos alias útiles:

alias ..="cd .." #Subir un nivel de directorio  
alias ...="cd ../.." #Subir dos niveles de directorio  
alias ....="cd ../../.." #Subir tres niveles de directorio  
alias ll="ls -al --color-auto" #Listar archivos con detalles  
alias lt="ls -ltr" #Listar archivos ordenados por tiempo de modificación en orden ascendente  
mkd() { mkdir -p "$1" && cd "$1"; } #Crear un directorio y entrar en él  
alias rm="rm -i" #Solicitar confirmación antes de eliminar archivos  
alias du="du -ch --max-depth=1" #Resumir el uso del disco por directorio  
alias mem="free -h" #Resumir el uso de memoria  
alias topcpu="ps -eo pid,cmd,%mem,%cpu --sort=-%cpu | head" #Listar procesos que consumen más CPU  
alias topmem="ps -eo pid,cmd,%mem,%cpu --sort=-%mem | head" #Listar procesos que consumen más memoria  
alias psg="ps aux | grep -v grep | grep -i" #Buscar procesos por nombre o palabra clave  
alias f="find . -type f -name" #Buscar archivos  
alias grep="grep --color-auto -i" #Realizar búsquedas insensibles a mayúsculas/minúsculas con salida colorida  
alias reload="source ~/.bashrc" #Recargar la configuración del shell  
alias hgrep="history | grep" #Buscar en el historial de comandos del shell  
alias chown="chown --preserve-root" #Prevenir que se aplique a la raíz `/` por accidente  
alias chmod="chmod --preserve-root" #Prevenir que se aplique a la raíz `/` por accidente  
alias chgrp="chgrp --preserve-root" #Prevenir que se aplique a la raíz `/` por accidente  
alias ports="sudo ss -tulanp" #Mostrar todos los puertos abiertos en el sistema  
ipa() { ip -4 a show "$1" | grep -oP '(?<=inet\s)\d+(\.\d+){3}'; } #Mostrar la dirección IP de una interfaz  
alias cpv="rsync -ah --info=progress2" #Copiar archivos con indicador de progreso  
alias update="sudo apt update && sudo apt upgrade -y" #Actualizar un sistema basado en Debian  
alias clean="sudo apt autoremove && sudo apt clean" #Limpiar paquetes de Debian no utilizados  
alias status="sudo systemctl status" #Verificar el estado de un servicio systemd  
alias restart="sudo systemctl restart" #Reiniciar un servicio systemd  
alias please="sudo !!" #Reejecutar el último comando con sudo  

https://x.com/PinguinoDeMario/status/1845894889604608430
https://parzibyte.me/blog/2019/05/20/generar-contrasenas-seguras-pwgen-ubuntu/
RIPE
18MB
secure.log
Archivo que necesitarás para la siguiente práctica
⬇️