Descargando desde SF.net por consola

Hace mucho (pero mucho) que no escribo.

Falta de tiempo, dirán algunos.

Falta de ganas, dirán otros.

Quizá un poco de ambos ingredientes, diré yo.

Hoy dejo una pequeña fórmula para esas veces en que queremos descargar algo desde sourceforge.net usando sólo la consola de comandos.

SF.net desde consola

¿Para qué corno querrá este tipo descargar algo desde consola?

Bueno, me ha sucedido varias veces que tengo algunos servidores headless (léase sin monitor) y que obviamente no tienen interfaz gráfica.

Todo consola.

Díganme, como corno/diablos/cuernos descargo algo desde sourceforge si se necesita un navegador.

Pongo las opciones posibles:

  1. Podría descargarlo en mi pc y luego enviarlo al servidor
  2. Podría descargarlo directamente en el servidor

La opción 1 está ok cuando es algo pequeño. Lo descargo, lo analizo y luego lo envío por ssh usando scp (secure copy).

Pero cuando me enfrento a 20, 30 100 o 300 MB… el proceso se torna MUY tedioso.

Por eso me decanto por la opción 2: descargar todo directamente en el servidor.

Qué herramientas utilizar?

Vamos a necesitar bash, wget y awk. Todas son herramientas básicas (y hasta diría predeterminadas) en cualquier GNU/Linux.

Problema

El primer problema es que sourceforge utiliza PHP para redirigir las descargas y no hay enlaces directos.

A no desesperar que wget se encarga de todo.

Supongamos que quiero descargar una imagen VDI (un disco de virtualbox) de Ubuntu Server 10.04.

Si lo buscáramos en SF lo encontraríamos aquí: http://sourceforge.net/projects/virtualboximage/files/UbuntuServer/10.04.2/Ubuntu_server_10-04-2.7z/download

En un navegador, haría un par de redirecciones y luego presentaría el cuadro de diálogo para guardar la imagen, con el nombre correcto.

Al utilizar wget, esto no sucede y el archivo se guarda como “download”.

Esto no supone problema, pero quise dar un paso más allá y facilitar la descarga.

En bash, tenemos un archivo oculto en la carpeta del usuario que se llama .bashrc

En ese archivo se pueden ubicar todas las “personalizaciones” de nuestra sesión bash.

Se pueden definir alias de comandos y funciones (que es lo que vamos a hacer.

Editamos el archivo .bashrc y agregamos al final:

function descargar-desde-sf {
    wget $1
    mv download `echo $1 | awk ‘{enlace=split($0,partes,”/”);for(indice=1;indice<=enlace;indice++)
archivo=partes[indice-1]; print archivo}’`
}

¿Cómo funciona?

Desde la consola, escribimos

descargar-desde-sf http://sourceforge.net/projects/virtualboximage/files/UbuntuServer/10.04.2/Ubuntu_server_10-04-2.7z/download

$1 se refiere al primer argumento que le pasamos a la función, es decir el enlace

Inmediatamente wget comienza a descargar. Una vez finalizada la descarga (el archivo quedó con el nombre ‘download’) aquí comienza la magia.

El comando siguiente es una anidación de comandos. Por un lado el comando principal es mv con el cual vamos a renombrar el archivo ‘download’ con el nombre que surja del siguiente comando que está encerrado entre `tildes invertidas` .

El comando anidado tiene dos partes: echo $1 con el cual simplemente imprimimos el enlace pasado como texto, y mediante un pipe ( | ) se lo pasamos al siguiente comando que es awk.

awk se encargará de transformar el enlace en un arreglo (array), recorrerlo y tomar el ante-último valor.

En otras palabras, al enlace http://sourceforge.net/projects/virtualboximage/files/UbuntuServer/10.04.2/Ubuntu_server_10-04-2.7z/download lo transformo en un arreglo dividido por el caracter “/”.

Con lo cual me quedan, en este caso, 10 cadenas de texto:

  1. http:
  2. una cadena vacía (que estaría entre / y /)
  3. sourceforge.net
  4. projects
  5. virtualboximage
  6. files
  7. UbuntuServer
  8. 10.04.2
  9. Ubuntu_server_10-04-2.7z
  10. download.

Mediante un bucle, recorro el arreglo y tomo el ante-último valor. El último valor es “download” y el ante-último es Ubuntu_server_10-04-2.7z.

Ese valor es el resultado de todo el comando entre `tildes invertidas` y es devuelto como argumento al comando que lo contenía.

Recordemos: comando arg1 `otro-comando2-que-devuelve-arg2`

El comando resultante entonces queda como:

mv download Ubuntu_server_10-04-2.7z

Finalizando

De esta manera, la función creada descarga un archivo desde sourceforge y lo renombra correctamente.

Obviamente, como siempre digo, se puede mejorar e incluso hacerlo más simple.

Saludos

5 comentarios (+¿añadir los tuyos?)

  1. FCR
    Sep 19, 2012 @ 00:36:27

    Esto va a ser muy útil, no conozco mucho de bash ni de trabajo con servidores(y menos aun de servidores sin posibilidad de salida grafica) que experiencia tienes en esto?

    Responder

    • jinetedeldragon
      Dic 31, 2013 @ 20:06:16

      uf…que colgado!! recien reparo que me preguntaste que experiencia tengo!! Mil disculpas!
      Generalmente administro servidores mediante consola, asi que trato de utilizar al máximo las herramientas de terminal. La mayoría de las tareas administrativas se pueden realizar sin siquiera tener que abrir un escritorio.

      Responder

      • Fernando C R
        Ene 01, 2014 @ 12:37:32

        Gracias por la respuesta, ahora estoy menos metido que en ese momento en usar consolas, pero volveré a hacerlo apenas pueda. Saludos desde Perú.

  2. pPO
    Dic 29, 2013 @ 15:49:23

    podes utilzar links que es un navegador de consola y es todo mas facil. saludos

    Responder

    • jinetedeldragon
      Dic 30, 2013 @ 19:55:09

      Gracias pPO. La idea justamente era trabajar con las herramientas predeterminadas, sin tener que andar instalando otras (como links o lynx)

      Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Archivos

julio 2012
D L M X J V S
« Feb   Oct »
1234567
891011121314
15161718192021
22232425262728
293031  
A %d blogueros les gusta esto: