UnxUtils: ejecutar comandos Linux/UNIX en Windows

UnxUtils es un port para Windows de varias utilidades GNU. Para la gente que está acostumbrada a utilizar sistemas UNIX o Linux, estas utilidades se extrañan bastante en sistemas Windows, especialmente cuando tenemos que crear scripts. Incluye ls, grep, diff, wget, md5sum, tail, head, less, sed, entre otras. Podemos ver la lista entera de comandos en la siguiente imagen:

Para instalarlo, debemos bajar la herramienta desde la página del proyecto en SourceForge.net. Descomprimimos el archivo en el directorio que más nos guste (yo lo tengo en C:\UnxUtils) y agregamos el directorio [dir]\usr\local\wbin a la variable de entorno path, donde [dir] es el directorio elegido para descomprimir el archivo (en mi caso, agregué C:\UnxUtils\usr\local\wbin)

Otra forma, no tan rápida o directa de contar con este tipo de utilidades bajo Windows, pero más completa es instalar Cygwin. Para ello debemos bajar el instalador desde su página, y luego seguir las instrucciones de su guía para el usuario.

Ejecutar aplicaciones gráficas de X11 (Linux y Unix) en Windows

Introducción

A veces necesitamos ejecutar aplicaciones de un servidor Linux -o Unix- remoto estando conectados a través de SSH, pero estas aplicaciones tienen una interfaz gráfica. Una solución para este problema puede ser iniciar una sesión de VNC (un escritorio remoto de Linux) y ejecutar desde este ambiente nuestra aplicacion. Otra opción que veremos en este post es utilizando X11 tunneling en nuestra sesión SSH, con la ventaja de que agregamos encriptación sobre el canal de comunicaciones.

¿Qué es X11?

X11 es un software creado en los años 80 por el MIT (Massachusetts Institute of Technology) con el propósito de ser una interfaz gráfica para los sistemas Unix de la época.

Tiene una arquitectura cliente-servidor, proveyendo servicios para acceder a la pantalla y los dispositivos de interacción con el ususario, y permitiendo independizar lo que se quiere mostrar (servidor) de la forma de cómo mostrarlo (cliente). Esto permite
también que el cliente de ventanas no esté corriendo en la misma computadora que el servidor, siendo posible ejecutar aplicaciones gráficas de forma remota.

La comunicación entre el cliente y el servidor se realiza utilizando un protocolo determinado (Xprotocol). El hecho de tener tanto un estándar como un protocolo bien definidos tiene como consecuencia una gran portabilidad del código que utiliza X11.

Wikipedia, como ya es de cosumbre tiene información más detallada y bastante clara sobre el sistema de ventanas X, están los links en las referencias.

Sistema de ventanas X en Windows

El tener una definición estándar del manejo de ventanas X permite implementar clientes para Windows. Uno de estos clientes es XMing, una alternativa gratis que funciona muy bien junto a clientes SSH como PuTTY.

Para poder utilizarlo debemos descargar, instalarlo y ejecutarlo. Aparecerá un ícono con una X en el tray, como se ve en la imagen:
n

Luego, al abrir una sesión SSH, debemos activar la opción para poder hacer tunnelling de X11 a través de esa conexión SSH. En PuTTY, esa opcion está en Connection -> SSH -> X11 -> Enable X11 forwarding:

Luego de tener activado el forwarding, siempre que ejecutemos un comando que necesite un ambiente gráfico en esa sesión SSH, se visualizará en nuestro Windows, como si fuera un proceso local.

En mi caso, el X11 forwarding
sirvió para poder utilizar el IBM Webshphere MQ Explorer (comando strmqcfg). Estoy seguro que lo voy a utilizar en alguna otra oportunidad, espero que a ustedes también les sirva.

Referencias

X11

XMing

Copiar archivo y particiones utilizando dd (Linux/UNIX)

Introducción

dd es de esos comandos de Linux y UNIX “para temer”. Puede ser de mucha utilidad en algunas situaciones, pero también puede ser fatal si se usa mal, especialmente si no tenemos cuidado en los parámetros con los que lo invocamos.

En pocas palabras, dd permite copiar y convertir el contenido de un archivo a otro. El concepto de archivo es bastante amplio, ya que además de copiar archivos comunes, se pueden utilizar como entrada y salida los archivos de /dev, y así copiar una partición, generar archivos vacíos, generar archivos con contenido aleatorio, etc.

Formato

El formato es un poco diferente a los comandos de linux que conocemos, dado que dd se basa en parámetros del tipo opción=valor en lugar de utilizar el formato más común -op valor o –opción valor.

El archivo de entrada estará especificado por la opción if (por input file). Como es de suponer,
el archivo de salida está especificado por la opción of (por output file).

Con la opción bs configuramos el tamaño de cada bloque que se leerá/convertirá/escribirá (con las opciones ibs, cbs y obs se configuran los tamaños de los bloques de cada proceso por separado). A éstos parámetros se les puede pasar un valores que sean el resultado de una multiplicación, por ejemplo, 1024x1024x1024 para expresar 1 GB. También se pueden utilizar sufijos como ser c (1 byte), w (2 bytes), b (512 bytes, asociado por defecto del tamaño de un sector de disco), kB (1000 bytes), K (1024 bytes), MB (1000*1000), M (1024*1024), GB (1000*1000*1000), G (1024*1024*1024), y así para T, P, E, Z, Y.

Con el parámetro count configuramos la cantidad de bloques a copiar; por lo tanto, el tamaño de lo transferido será bs*count. Aunque la última porción del archivo no tenga el tamaño de un bloque exacto, ese restante se
transfirirá de todas formas.

Podemos utilizar el parámetro conv para hacer ciertas transformaciones además de la lectura y la escritura, y puede tener los siguientes valores:

  • lcase: transformar mayúsculas a minúsculas
  • ucase: transformar minúsculas a mayúsculas
  • swab: intercambiar cada par de bytes de entrada
  • excl: fallar si el archivo de salida existe
  • noerror: continuar aunque se encuentren errores de lectura
  • nocreat: no crea el archivo de salida

Otras opciones que me parecieron menos interesantes fueron: ascii, ebcdic, ibm, block, unblock, notrunc, sync, fdatasync y fsync (consultar las páginas man por más datos).

Ejemplos de uso

(De más está decir que no puedo asegurar que todos los ejemplos van a funcionar como deberían, ya que en algunos casos, ni siquiera puedo afirmar que “en mi máquina anda”. Por favor usar con responsabilidad. Dicho
esto, continuamos…)

En los siguientes ejemplos veremos algunos ejemplos de uso del comando dd. En los casos que corresponda este comentario, se generarán archivos de 64MB, en 1000 bloques de a 64KB.

Duplicar una partición

En este ejemplo duplicaremos el contenido de una partición en otra. Creo que lo ideal es que sean las 2 del mismo tamaño, aunque si la partición de salida es más grande, también funcionaría.

dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=notrunc,noerror

Duplicar una partición en otro host (ésta me la enseñó MacGyver)

Es la misma idea que el ejemplo anterior, pero en lugar de duplicar la partición en un disco local, se duplica a través de la red, utilizando el comando netcat (también conocido como la navaja suiza de TCP/IP):

En el host de destino:

netcat -l -p 1234 | dd of=/dev/hdc bs=16065b

El el host de origen:

dd if=/dev/sda2 bs=16065b | netcat [IP-destino] 1234
n

También podemos duplicar una partición a un host remoto a través de SSH:

dd if=/dev/sda2 bs=16065b | ssh user@host "dd of=/dev/hdc bs=16065b"

Generar un archivo con ceros o contenido aleatorio

Los archivos generados con ceros o contenido aleatorio nos pueden servir como material para transferir entre discos o por la red para diagnosticar posibles problemas.

Con ceros:

dd if=/dev/zero of=/tmp/zeros bs=64k count=1000

Con contenido aleatorio:

dd if=/dev/urandom of=/tmp/myrandom bs=64k count=1000

Copiar una partición a un archivo

dd if=/dev/sda2 of=/tmp/part.image bs=4096 conv=notrunc,noerror

Si queremos copiar un CD/DVD a una imagen ISO, podemos ejecutar:

dd if=/dev/cdrom of=/tmp/myCD.iso bs=2048 conv=sync,notrunc

Parecido al ejemplo de duplicar una partición a través de la red,
podemos respaldar nuestra partición a un archivo en un host remoto a través de SSH:

dd if=/dev/sda2 | ssh user@host "dd of=/home/user/partition.image"

Escribir basura en una partición

Cuando borramos archivos o utilizamos un formato rápido, la mayoría de los archivos pueden ser recuperados. Este ejemplo puede servir para asegurarnos que no se puedan recuperar los datos de una partición entera:

dd if=/dev/urandom of=/dev/hda

Convertir un archivo a MAYÚSCULAS

dd if=filename of=filename conv=ucase

Referencias