Go, de Google

Recientemente Google ha presentado Go, su apuesta personal por los lenguajes de programación. Se dice que mezcla la potencia y rendimiento de C++ con la flexibilidad de Python, oh!!!! casi nà!
Aunque sin mucho tiempo para poder probarlo en profundidad y dar una visión más cercana a este nuevo lenguaje de programación, la verdad es que, aunque en Beta (típico en Google) y con consejos de no portar ninguna aplicación, ya tenemos algunos perlas. Puede parecer complejo, extraño o muy funcional, según la forma de verlo. Algún ejemplo que lo puedo ilustrar:
  • Hola mundo
    package main
    import "fmt";
    func main()
    {       
       fmt.Printf("Hola mundo\n");
    }
    
  • Servidor web
    package main
    import (
       "http";
       "io";
    )       
    func main() {
       http.Handle("/test_go", http.HandlerFunc(RequestHandler));
       if err != nil {
          panic("Error: ", err.String());
       }
    }       
    
    func RequestHandler(c *http.Conn, req *http.Request) {
       str :=  "Protocol: " + req.Proto + "
       " +
       "Method: " + req.Method + "
       " +
       "User-Agent: " + req.UserAgent;
       io.WriteString(c, str);
    }
    
Algo sorprendente, sin dudarlo! Sobre todo para aquellas personas que alguna vez tuvieron que hacer algo similar, en Go es simple. Google siempre piensa a lo grande y a lo escalable (cloud computing...).

Por cierto, a fecha de hoy todavía no existe una API de gWave que permita el acceso de Go. Tendremos que seguir con Python/Java.

Mas info en: http://golang.org/
Leer más

netcat y comandos de red

Recientemente he tenido que realizar un envío de datos entre diferentes equipos y no en todos los casos podemos usar y depender de ssh. En estos casos, una muy buena solución para la comunicación de datos es netcat. En este post voy a comentar un uso muy simple del mismo y que deja en clara evidencia todo su potencial. Puede que para futuros post haga referencias de uso más avanzadas.
netcat es un software que permite trabajar en las dos direcciones. Por un lado permite ponerse a la escucha de datos en un puerto y también permite el envío de datos hacia una IP destino. Es por ello que se puede decir que netcat se puede emplear de cliente y servidor. En el siguiente caso voy a utilizarlo para crear un flujo de datos entre un equipo dañado y un equipo GNU/Linux en perfecto estado y vamos a realizar un backup de todo el disco duro del primero en el segundo. Aunque parezca una chorrada de ejemplo, en análisis forense se suele emplear este método muy habitualmente.
Para ello, primeramente hay que poner el equipo destino de los datos a escuchar en un puerto y decir dónde se van a "volcar" los datos. Para ello,
server> nc -l -p 4096 | dd of=/mnt/datos/sda1.img
Con lo citado ahora, todos los datos que sean recibidos por el puerto 4096 del equipo servidor tendrán como destino el fichero sda1.img, almacenado en /mnt/datos. Este fichero será la copia de todo el disco del cliente.
Desde el equipo cliente, el origen de los datos, hay ahora que enviarlos. Para hacer eso, únicamente tenemos que buscar la forma de sacar los datos, ya que será el propio netcat el que se encargue la parte del envío por red. Esto lo conseguimos,
client> dd if=/dev/sda1 | nc 192.168.0.150 4096
Una vez finalice el comando, todos los datos de la partición sda1 del equipo cliente estarán en una imagen de tipo lookback que podrá ser accedida y montada en cualquier momento en el equipo servidor. Si os fijáis, realmente lo que hacemos es sacar los datos del disco con el comando dd (if=...) y luego enviarlos por red, donde dd los vuelve a recoger (of=...).

Otro de los usos comunes que se le puede dar a netcat es el de obtener una shell en un equipo remoto. La idea en este caso es emplear netcat como servidor ssh. En el lado del "servidor netcat",
server> nc -l -p 2048 -e /bin/bash
Y por parte del cliente que establecerá la conexión,
client> nc 192.168.1.245 2048

Más información: man netcat
Leer más

Fallo de tareas programadas en cron (ls + awk )

Hoy me ha pasado una cosa rara y todavía no se exactamente el por qué. Aunque lo estoy a investigar y Google solucionará mis dudas, como siempre, de momento dejo el post del "fallo", y lo pongo entre comillas por que no se si realmente es un fallo, que localicé en la ejecución periódica de tareas con cron.
La tarea a ejecutar es muy simple, realizo un find según unos criterios y a partir de ahí ejecuto un ls -l sobre la salida para finalmente con awk recoger el valor que me interesa. Más concretamente el código es tal que así:
find /home -size +50M -exec ls -lh {} \; | awk '{print "rm -f " $9}'
La salida obtenida es, por ejemplo, la que sigue.
shell> find /home -size +50M -exec ls -lh {} \; | awk '{print "rm -f " $9}'
rm -f /home/javier/ISO's/debian-500-i386-netinst.iso
rm -f /home/javier/ISO's/debian-502-amd64-netinst.iso
rm -f /home/javier/ISO's/ubuntu-8.04.1-server-i386.iso
rm -f /home/javier/ISO's/XenServer-5.5.0-install-cd.iso
rm -f /home/javier/ISO's/ubuntu-8.10-desktop-i386.iso
Hasta este punto todo es correcto. La salida es la esperada según el sistema y hace lo que tiene que hacer.
El problema está si con esto construimos un script que contenga esa línea y lo ejecutamos periódicamente en cron. El resultado de salida no es el que obtenemos con la ejecución manual, sino que cambio y $9, pasa a contener el valor de $8 y aparece un nuevo $10 que contiene el valor correcto. Este cambio de valores es lo que todavía no se por que sucede al ejecutarlo con cron. Por lo tanto el script para ejecutar periódicamente tendría que tener el siguiente aspecto, para que el resultado fuese el esperado.
#!/bin/bash
find /home -size +50M -exec ls -lh {} \; | awk '{print "rm -f " $10}'
En breve intentaré dar una explicación razonable al por qué de este desplazamiento de variables.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios