Etiqueta: linux

  • Netcat (nc): la navaja suiza de redes, con ejemplos prácticos

    Netcat (nc) es una de las herramientas más versátiles para trabajar con redes en Linux — lee y escribe datos crudos a través de conexiones TCP o UDP, lo que la hace útil tanto para diagnóstico como para tareas puntuales de transferencia y prueba de conectividad.

    Escuchar en una interfaz y puerto específicos

    nc -l -s 192.168.1.100 -p 8080
    • -l — activa el modo escucha (el equipo actúa como servidor, esperando una conexión entrante)
    • -s — selecciona la IP de la interfaz específica donde escuchar (útil en equipos con varias interfaces de red)
    • -p — define el puerto de escucha

    Probar la conexión desde otra máquina

    echo "Hola desde el cliente" | nc 192.168.1.100 8080

    echo genera el mensaje, y lo canaliza (|) hacia nc, que se conecta al servidor escuchando en esa IP y puerto, enviando el texto como datos crudos por la conexión TCP.

    Verificar si un puerto está abierto (escaneo simple)

    nc -zv 192.168.1.100 22

    -z hace que nc solo verifique si la conexión se puede establecer, sin enviar ni recibir datos (modo «zero-I/O», ideal para pruebas rápidas). -v activa el modo detallado (verbose), mostrando si la conexión tuvo éxito o fue rechazada.

    También se puede escanear un rango de puertos:

    nc -zv 192.168.1.100 20-25

    Transferir un archivo entre dos equipos

    Netcat no tiene protocolo propio de transferencia — simplemente mueve bytes crudos de un lado a otro, así que sirve perfectamente para mover un archivo completo sin necesidad de configurar SSH, FTP o Samba para una tarea puntual.

    En la máquina que recibe (destino):

    nc -l -p 9000 > archivo_recibido.tar.gz

    En la máquina que envía (origen):

    nc 192.168.1.100 9000 < archivo_original.tar.gz

    El destino queda escuchando y redirige todo lo que reciba directamente a un archivo; el origen se conecta y envía el contenido del archivo como flujo de datos. Al terminar la transferencia, ambos procesos de nc se cierran automáticamente.

    Banner grabbing: identificar qué servicio corre en un puerto

    Muchos servicios (SSH, SMTP, FTP) envían un mensaje de bienvenida (banner) apenas se conectan, que suele revelar la versión del software corriendo:

    nc -v 192.168.1.100 22

    Al conectar, el servicio SSH normalmente responde de inmediato con algo como SSH-2.0-OpenSSH_9.6, sin necesidad de autenticarse — útil para inventariar rápidamente qué versión de software corre un servidor.

    Chat simple entre dos terminales

    Como nc simplemente pasa lo que se escribe en la entrada estándar hacia la conexión, se puede usar como un chat rudimentario de ida y vuelta entre dos equipos:

    Equipo A (escucha):

    nc -l -p 5000

    Equipo B (se conecta):

    nc 192.168.1.100 5000

    Cualquier cosa que se escriba en cualquiera de las dos terminales (tras presionar Enter) aparece en la otra, en tiempo real.

    Modo UDP

    Por defecto nc usa TCP; para trabajar con UDP se agrega la bandera -u:

    # Escuchar en UDP
    nc -u -l -p 8080
    
    # Enviar en UDP
    echo "mensaje UDP" | nc -u 192.168.1.100 8080

    Notas de seguridad

    • Netcat transmite todo en texto plano, sin cifrado — nunca usarlo para mover datos sensibles a través de redes no confiables; para eso existen herramientas como scp, rsync sobre SSH, o un túnel SSH.
    • Dejar un nc -l escuchando indefinidamente en un puerto expuesto a internet es un riesgo — cualquiera que se conecte puede enviar o recibir datos sin autenticación alguna.
    • Algunas variantes de nc (como ncat, incluida en el paquete Nmap) sí soportan cifrado SSL/TLS agregando la bandera --ssl, si se necesita algo más seguro manteniendo la misma simplicidad de uso.
  • Guía de locale en Ubuntu: idioma, UTF-8 y codificación de archivos

    Un problema muy común en Linux: los acentos y caracteres especiales (ñ, á, é, etc.) aparecen rotos o como símbolos extraños. Casi siempre se debe a una de dos causas: un archivo con codificación incorrecta (no UTF-8), o el locale del sistema mal configurado. Esta guía cubre el diagnóstico y la corrección de ambos casos en Ubuntu 24.04.

    ¿Qué es el locale?

    El locale define el conjunto de convenciones regionales que usa el sistema: idioma de los mensajes, formato de fecha y hora, símbolo de moneda, criterio de ordenamiento alfabético, y — lo más relevante para este problema — la codificación de caracteres que el sistema espera usar (UTF-8, ISO-8859-1, etc.).

    El locale no es una sola variable, sino varias categorías LC_* independientes, que en conjunto forman la configuración regional completa:

    VariableQué controla
    LANGValor por defecto para todas las categorías no especificadas individualmente
    LC_CTYPECodificación de caracteres y clasificación (mayúsculas/minúsculas, qué es una letra)
    LC_TIMEFormato de fecha y hora
    LC_NUMERICFormato de números (separador decimal, de miles)
    LC_MONETARYFormato de moneda
    LC_COLLATECriterio de ordenamiento alfabético
    LC_MESSAGESIdioma de los mensajes del sistema y aplicaciones

    Cuando los acentos se ven mal, la variable más relevante es LC_CTYPE (heredada de LANG si no se define aparte), ya que es la que determina qué codificación de caracteres usa el sistema para interpretar el texto.

    Diagnóstico

    1. Verificar la codificación del archivo

    file archivo.txt

    Este comando detecta y muestra la codificación real del archivo (por ejemplo, UTF-8 Unicode text o ISO-8859 text). Si el archivo no está en UTF-8 y el sistema sí lo está, ahí está el origen del problema — no es un problema del sistema, sino del archivo en sí.

    2. Mostrar caracteres invisibles

    cat -v archivo.txt

    Revela caracteres de control y bytes no imprimibles que normalmente quedan ocultos en una vista normal del archivo — útil para detectar bytes corruptos o secuencias de escape mal interpretadas.

    3. Ver la configuración regional actual

    locale

    Muestra el valor actual de todas las variables LC_* y LANG en la sesión activa. Si alguna aparece vacía o como C/POSIX (el locale mínimo sin soporte real de idioma ni UTF-8), esa es la señal de que el sistema no tiene un locale regional configurado correctamente.

    4. Convertir un archivo a UTF-8

    iconv -f ISO-8859-1 -t UTF-8 archivo_origen.txt -o archivo_utf8.txt

    iconv convierte la codificación de un archivo sin alterar su contenido textual — solo reinterpreta los bytes según la codificación de origen (-f) y los reescribe en la codificación destino (-t). Es la solución cuando el problema es del archivo específico, no del sistema completo.

    Trabajar con locale en Ubuntu 24.04

    1. Ver locales instalados y disponibles

    # Variables activas en la sesión actual
    locale
    
    # Todos los locales ya generados/disponibles en el sistema
    locale -a
    
    # Locales listados para generación en /etc/locale.gen
    cat /etc/locale.gen

    Es importante distinguir estos tres: locale muestra lo que está activo ahora, locale -a muestra lo que está generado y disponible para usar, y /etc/locale.gen es la lista de configuración de qué se debe generar — un locale puede estar en este archivo pero no haber sido generado aún.

    2. Generar un locale (si no existe)

    # Español de España, UTF-8
    sudo locale-gen es_ES.UTF-8
    
    # Español de México, UTF-8
    sudo locale-gen es_MX.UTF-8

    locale-gen compila el locale a partir de sus datos fuente y lo deja disponible para el sistema — es un paso previo obligatorio antes de poder usarlo como LANG o cualquier otra variable LC_*.

    3. Establecer el locale del sistema

    # Establecer LANG global (método clásico)
    sudo update-locale LANG=es_ES.UTF-8
    
    # Alternativa moderna usando localectl (integrado con systemd)
    sudo localectl set-locale LANG=es_ES.UTF-8
    
    # Establecer un parámetro específico, sin afectar los demás
    sudo update-locale LC_TIME=es_ES.UTF-8

    La diferencia entre update-locale y localectl: ambos terminan escribiendo en el mismo archivo de configuración (/etc/default/locale), pero localectl es la herramienta moderna que forma parte del ecosistema systemd (junto con timedatectl y hostnamectl), y valida que el locale exista antes de aplicarlo — update-locale es más directo pero no hace esa validación previa.

    4. Reconfigurar locales con interfaz interactiva

    sudo dpkg-reconfigure locales

    Abre un asistente interactivo (interfaz de texto tipo ncurses) donde se puede: seleccionar qué locales generar de una lista completa, y elegir cuál queda como el locale por defecto del sistema. Es la forma más segura para quienes prefieren no editar archivos de configuración a mano.

    5. Configurar teclado (si afecta a los acentos)

    sudo dpkg-reconfigure keyboard-configuration

    A veces el problema no es el locale del sistema sino la distribución de teclado configurada — si las teclas de acentos y ñ no producen el carácter esperado al escribir directamente en la terminal, este es el comando a revisar.

    6. Archivos donde se guarda la configuración

    ArchivoAlcance
    /etc/default/localeConfiguración global del sistema (todos los usuarios)
    ~/.bash_profileConfiguración específica de un usuario, sobreescribe la global en su sesión

    Ejemplo para fijar el locale de un usuario específico, sin afectar al resto del sistema:

    echo 'LANG=es_ES.UTF-8' >> ~/.bash_profile
    export LANG=es_ES.UTF-8

    7. Aplicar los cambios

    Los cambios de locale a nivel de sistema generalmente requieren cerrar sesión y volver a entrar, o en algunos casos un reinicio completo para que todos los servicios y procesos existentes tomen la nueva configuración:

    sudo reboot

    Resumen del flujo de diagnóstico

    1. Ejecutar locale — si algo aparece vacío o en C/POSIX, el sistema no tiene un locale regional configurado.
    2. Ejecutar file archivo.txt sobre el archivo problemático — si no está en UTF-8, el problema es del archivo, no del sistema.
    3. Si es el sistema: generar el locale con locale-gen, luego fijarlo con update-locale o localectl, y reiniciar sesión.
    4. Si es el archivo: convertirlo puntualmente con iconv, sin tocar la configuración del sistema.