660 - Tres herramientas brutales para tu terminal Linux
tres herramientas #linux para trabajar con #diff y #git, para el #hacking #etico con #nmap y para la lógica difusa tipo #fzp pero mucho mas con #television
Vamos a poner el listón alto para este año que comienza. Así, en este episodio, te traigo tres herramientas brutales para tu terminal Linux. Lo vengo comentando durante los últimos años. La llegada de Rust al ecosistema Linux ha supuesto un auténtico revulsivo. Cuando parecía que habíamos visto todo lo que se podía ver en lo que a herramientas de terminal se refiere, algún desarrollador nos sorprende, o bien con una nueva herramienta, o bien con una nueva implementación de una herramienta existente. Así, en este episodio te traigo tres herramientas de lo mas variopinto para hacer distintas acciones que poco o nada tienen que ver unas con otras. Desde programación, pasando por hacking hasta terminar en la televisión.
Tres herramientas brutales para tu terminal Linux
delta
Como te vengo comentando en lo últimos episodios, llevo unos días escribiendo código como si no hubiera un mañana. Y no es que quiera venirme arriba, le puedes dar un vistazo a mi perfil de GitHub para que veas que no te engaños en absoluto. Tengo los dedos en carne viva (bueno, aquí si que me he venido muy arriba).
La primera de las herramientas que te traigo es una herramienta para ver los cambios que has realizado en tu código. Tal y como explican sus desarrolladores de esta herramienta,
El código evoluciona, y todos dedicamos tiempo a estudiar diferencias (diffs). Delta tiene como objetivo hacer que este proceso sea tanto eficiente como agradable: te permite realizar amplios cambios en el diseño y estilo de las diferencias, además de permitirte mantenerte tan cerca como desees de la salida predeterminada de git/diff.
Características
Algunas de las características de la aplicación,
- Resaltado de sintaxis de lenguajes con los mismos temas de resaltado que bat.
- Resaltado de diferencias a nivel de palabra utilizando un algoritmo de inferencia de ediciones basado en Levenshtein.
- Vista lado a lado con ajuste de línea.
- Numeración de líneas.
- Teclas rápidas
n
yN
para moverse entre archivos en diferencias grandes y entre diferencias en vistas delog -p
(opción--navigate
). - Mejora en la visualización de conflictos de fusión.
- Mejora en la visualización de
git blame
(resaltado de sintaxis; la opción--hyperlinks
formatea los commits como enlaces al proveedor de alojamiento, como GitHub, GitLab, SourceHut, Codeberg). - Resaltado de sintaxis en salidas de grep de
rg
,git grep
,grep
, etc. - Compatibilidad con la función
--color-moved
de Git. - El código puede copiarse directamente desde las diferencias (los marcadores
-
/+
se eliminan por defecto). - Modos de emulación para
diff-highlight
ydiff-so-fancy
. - Los hashes de commits se pueden formatear como hipervínculos en la terminal hacia la página del proveedor de alojamiento (opción
--hyperlinks
). También es posible formatear las rutas de archivo como hipervínculos para abrirlos en tu sistema operativo. - Decoraciones estilizadas (cajas/líneas) para destacar secciones como encabezados de commit, archivo y fragmento de código.
- Cadenas de estilo (color de primer plano, fondo, atributos de fuente) compatibles con más de 20 elementos personalizables, utilizando el mismo lenguaje de colores/estilos que Git.
- Soporte para salidas de diferencias unificadas tradicionales, además de las salidas de Git.
- Detección automática del fondo claro/oscuro de la terminal.
Instalación
delta
está disponible en diferentes distribuciones y en otros sistemas operativos como Windows. En la mayoría de distros Linux se conoce como git-delta
. En particular para instalarlo en Arch Linux, tan solo tienes que ejecutar la siguiente instrucción,
sudo pacman -S git-delta
Configuración
Respecto a la configuración, la tienes que hacer en tu archivo ~/.gitconfig
, y tiene un aspecto similar al siguiente,
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true # use n and N to move between diff sections
dark = true # or light = true, or omit for auto-detection
side-by-side = true
[merge]
conflictstyle = zdiff3
Si lo buscas en mis dotfiles, indicarte que lo tienes que buscar por .gitconfig.jinja
. Esto es así, porque algunos parámetros está ocultos, utilizando jinrender
del que te hablé en un episodio anterior.
rustscan
El escáner de puertos moderno. Encuentra puertos rápidamente (3 segundos en su configuración más rápida). Ejecuta scripts a través de nuestro motor de scripts (compatible con Python, Lua y Shell).
Características
- Escanea los 65,000 puertos en 3 segundos.
- Compatibilidad total con el motor de scripting. Envía automáticamente los resultados a Nmap o utiliza nuestros scripts (o escribe los tuyos) para hacer lo que necesites.
- Aprendizaje adaptativo. RustScan mejora cuanto más lo usas. Sin algoritmos complejos de aprendizaje automático, solo matemáticas básicas.
- Las características habituales que esperarías: IPv6, CIDR, entrada desde archivos y más.
- Envía automáticamente los puertos a Nmap.
Se trata de una herramienta rápida por naturaleza. Tan es así, que si en una nueva versión resulta mas lenta que una anterior, no se da por buena.
Otra interesante característica de RustScan es que es extensible, y la cuestión es que soportan diferentes lenguajes de programación para ello, empezando por Python, pasando por Lua.
Se adapta al entorno donde se ejecuta. Esta característica denominada entorno adaptativo, tiene la peculiaridad de que aprende del entorno que escaneas, lo que permite que mejore con el paso del tiempo.
Algunos ejemplos de uso,
- Escaneo de múltiples IPs, Puedes escanear varias IP utilizando una lista separada por comas de esta forma,
rustscan -a 127.0.0.1,0.0.0.0
- Escaneo de hosts. RustScan también puede escanear hosts, así:
rustscan -a www.google.com, 127.0.0.1
- Uso de archivos de hosts como entrada
- Escaneo de puertos individuales
rustscan -a 127.0.0.1 -p 53 53
television
Television es un rápido y versátil buscador difuso (fuzzy finder) con interfaz de usuario en terminal (TUI).
Te permite buscar rápidamente en cualquier tipo de fuente de datos (archivos, repositorios de git, variables de entorno, imágenes de Docker, lo que sea) utilizando un algoritmo de lógica difusa y está diseñado para ser extensible fácilmente.
Características
Algunas de las características de television
son las siguientes,
- ⚡️ Alta Velocidad: E/S asíncrona y multiproceso para garantizar una interfaz de usuario fluida y receptiva.
- 🧠 Lógica Difusa: biblioteca avanzada de coincidencia difusa para filtrar eficientemente listas de entradas.
- 🔋 Todo Incluido: viene con un conjunto de canales y previsualizadores integrados que puedes usar desde el primer momento.
- 🐚 Integración con el Shell: aprovecha la autocompletación inteligente en cualquier lugar mediante la integración de television con el shell.
- 📺 Canales: diseñado en torno al concepto de canales, que son un conjunto de fuentes de datos integradas para buscar (p. ej., archivos, repositorios de git, variables de entorno, etc.).
- 📡 Canales Personalizados: los usuarios pueden agregar sus propios canales personalizados a television mediante un archivo de configuración simple y centralizado.
- 📜 Previsualizadores: permite previsualizar el contenido de una entrada en un panel separado.
- 🖼️ Resaltado de Sintaxis Integrado: incluye resaltado de sintaxis asíncrono integrado para una amplia variedad de tipos de archivo.
- 🎛️ Teclas Rápidas: incluye un conjunto de atajos predeterminados e intuitivos inspirados en vim y otros accesos directos populares en terminal.
- 🌈 Temas: elige entre 10 temas integrados o crea fácilmente el tuyo propio.
- 📦 Multiplataforma: funciona en Linux, MacOS y Windows.
- ✅ Compatibilidad con Emuladores de Terminal: television funciona perfectamente en todos los emuladores de terminal principales.
Mi configuración de canales es la siguiente,
# GIT
[[cable_channel]]
name = "diff"
source_command = "git diff --name-only"
preview_command = "git diff --color=always {0}"
[[cable_channel]]
name = "reflog"
source_command = 'git reflog'
preview_command = 'git show -p --stat --pretty=fuller --color=always {0}'
[[cable_channel]]
name = "log"
source_command = "git log --oneline --date=short --pretty=\"format:%h %s %an %cd\" \"$@\""
preview_command = "git show -p --stat --pretty=fuller --color=always {0}"
[[cable_channel]]
name = "branch"
source_command = "git --no-pager branch --all --format=\"%(refname:short)\""
preview_command = "git show -p --stat --pretty=fuller --color=always {0}"
# Docker
[[cable_channel]]
name = "images"
source_command = "docker image list --format \"{{.ID}}\""
preview_command = "docker image inspect {0} | jq -C"
[[cable_channel]]
name = "containers"
source_command = "docker container list"
preview_command = "docker container inspect {0} | jq -C"
[[cable_channel]]
name = "networks"
source_command = "docker network list --format \"{{.Name}} - {{.Driver}}\""
preview_command = "docker network inspect {0} | jq -C"
[[cable_channel]]
name = "volumes"
source_command = "docker volume list --format \"{{.Name}} - {{.Driver}}\""
preview_command = "docker volume inspect {0} | jq -C"
# S3
[[cable_channel]]
name = "s3-buckets"
source_command = "aws s3 ls | cut -d \" \" -f 3"
preview_command = "aws s3 ls s3://{0}"
# Dotfiles
[[cable_channel]]
name = "my-dotfiles"
source_command = "fd -t f . $HOME/.config"
preview_command = ":files:"
# Shell history
[[cable_channel]]
name = "zsh-history"
source_command = "sed '1!G;h;$!d' $HOME/.zsh_history | cut -d\";\" -f 2-"
[[cable_channel]]
name = "bash-history"
source_command = "sed '1!G;h;$!d' $HOME/.bash_history"
[[cable_channel]]
name = "fish-history"
source_command = "fish -c 'history'"
Más información,