Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Descargar vídeos de la red (clive)

Existe una pequeña herramienta muy cómoda para descargar vídeos de la red. Sirve en youtube, google video, last.fm, dailymotion, vimeo…

Su uso es muy sencillo:
$ clive http://www.youtube.com/watch?v=oHg5SJYRHA0

fetch http://www.youtube.com/watch?v=oHg5SJYRHA0 ...done.
verify video link ...done.
RickRollD.flv  100%   7.7M /  7.7M                              57.1K/s  02m18s

Hay más opciones, como “-f best” para descargar la versión con el formato de mejor calidad o si queremos descargar solo el audio podemos hacer:

$ clive --exec="ffmpeg -i %i -acodec libvorbis %i.ogg;" http://www.youtube.com/watch?v=oHg5SJYRHA0
$ clive --exec="ffmpeg -i %i %i.mp3;" http://www.youtube.com/watch?v=oHg5SJYRHA0
Video, download, clive, youtube

SVN+SSH: Conectar con un servidor SVN mediante SSH

Hay bastantes articulillos sobre como conectar con un servidor SVN mediante SSH, utilizando la opción directa, que no nos permite usar claves de ssh (ssh keys), ni modificar el puerto de ssh, ni en definitiva usar toda la potencia de ssh.
El sistema directo para configuraciones sencillas de ssh:
$ svn co svn+ssh://servidor/proyecto

Sin embargo hay una forma casi igual de sencilla y mucho más potente, con dos sesiones, usando los túneles SSH.
Primero, desde el cliente, hacemos un túnel ssh desde el puerto 3690 del servidor a nuestro puerto local 3690:
$ ssh usuario@servidor -p xxxx -i id_dsa_key_ssh -L 3690:localhost:3690

A partir de hay usamos svn como si estuviese instalado en local:
$ svn co svn://servidor/proyecto

Los túneles ssh son uno de los mejores inventos… se pueden usar para acceder “localmente” a cualquier servidor externo, de cualquier servicio (postgres, svn…) de forma segura y cómoda.

svn, shh, tunel ssh, subversion

Expect: Scripts para procesos interactivos

Algunos procesos no pueden automatizarse simplemente con bash, porque requieren la interacción con el usuario, por ejemplo un login de ssh.
En mi caso quería automatizar el montaje de comparticiones de Windows 2003, y aunque podía enviar la clave en el comando, esto queda grabado en los registros de sistema… no me gusta que se registre mi clave:

#!/bin/bash
#
# unidades_red 0.2 - GPL
# (c) 2007-05 Guimi
# http://guimi.net
#
# Ult mod: Guimi 2012-03
#

# Solicitamos la clave
echo  -n "Introduzca su clave de red: "
# Tomamos nota del estado de stty
oldmodes=`stty -g`
# Quitamos el echo para que no se muestre la clave
stty -echo
# Leemos la clave
read clave
# Volvemos a situar stty como estaba
stty $oldmodes
# Generamos un salto de linea
echo

# OJO: LA CLAVE SE REGISTRA
sudo mount -t cifs //SERVIDOR/RECURSO /MONTAJE/ -o username=guimi,workgroup=MIRED,iocharset=utf8,file_mode=0777,dir_mode=0777,password=$clave

Una solución pasa por expect.
# aptitude install expect

#!/usr/bin/expect -f
#
# unidades_red 0.3 - GPL
# (c) 2012-03 Guimi
# http://guimi.net
#
# Ult mod: Guimi 2012-03
#
# Tomamos el primer parametro como clave
#set clave [lrange $argv 0 0]

# Solicitamos la clave de red
send_user "Introduzca su clave de red: "
stty -echo
expect_user -re "(.*)\n" {set clave $expect_out(1,string)}
stty echo
send_user "\n"

# Anulamos la salida por terminal
log_user 0

# Conectamos las unidades de red
spawn sudo mount -t cifs //SERVIDOR/RECURSO /MONTAJE/ -o username=guimi,workgroup=MIRED,iocharset=utf8,file_mode=0777,dir_mode=0777
expect "*assword:"; send "$clave\r"
expect eof

spawn sudo mount -t cifs //SERVIDOR/RECURSO2 /MONTAJE2/ -o username=guimi,workgroup=MIRED,iocharset=utf8,file_mode=0777,dir_mode=0777
expect "*assword:"; send "$clave\r"
expect eof
expect, password

Copia de sistemas, clonado de discos

Para copiar sistemas hay muchas herramientas disponibles: g4l, partimage, ntfsclone… y por supuesto el viejo y confiable tar.
Veamos unas chuletas rápidas que pueden ayudarnos. Lógicamente hay que ajustar los nombres de los discos y las particiones.

Copia del MBR y la tabla de particiones
Para copiar el MBR y la tabla de particiones de un disco usamos dd y sfdisk.
MBR:
# dd if=/dev/sda of=sda.mbr count=1 bs=512
Tabla de particiones
# sfdisk -d /dev/sda > sda.sf

Para recuperarlos.
MBR:
# dd if=sda.mbr of=/dev/sda
Tabla de particiones
# sfdisk /dev/sda < sda.sf

Para clonar discos NTFS (Windows), usamos ntfsclone
Esta herramienta (ntfsclone) no permite volcar una imagen de una partición en otra partición más pequeña, aunque los datos quepan. En cambio volcar una partición pequeña en una más grande sí es posible.
Por ello se recomienda que la partición original sea lo más pequeña posible. Lo más cómodo es instalar en una partición grande y después redimensionarla antes de hacer la imagen.
# ntfsclone -s -o – /dev/sda1 | gzip | split -b 1500m – sda1.ntfsclone.gz.

Para recuperar la partición usamos:
# cat sda1.ntfsclone.gz.aa sda1.ntfsclone.gz.ab | gunzip -c | ntfsclone –restore-image –overwrite /dev/sda1 -

Para copiar datos de un sistema GNU/Linux a otro, mediante ssh+tar
Desde el equipo en el que vamos a volcar los datos (usamos p para preservar los permisos):
$ ssh IP_equipo_origen “tar cpf – /path_a_copiar” | tar xpf -

Si la red en que trabajamos es lenta (por ejemplo a través de internet) podemos comprimir los datos antes de enviarlos, podemos cambiar el directorio en que se copian los datos…:
$ ssh IP_equipo_origen “tar czpf – /path_a_copiar” | tar xzpf – -C /nuevo_path_base

También podríamos volcar los datos a un fichero:
$ ssh IP_equipo_origen “tar czpf – /path_a_copiar” | dd of=copia_datos.tar.gz
O en el sentido contrario:
$ tar czpf – /path_a_copiar | ssh IP_equipo_destino “dd of=copia_datos.tar.gz”

Más opciones con
$ man tar
$ man ssh

Trabajar con imágenes de particiones
$ partimage
Sí, ya está, solo eso.
Se pueden ver más opciones para evitar el asistente, como siempre mediante:
$ man partimage

tar, ssh, partimage, ntfsclone, dd, clonado, copia

Generar (diff) y aplicar (patch) parches

Hay manuales muy buenos sobre cómo generar parches… este no es uno de ellos, pero es una guía rápida para el 90% de casos.

Para los ejemplos suponemos que tenemos ficheros originales en una carpeta “original” y ficheros modificados en una carpeta “new”.

Trabajando con ficheros
Primero veremos como parchear un único fichero. Usamos el formato unificado (-u). Es el mejor pero “solo” sirve para entornos GNU, es decir todos los Linux y muchos UNIX.
diff -u original/foo.txt new/foo.txt > foo.patch

Podemos ver el parche generado con:
less foo.patch
La sintaxis es (línea o rango de líneas)(orden)(línea o rango de líneas)
Orden puede ser:
c – change – sustituir unas líneas por otras
a – add – añadir líneas
d -delete – borrar líneas

Para aplicar el parche podemos hacer (nombre de fichero implícito en el parche):
patch < foo.patch
O más seguro
patch bar.txt < foo.patch

Si queremos revertir un parche, porque detectamos que introduce un bug pero que el que corrige, por ejemplo, podemos hacer:
patch -R < foo.patch

Trabajando con directorios
Si modificamos varios ficheros, trabajamos con los directorios.
Generamos el parche con:
diff -rupN original/ new/ > codigo.patch

Lo aplicamos con:
patch -p1 < codigo.patch

Para más información, como siempre:
$ man diff
$ man patch

Trabajando con github.com
Los commits de Github pueden bajarse como parches añadiendo “.patch” al URL.
Así bastaría con:
$ wget github.com/URL_COMMIT.patch
$ patch -p1 < URL_COMMIT.patch

diff, patch, parche
 

Red con IP estática

Cada día hay más automatismos… y ya casi se nos olvida como hacer las cosas por nosotros mismos.
Para configurar una IP estática hacemos lo que indica el manual de Debian:
Primero configuramos la interfaz (en el ejemplo eth0 con la IP 192.168.11.100).
# vi /etc/network/interfaces
allow-hotplug eth0
iface eth0 inet static
address 192.168.11.100
netmask 255.255.255.0
broadcast 192.168.11.255
gateway 192.168.11.1
dns-domain lan
dns-nameservers 192.168.11.1

Después los DNSs, si no está instalado resolvconf, basta con:
# vi /etc/resolv.conf
domain localdomain
search localdomain
nameserver 192.168.1.1

Si está instalado resolvconf (y ante la duda no está de más):
# vi /etc/resolvconf/resolv.conf.d/base
nameserver 192.168.1.1

Tumbamos y levantamos la interfaz…
# ifdown eth0
# ifup eth0

¡Y ya está!

static ip, ip estática, red estática

Script para procesar fotos

Tras varios apuntes sobre como trabajar con fotos, pongo aquí el script completo que yo utilizo:

#!/bin/bash
#
# procesa_fotos.sh
# Por Guimi 2009/08 - http://www.guimi.net
#

####################################
#### ERRORES
E_NOPARAM=64        # Bad number of params

##########################
# PARAMETROS
DIR="./procesadas"

mkdir $DIR

echo "Renombrando videos..."
# Los ficheros .mov son peliculas que tienen asociado
#+ un fichero .jpg con el mismo nombre
for x in `ls *.mov 2> /dev/null`
do
	# Primero hemos de tomar el nombre sin la extension
	longitud_fichero=${#x}
	longitud_nombre=$(($longitud_fichero-4))
	nombre_fichero=${x:0:$longitud_nombre}

	# Comprobamos si existe el mismo fichero con extension jpg
	# En algunas camaras se llama .thm pero NO tiene cabecera exif
	if [ -f $nombre_fichero.jpg ]
	then
		# Tomamos la fecha, hora, minuto y segundo de la cabecera exif
		momento=`exif -t 0x9003 -m $nombre_fichero.jpg`
		nuevo_nombre="${momento:0:4}${momento:5:2}${momento:8:2}-${momento:11:2}${momento:14:2}${momento:17:2}"

		# Renombramos el fichero mov
		cp $x $DIR/$nuevo_nombre.mov
	fi
done

echo "Renombrando fotos..."
# Copiamos las fotos al directorio de trabajo
cp *.jpg $DIR
# Nos movemos al directorio de trabajo
cd $DIR
# Renombramos ficheros y los rotamos si es menester
jhead -autorot -n%Y%m%d-%H%M%S *.jpg > /dev/null
#jhead -n%Y%m%d-%H%M%S *.jpg

Convertir archivos Open XML (DOCX) a Open Document Format (ODF) y viceversa

Antes o después nos encontramos con el momento desagradable en que nos envían un documento en el formato “Open XML”, un formato cerrado de Microsoft que utiliza a partir de Office 2007 (archivos docx, xlsx, pptx…).

En este caso lo primero que hay que hacer es explicar al remitente que es mejor no utilizar esa engañifa y solicitarle de nuevo el documento en otro formato. Una opción es instalar odf-converter en Windows que permite a Microsoft Office guardar documentos en ODF.

Lo segundo, si lo primero falla, es convertir el documento al formato estándar y abierto ODF, mediante una herramienta en línea de comandos de Go-OO.org basada siempre en odf-converter (la pista es de OOONinja).

Para ello descargamos el fichero rpm desde el repositorio de go-oo.org.
$ wget http://download.go-oo.org/tstnvl/odf-converter/RPMS/i586/odf-converter-3.0.5273-1.i586.rpm

Instalamos herramientas necesarias:
$ sudo aptitude install rpm libgif4

Extraemos los ficheros, bien mediante el gestor de archivadores (doble click sobre el rpm), bien mediante:
$ rpm2cpio odf-converter*rpm | cpio -ivd

Y copiamos los binarios:
$ sudo cp usr/lib/ooo-2.0/program/OdfConverter /usr/bin/odfconverter-2.0
$ sudo cp usr/lib/ooo3/program/OdfConverter /usr/bin/odfconverter-3

El uso es muy sencillo. Por ejemplo para convertir un fichero XLSX hacemos:
$ odfconverter-2.0 fichero.xlsx
Y nos genera (tarda un poco) fichero.ods.

También se puede utilizar para convertir ficheros ODF a DOCX, pero no veo el interés o beneficio. En un momento dado es mejor convertir al formato anterior de Microsoft (doc, xls, ppt…).

ODF, DOCX, Open XML, convertir

Ordenar archivos en sistemas de ficheros FAT

El sistema de ficheros FAT es uno de lo más antiguos todavía en uso. Su actual popularidad se debe a que la mayoría de teléfonos móviles, lectores de MP3, cámaras de fotos, radios, etc. solo reconocen este sistema, por lo que las memorias USB, las tarjetas SD, MMC, etc. vienen formateadas con FAT.

El problema es que estos dispositivos no suelen ordenar los ficheros y directorios que encuentran, sino que muesrtan los archivos tal y como están grabados. Esto hace que muchas veces, tras pasar varias horas ordenando tu colección de música, molestándote en ponerles nombres tipo “01-titulo-artista.mp3″ y demás, te encuentras con que el reproductor lista las canciones aleatoriamente.

Para evitar esto basta con “ordenar” los ficheros en el sistema FAT. En GNU/Linux, como es habitual, es muy sencillo hacerlo (el dispositivo debe estar desmontado):
sudo fatsort (dispositivo)

Para que esto funcione bien, primero hay que instalar fatsort, lo que a su vez tambien es muy sencillo:
sudo aptitude install fatsort
Se puede obtener información sobre la patición con:
sudo fatsort -i (dispositivo)

FAT, sort, fatsort, ordenar ficheros, sort files