Luis Angel Cofiño

Trucos Linux

Sección Uno





Secciones

Índices

  1. Firestarter y los dichosos "hits"
  2. Sincronizar dos ordenadores en red (script)
  3. Prompt con colores
  4. Un prompt sencillo, rápido y con información
  5. Salida coloreada del comando "ls"
  6. Organizar un poco la configuración de bash
  7. Aspell no funciona en castellano, pero sí en inglés
  8. Actualizar por FTP de forma desatendida
  9. Poner en marcha Spamassassin
  10. ¿Por qué cdparanoia es tan lento?
  11. Respuesta automática por correo electrónico
  12. Monitorizar una página web determinada
  13. Mi servidor ofrece un shell, pero no FTP
  14. Me encanta Debian, ¡pero mi programa favorito está obsoleto!
  15. ¡Mi cortafuegos odia la ciencia-ficción!
  16. Montar automáticamente unidades de disco
  17. Cómo instalo un servidor de correo postfix en mi máquina
  18. ¿Qué necesito para usar una cámara digital Olympus C60 Zoom con Linux?
  19. El Stage 1 de Gentoo falla al compilar cups y más cosas
  20. Gentoo tarda demasiado en instalarse, y yo necesito el ordenador

  * *

Firestarter y los dichosos "hits"

Este fue uno de mis mayores quebraderos de cabeza. Si arrancas el cortafuegos "Firestarter", te encontrarás, cada vez que salgas a consola, con que ésta se te llena continuamente de basura, o sea, de salidas log procedentes del dichoso cortafuegos.

Por un lado, no quieres perder firestarter (es cómodo y útil), pero por el otro, la consola se vuelve una casa de locos por culpa de los hits. ¿Qué hacer?.

Pues los hits desaparecen de la consola simplemente tecleando como root el comando:

	[root@claudia lacofi]# dmesg -n1

Si no quieres tener que teclearlo cada vez que enciendes el ordenador, puedes hacer como yo y crear en /etc/rc.boot (o /etc/conf.d o el directorio equivalente en tu distribución) un fichero llamado 01-dmesg, con permisos de lectura y ejecución para root.root y que contenga:

	#! /bin/sh
	#       /etc/rc.boot/01-dmesg
	#       Ajustes para reducir mensajes en consola
	#

	dmesg -n1

Lo que hace esta orden (si consultas "man dmesg") es cancelar todos los mensajes del kernel en consola, excepto los de la clase "kernel panic". Ojo, lo que estás cancelando es la salida por consola, no el registro de los mensajes, que continuarán almacenandose normalmente en los archivos de /var/log. Si quieres eliminar también el registro de los hits en /var/log, tendrás que cambiar el fichero /etc/syslog.conf que está decentemente comentado. Eso sí, hacer esto último significará perder todos los mensajes del grupo warning, por lo que no te lo recomiendo.

Si no te interesa cancelar todos los mensajes del kernel en consola (con dmesg -n1), sino solo los del cortafuegos, puedes utilizar este otro truco: edita el fichero "/etc/firestarter/firewall.sh" y alrededor de la línea 86 encontrarás una entrada que dice así:

	$IPT -A LD -j LOG

Bueno, pues puedes cambiar esa línea y añadir lo que está en cian para dejarla así:

	$IPT -A LD -j LOG --log-level 6

Nuevamente, estás cancelando solo la salida por consola, pero no el almacenamiento de los hits en los ficheros de log. Naturalmente, con esto ya no debería ser necesario usar lo de "dmesg -n1".

  * *

Sincronizar dos ordenadores en red (script)

Supongamos dos ordenadores, uno de sobremesa (con nombre "claudia") y un portátil (con nombre "moira"). Queremos que sincronicen determinados directorios a través de una LAN Ethernet o WiFi. Para ello, podemos usar el siguiente script desde claudia que quizás le interese a alguien:

----------------- Comienza script "sincroniza" -------------------
#!/bin/sh

if test -d /mnt/moira/lacofi then echo "El sistema de archivos remoto ya esta montado." else mount /mnt/moira status=$? if [ $status -ne 0 ] ; then echo "Error al montar: Comprueba la red!" exit 1 fi fi if [ "$1" = "paca" ] ; then origen="/mnt/moira/lacofi/" destino="/home/lacofi/" else if [ "$1"="palla" ] ; then origen="/home/lacofi/" destino="/mnt/moira/lacofi/" else echo "Uso: sincroniza paca|palla" exit 1 fi fi rsync -varuz $origen/textos $destino/ rsync -varuz $origen/cuentas $destino/ rsync -varuz $origen/personal $destino/ rsync -varuz $origen/profesional $destino/ rsync -varuz $origen/externos $destino/ umount /mnt/moira ------------- Final de script "sincroniza" ----------------

Como puede observarse, este script está suponiendo algunas cosas. En primer lugar, que está funcionando correctamente el servicio NFS (efectivamente, los homes de ambos ordenadores se montan en el otro mediante NFS). En segundo lugar, hay que disponer de rsync, y ambas máquinas tienen que autorizarse el acceso mutuamente. En tercer lugar, este script se encuentra solo en claudia (el ordenador de sobremesa).

Bien, no voy a meterme en la configuración de NFS ni de Rsync. Están en google y se encuentran sin demasiados problemas. Pero echadle un vistazo al script, porque ahorra mucho trabajo en las sincronizaciones. Sobre todo porque rsync transfiere únicamente los cambios, con lo que es rapidísimo.

Para usarlo, desde claudia tecleamos:

	[lacofi@claudia lacofi]$ sincroniza palla

Y claudia copiará hacia moira (el ordenador portátil) todos los ficheros que hayan sido modificados desde la última sincronización. En cambio, si tecleamos:

	[lacofi@claudia lacofi]$ sincroniza paca

Claudia copiará desde moira todos los ficheros que se hayan modificado en el portátil. Es tan fiable, que incluso puedes teclear los dos comandos uno detrás de otro, sin pensar:

	[lacofi@claudia lacofi]$ sincroniza palla ; sincroniza paca

¿Y si estas sentado al teclado de moira?. Por ejemplo, supongamos que mi mujer está navegando por Internet con claudia. No la voy a quitar de ahí, pobrecita, solo para sincronizar los ordenadores, ¿verdad?.

Ni falta que hace. Puedes hacer, por ejemplo un SSH a claudia, y una vez dentro, ejecutar el script.

Pero es un poco lioso, más que nada porque entonces los "paca" y "palla" son términos un poco confusos (¿en qué ordenador estoy, acá o allá?). Vale, es una chorrada, pero me da una excusa para otra vuelta de tuerca. En moira ponemos otro script tal que así:

------------ script "sincroniza" de Moira --------------
#!/bin/sh
if [ "$1"="paca" ] ; then
	ssh claudia "sincroniza palla"
else
	if ["$1" = "palla"] ; then
		ssh claudia "sincroniza paca"
	else
		echo "Uso: sincroniza paca|palla"
	fi
fi
------------- script "sincroniza" de Moira--------------

Y ya está. El script llama a su homólogo del otro lado pero invirtiendo los términos. De esta forma, "aquí" siempre es "aquí" y "allí" siempre es allí. :-)

  * *

Prompt con colores

Habreis observado que mis indicadores de comandos suelen mostrar colores diferenciados dependiendo de qué usuario esté logado:

	[lacofi@claudia lacofi]$ su
	password:
	[root@claudia lacofi]# su maria
	[maria@claudia lacofi]$ 

Esto se consigue metiendo secuencias ANSI en el prompt, por medio de la variable $PS1. Esto se define metiendo en el fichero .bashrc de nuestro home:

	export PS1='\[\033[1;33m\][\u@\h \W]\$ \[\033[0m\]'

El término \033 es el carácter de escape. [1;33 es el código para el color amarillo, mientras que [1;36 sería para el color cian y [1;31 para el color rojo. Ejecutando este script veremos una muestra de qué colores y qué codigos hay disponibles (por cierto que este script no es mío... a alguien se lo debo, pero no estaba firmado y no me acuerdo de dónde lo saqué).

Je, je... qué despiste... el script está sacado del Bash-Prompt-COMO que viene con el mismísimo Linux. El autor es Giles Orr y el traductor Iosu Santurtún. A ellos van las gracias, pues. :-)

  * *

Salida coloreada del comando "ls"

Observa el siguiente comando:

	[lacofi@claudia externos]$ ls -Fohl --color
	total 142K
	-rw-r--r--    1 lacofi    28K 2000-09-22 23:34 addref.jpg
	-rw-r--r--    1 lacofi    13K 2000-09-22 23:34 altern_q.jpg
	-rw-r--r--    1 lacofi    17K 2000-09-22 23:34 altern_v.jpg
	-rw-r--r--    1 lacofi   1.5K 2000-09-22 23:34 index.html
	-rw-r--r--    1 lacofi   2.3K 2000-09-22 23:34 intro.html
	-rw-r--r--    1 lacofi   4.6K 2000-09-22 23:34 irix.html
	-rw-r--r--    1 lacofi     80 2000-09-22 23:34 newref.txt
	-rw-r--r--    1 lacofi    28K 2000-09-22 23:34 newtable.tar.gz
	-rwxr-xr-x    1 lacofi    43K 2000-09-22 23:34 newtable*
	-rw-r--r--    1 lacofi   4.1K 2000-09-22 23:34 problems.html

Se puede modificar a voluntad qué colores y con qué patrones se producirá la salida. Para ello hay que modificar el fichero "/etc/DIR_COLORS" o bien el fichero ".dir_colors" de nuestro home. Ahora bien, yo me he encontrado con que en algunos sistemas no funciona, y por mucho que modifiques, solo salen los directorios en color azul (el resto de los ficheros salen sin colorear). ¿Cómo solucionarlo?.

Pues yo lo soluciono simplemente metiendo en el ".bashrc" de nuestro home la siguiente orden:

	eval `dircolors ~/.dir_colors`

Un truco sencillito esta vez, ¿verdad?. :-)

  * *

Organizar un poco la configuración de bash

Si os gusta jugar un poco con el fichero .bashrc conviene mantener un cierto orden para no despistarse, por ejemplo guardando por separado los alias, las funciones, etc. Aquí está el mío:

----------Comienza .bashrc-------------
# Contenido de .bashrc

eval `dircolors ~/.dir_colors`

export LANG=es_ES
export LC_MESSAGES=es_ES
export LC_CTYPE=es_ES

if [ -d /usr/X11R6/lib/X11/nls ]; then
XNLSPATH=/usr/X11R6/lib/X11/nls
export XNLSPATH
fi

set meta-flag on        # conservar bit 8 en entrada de teclado
set output-meta on      # conservar bit 8 en salida por terminal
set convert-meta off    # no convertir secuencias de escape 
set horizontal-scroll-mode on
LESSCHARSET=latin1
export MM_CHARSET=ISO-8859-15    # para usar latin1 en los mails

source ~/.alias
source ~/.funciones

inductor_normal

----------Termina .bashrc--------------

Parece cortito, pero observad que, al final, hace dos referencias "source" a dos ficheros externos: ~/.alias y ~/.funciones. Estos dos ficheros cargan, evidentemente, los alias y las funciones por separado. Veamos mi fichero ~/.alias:

----------Empieza .alias---------------
alias ls='ls -Fhl --color'
alias bakstatus='zcat /var/log/asegurados_duro.log.gz'
alias baksearch='zcat /var/log/asegurados_duro.log.gz | grep -A10 '
alias dir='dir --color'
alias gvim='gvim -geometry 100x40'
alias less='less --quit-if-one-screen'
----------Termina .alias---------------

Ahora veamos el fichero de funciones, que tiene más jugo:

----------Empieza .funciones ----------
#!/bin/sh

# Códigos de colores: :-)
AZUL="\[\033[0;34m\]"
AZUL_CLARO="\[\033[1;34m\]"
VERDE="\[\033[0;32m\]"
VERDE_CLARO="\[\033[1;32m\]"
ORO="\[\033[0;33m\]"
ORO_CLARO="\[\033[1;33m\]"
CIAN="\[\033[0;36m\]"
CIAN_CLARO="\[\033[1;36m\]"
ROJO="\[\033[0;31m\]"
ROJO_CLARO="\[\033[1;31m\]"
BLANCO="\[\033[1;37m\]"
NOCOLOR="\[\033[0m\]"

# Aquí es donde se decide qué color aplicar
# Cada usuario, su color. 
case "$UID" in
		0)	
			USUARIO="$ROJO"
			U_CLARO="$ROJO_CLARO"
			;;
		501)
			USUARIO="$CIAN"
			U_CLARO="$CIAN_CLARO"
			;;
		502)
			USUARIO="$ORO"
			U_CLARO="$ORO_CLARO"
			;;
		*)
			USUARIO="$VERDE"
			U_CLARO="$VERDE_CLARO"
			;;
esac

# Y ahora vienen las funciones
function inductor_corto {
		case $TERM in
			xterm*)
				local BARRA='\[\033]0;\u@\h:\w\007\]'
				;;
			*)
				local BARRA=''
				;;
		esac
		PS1="${BARRA}$U_CLARO[\u@\h \W]\$ $NOCOLOR"
		PS2='> '
		PS4='+ '
	}

function inductor_normal {
   	case $TERM in
   		xterm*)
   			local BARRA='\[\033]0;\u@\h:\w\007\]'
   			;;
   		*)
   			local BARRA=""
   			;;
   	esac
   	PS1="${BARRA}$U_CLARO[$USUARIO\t/\j$U_CLARO][\u@\h:\w]\$$NOCOLOR "
   	PS2='> '
   	PS4='+ '
	}

function sube_web {
		case "$1" in
			telecable)
				echo "Subiendo la Página Personal a TeleCable"
				wwwsync -T -f ~/.wwwsync
				;;
			wap)
				echo "Subiendo la página WAP"
				wwwsync -T -f ~/.wapsync
				;;
			*)
				echo "Uso: wwwsync [ telecable | wap ]"
				echo ""
			;;
		esac
	}

# Final de las funciones. Preguntar "funciones" para un listado
	function funciones { 
		cat ~/.funciones | grep ^function | awk '{print $2}'
		}
----------Termina .funciones ----------

Vale, aquí hay varias cosas que pueden interesaros. En primer lugar, observad que pongo las funciones en un fichero aparte. Si a algún otro usuario del ordenador le interesan mis funciones o mis inductores del sistema (mi prompt), solo tiene que copiar el fichero a su home e incluir una entrada "source" en su .bashrc

Es más, observad también que ni siquiera tienen que modificarlo. El fichero de funciones pone el color adecuado automáticamente. Eso simplifica también el mantenimiento: por ejemplo se puede poner este fichero en "/etc/funciones" y poner todos los sources apuntando a él. Así, si root cambia el inductor del sistema, el cambio será efectivo automáticamente para todos los usuarios, y seguirá respetando los colores privados de los usuarios. De hecho, así es como lo tengo realmente en mi ordenador.

Pero, naturalmente, eso no significa que sea obligado. Si un usuario desea personalizar su inductor de otra forma, solo tiene que cambiar la entrada "source" para que apunte a otro fichero de su home.

Observad, además, que se incluyen varios inductores distintos en forma de funciones: cortos, largos, etc, por si en un momento dado, apetece otro inductor distinto sin cambiar el que está instalado por defecto. Para cambiar de uno a otro solo hay que usar las funciones:

[23:37:58/0][lacofi@claudia:~]$ inductor_corto
[lacofi@moira lacofi]$ inductor_normal
[23:38:40/0][lacofi@claudia:~]$ 

También os puede interesar, a modo de ejemplo, la última función. Al ejecutarla, os saldría un listado de las funciones disponibles. Fijaos que está algo sangrada para que no se incluya a sí misma en el listado.

	[23:38:40/0][lacofi@claudia:~]$ funciones
	inductor_corto
	inductor_normal
	sube_web
	[23:41:52/0][lacofi@claudia:~]$

Pues eso. Si le sirve de ayuda a alguien...

  * *

Aspell no funciona en castellano, pero sí en inglés

Este problema me salió a mi, y es bastante curioso porque te da un mensaje de error que no te orienta en absoluto. De hecho, te despista.

Intentaba ejecutar aspell con otros programas (concretamente con sylpheed-claws, el lector de correo), como corrector ortográfico, pero me decía que tururú, que no encontraba "el fichero". Probé a ejecutar gaspell me dijo que no encontraba el fichero "/usr/lib/ispell/espa~nol". Sin embargo tanto sylpheed como otros programas que usasen corrector ortográfico, funcionaban sin problemas cuando les decía que usaran el diccionario inglés.

Vale, el siguiente paso fue intentar ejecutar aspell "a mano". El resultado fue el mismo:

	[lacofi@claudia lacofi]$ aspell check fichero_prueba.txt
	Sorry, I can't read the file "/usr/lib/ispell/espa~nol."
	[lacofi@claudia lacofi]$ ls /usr/lib/ispell/espa~nol*
	-rw-r--r--    1 root     164k feb  7  2002 /usr/lib/ispell/espa~nol.aff
	-rw-r--r--    1 root     2.4M feb  7  2002 /usr/lib/ispell/espa~nol.hash
	[lacofi@claudia lacofi]$ ls /usr/lib/ispell/*.
	ls: /usr/lib/ispell/*.: No existe el fichero o el directorio

Imposible. Los ficheros existen, y son perfectamente accesibles. Tampoco se trata de un problema de extensión (que no los encuentre por la extensión ".aff" o ".hash"), puesto que los demás diccionarios también las tienen, incluyendo el inglés (que funciona). Es más, no hay ningún fichero sin extensión en ese directorio así que el diccionario castellano está igual de bien configurado que los demás. Aún más misterioso: si comprobamos el programa "ispell", veremos que funciona, en castellano y en servocroata, si se lo pides. Entonces, ¿qué falla?.

Pues resulta que el fallo no está ahí. Está aquí:

	[lacofi@claudia lacofi]$ su
	password
	[root@claudia lacofi]# cd /usr/share/pspell
	[root@claudia pspell]# cat es-aspell.pwli
	/usr/lib/ispell/espa~nol
	[root@claudia pspell]# echo /usr/lib/aspell/es > es-aspell.pwli
	[root@claudia pspell]# cat es-aspell.pwli
	/usr/lib/aspell/es
	[root@claudia pspell]# exit
	[lacofi@claudia lacofi]$

Si echais un vistazo al directorio /usr/lib/aspell vereis que es ahí donde están los diccionarios correctos, y que el español se llama "es", no "espa~nol". Una vez cambiado ese fichero, aspell podrá encontrar el diccionario y funcionará sin problemas. Por lo menos, a mí me funciona. ;-)

  * *

Actualizar por FTP de forma desatendida

Uno de los problemas a los que me enfrento como webmaster aficionado, es cómo actualizar mi web, desde claudia hasta el servidor, sin tener que estar conectando "a mano".

Se pueden hacer scripts que corran en crontab y que conecten con nuestro servidor periódicamente usando el truco:

	[lacofi@claudia lacofi]$ ftp lacofino:contraseña@servidor

Vale, pero... ¿si es un script, cómo demonios damos la orden de que suba los ficheros?. :-?

Una posible solución es usar WFtp, opción que, personalmente, no me gustó demasiado pero que funcionar, funciona.

Otra posibilidad es usar el programa lftp, que es una aplicación ftp capaz de hacer auténticas maravillas, como manejar bookmarks, enganchar servidores sftp (a través de ssh), y hacer correr scripts para automatizar la subida o bajada de ficheros, que es lo que nos interesa aquí. No me extenderé con esto, porque el programa está bien documentado, así que échale un vistazo tú mismo.

Una vez instalado y configurado el programa que queramos usar solo hay que meter una orden en /etc/crontab.

Y ya está. :-)

  * *

Poner en marcha Spamassassin

Si sois como yo, entonces odiareis el spam. Existen múltiples soluciones para aliviar un poco la carga que provoca el spam, aunque ninguna es perfecta del todo. En la práctica, yo uso varias de estas soluciones simultáneamente.

Una de las mejores opciones que hay disponibles en el mundo Linux es el SpamBouncer de Catherine A. Hampton (una mujer encantadora por E. Mail, por cierto). Pero no voy a contaros cómo se configura porque está perfectamente documentado y explicado en su propia página, así que a ella me remito. ¡Excelente trabajo, Catherine!. ;-)

Otra de las posibles soluciones es, naturalmente, el Spamassassin, con la ventaja de que la mayoría de las distribuciones Linux lo incorporan de serie en sus repositorios así que su instalación y configuración suele ser automática e integrada en la mayoría de los lectores de correo. Pero por si acaso tu distribución no lo configura de serie, ahí van unos apuntes que hice cuando usaba Debia. ;-)

Lo primero es instalar Spamassassin. Por ejemplo así (en el caso de Debian):

	[root@claudia lacofi]# apt-get install spamassassin

Con esto, el programa queda instalado y pre-configurado. Pero aún no del todo, porque hace falta activarlo, preferentemente en modo Daemon. Para ello:

	[root@claudia lacofi]# cd /etc/default
	[root@claudia default]# ls -Fohl
	total 64k
	-rw-r--r--    1 root      811 ene  8  2003 cdrecord
	-rw-r--r--    1 root     1.1k jul  7  2002 cdrecord.dpkg-dist
	-rw-r--r--    1 root       92 abr 28  2002 devpts
	-rw-r--r--    1 root      308 mar 31 14:29 dhcp
	-rw-r--r--    1 root     1.5k feb 16  2003 fetchmail
	-rw-r--r--    1 root      106 abr  4  2002 firewall-easy
	-rw-r--r--    1 root     1.1k mar 17  2002 gdomap
	-rw-r--r--    1 root       62 mar  2  2002 initrd-tools.sh
	-rw-r--r--    1 root     3.0k abr 13  2002 iptables
	-rw-r--r--    1 root      272 abr 15  2002 libnss-db
	-rw-r--r--    1 root       53 abr  4 03:24 lprng
	-rw-r--r--    1 root      641 nov  1  2002 rcS
	-rw-r--r--    1 root     1.8k abr  9  2002 rscsi
	-rw-------    1 root      267 abr 14 00:47 samba
	-rw-r--r--    1 root      272 sep 23 18:54 spamassassin
	-rw-r--r--    1 root      243 nov 14  2002 squid
	[root@claudia default]# gvim spamassassin

Vale, pues en ese fichero, donde pone "ENABLED=0" ponemos "ENABLED=1". De esta forma, a partir del próximo arranque, se iniciará el Spamassassin en modo Daemon.

Ahora, cada usuario puede activarlo en su correo... o no, a voluntad. Para ello hay que editar nuestro ".procmailrc":

	[root@claudia etc]# exit
	[lacofi@claudia lacofi]$ cd
	[lacofi@claudia lacofi]$ gvim .procmailrc

Bueno, pues en este fichero tenemos que añadir las lineas:

	:0 fhw
	* < 256000
	| /usr/bin/spamc 

Que, traducido al cristiano, viene a decir que todo el correo entrante cuyo tamaño sea inferior a 256000 bytes sea procesado con el cliente "spamc", que es el programa que llama al daemon de spamassassin.

Está bien poner este límite, porque en la práctica, no existe spam de tamaño tan grande, y si Spamassassin se pone a procesar un fichero tan enorme puede convertirse en una tortura para el procesador y para quien esté esperando el correo.

  * *

¿Por qué cdparanoia es tan lento?

Sip. Es lento. Lento hasta la desesperación, a veces.

En general, la extracción de pistas de audio es complicada porque la calidad del sonido depende de los algoritmos de corrección de errores.

Cdparanoia tarda al menos media hora en extraer el audio de un CD. Pero eso en el mejor de los casos. Dependiendo de lo rayado que esté el CD, o incluso de la marca del lector, podemos estar hablando de una hora... o varias, como es mi caso.

Pero eso es así porque cdparanoia es un perfeccionista. Se asegurará muy mucho de que el audio extraido será siempre de la máxima calidad, de tal forma que obtendrás buenos resultados incluso en CD muy rayados y viejos.

La pregunta es: ¿Hay algo que se pueda hacer para aumentar la velocidad de extracción?

Bueno, pues quizás. Por ejemplo, ¿tienes grabadora?. Si la tienes, úsala para sacar el audio de tu CD, en lugar de hacerlo con el lector de CD. Puede que te sorprenda, pero generalmente las grabadoras son mucho más rápidas extrayendo pistas de audio. Hay quien dice que los fabricantes de CD dificultan la transmisión del audio a propósito, para provocar cuellos de botella en la lectura, como una especie de medida anti-pirateo (la lectura de datos no se vería afectada, y escuchar el CD casi tampoco, porque se hace a una velocidad mínima).

Otra posibilidad, es usar cdparanoia con la opción "-Z". Eso desactiva la corrección de errores. Ganas mucho en velocidad, pero pierdes en calidad. Para más información: "man cdparanoia"

Pero si realmente te preocupa la velocidad de extracción, quizás deberías usar otro programa, no cdparanoia. Por ahí recomiendan cdda2wav, concretamente. Dicen que es muy rápido, aunque eso se paga (de nuevo) con pérdidas de calidad.

  * *

Respuesta automática por correo electrónico

No estoy hablando del típico mensajito de "estoy de vacaciones", sino de una verdadera respuesta automática a determinados correos, sensible al contexto. Por ejemplo, yo he usado esto para que mi ordenador enviase mis claves públicas GnuPG a demanda. Para ello, bastaba con enviarme un correo poniendo en el Subject (o Asunto del mensaje), las palabras "enviar clave PGP".

Actualmente ya no lo utilizo, porque subo mis claves a un servidor de claves, que es más rápido y limpio.

Por cierto, y a modo de agradecimiento: Este truco es, en realidad, una adaptación mejorada de otro que podeis encontrar en el "Mutt-i, GnuPG, PGP Howto" ;-)

Lo único que hay que hacer, es meter en vuestro fichero .procmailrc las siguientes líneas:

	:0 h
	* ^Subject:[    ]+\/(|enviar)[  ]+clave PGP\>.*
	| metasend -b -t `formail -rtzxTo:` -c lacofi@localhost \ 
	-s "Re: clave publica PGP" \
        -f /home/lacofi/.gnupg/notifica.txt -m text/plain -e base64 -n \
        -f /home/lacofi/.gnupg/llave_publica.txt -m text/plain -e base64 -n \
        -f /home/lacofi/.gnupg/telecable.txt \
        -m text/plain -e base64

Nota: Lo que hay entre los corchetes es un espacio y un tabulador.

Vamos a explicarlo todo un poco. Estas lineas indican a procmail que, cuando se reciba un mensaje con "enviar" y "clave PGP" en el Subject, haga lo siguiente:

Los programas formail y metasend forman la cabecera de un mensaje destinado al que envía la petición, pero también con una copia carbón (campo CC:) para mí mismo. Así sé quién ha pedido mis firmas. En el subject de este mensaje, se pone "Re: clave publica PGP".

A continuación, el programa metasend empaqueta un texto y lo codifica como MIME: será el cuerpo del mensaje, simplemente un texto en el que se indica que los ficheros adjuntos contienen mis claves públicas, y que se trata de una respuesta automática, por lo que el correo del solicitante no ha sido leido.

Luego metasend empaqueta los dos ficheros que contienen mis claves y los codifica como ficheros adjuntos base64. Despues se lo pasa todo a procmail que ejecuta la orden principal: lo envia. ;-)

  * *

Monitorizar una página web determinada

En ocasiones, me he visto en la necesidad de estar acudiendo constantemente a una página Web concreta en espera de una determinada noticia. Esto es así sobre todo en el caso de unas oposiciones en las que el resultado tenga que salir en el BOE o en una página Web de un ministerio.

Pues bien, hacer un script que monitorice esa página concreta es bastante fácil, y se pueden hacer verdaderas virguerías.Por ejemplo, que cuando aparezca un patrón específico, el ordenador envíe un correo electrónico a tu teléfono móvil. Si tienes el teléfono configurado para que te avise de la llegada de los correos electrónicos, tendrás un sistema de alarma completo. En cuanto la Web cumpla las condiciones especificadas, tu movil te dará la noticia estés donde estés.

He usado este truco en varias ocasiones. Por ejemplo, en una de ellas, un ministerio sacaba los resultados de una oposición en forma de tabla con enlaces a los documentos PDF. A medida que iban saliendo las notas, iban saliendo más enlaces en la tercera columna:

Puesto-A Corrección de errores Notas
Puesto-B Corrección de errores
Puesto-C Notas

¿Cómo monitorizar esto?. Pues en realidad es muy sencillo. Observa el script siguiente:

----------- Comienza script "comprueba_red" ----------
#!/bin/sh
# Este programita comprueba una determinada página Web
# en Internet y revisa que no aparezca determinada cadena.
# si aparece, envía un mensaje de alerta a la dirección
# de e-mail que tengo en, pongamos, vodafone (directamente
# a mi teléfono móvil!!!).
# comprueba_red 'http://www.una.es' 'buscar_esto' 'buscar_lo_otro'
# Establecer variables
	
virgen="/home/lacofi/.virgen"
pagina=$1
correo="609555555@vodafone.com"	# Obviamente, este NO es el mio ;-)
fecha=`date +"%Y-%m-%d"`
pri_cadena=$2
seg_cadena=$3
arch_temporal="/home/lacofi/temp/arch_temporal.txt"
doc_bajado="/home/lacofi/temp/pagina_bajada.html"
	
if test -f $virgen; then	# Elemental. Sin esto,
exit 1				# en cuanto cumpla los requisitos,
fi				# empezaría a bombardearnos con
		# correos uno detrás de otro!!!.
# Traerse la página
# lynx -dump -source http://www.boe.es/boe/fecha > index_fecha
# por ejemplo.
# pero yo elegí otra opción:
wget -O - $pagina | html2text -o $doc_bajado -nobs
	
# Crear el cuerpo del mensaje
touch $arch_temporal

# Procesar los datos y avisar
if cat $doc_bajado | grep $2 | grep $3; then
		echo "--- Con fecha $fecha ---" > $arch_temporal
		echo "Detectados cambios en la página:" >> $arch_temporal
		echo $pagina >> $arch_temporal
		echo "que te interesan bastante." >> $arch_temporal
		cat $arch_temporal | mail $correo -s "Alarma Web"
		touch $virgen
fi
	
# La hora de la limpieza
rm -f $doc_bajado
rm -f $arch_temporal
	
---------------------- Fin de "comprueba_red" ---------------

Ahora solo hay que meter una entrada en /etc/crontab de esta guisa:

30 * * *  * root comprueba_red http://consol.htm  Puesto_B Notas > /dev/null 2>&1

Y ya está. El ordenador chequeará la página web una vez cada hora, y cuando aparezcan "Puesto_B" y "Notas" en la misma línea, enviará el mensaje al teléfono móvil y grabará el fichero ".virgen" cuya existencia abortará el script (enviará un mensaje y solo uno).

Adáptese el script al gusto y a las circunstancias.

  * *

Mi servidor ofrece un shell, pero no FTP

Ocurre con cierta frecuencia, sobre todo para evitar agujeros de seguridad en el protocolo FTP. Lo típico, es que estos servidores que admiten cuentas shell (conexiones telnet o ssh), permitan accessos SSH y tal vez POP, pero es muy raro que admitan FTP. Ocurre por ejemplo con SDF-EU.

Normalmente no supone ningún problema, pero en algunos casos sí que limita bastante. Así, es dificil mantener una página Web en SDF-EU simplemente por la imposibilidad de acceder por FTP para subir y bajar los ficheros. Los administradores de SDF-EU recomiendan, sin ir más lejos, subir los ficheros por E-mail, como ficheros adjuntos =:-O.

Pero no hay por qué llegar a estos extremos. Tenemos también otras soluciones. :-)

Por ejemplo, usando el comando "scp", que sirve para copiar ficheros como hace "rsync" pero a través de una conexión SSH:

	[19:20:20/0][lacofi@claudia:~]$ scp websdf/index.html sdf-eu.org:html
	lacofi's password:

Con este comando, copiamos el fichero index.html al servidor sdf-eu.org y al subdirectorio html de mi home. Lógicamente, el servidor me pide que me identifique con mi contraseña.

Pero hay otra solución aún mejor: evidentemente el programa "sftp":

	[19:25:14/0][lacofi@claudia:~]$ sftp sdf-eu.org
	Connecting to sdf-eu.org...
	lacofi's password:

A primera vista, sftp no es muy distinto de cualquier programa ftp, y permite hacer las mismas cosas. Pero el protocolo que usa no es FTP, sino SSH, con lo que, en primer lugar, toda la transmisión, incluida la identificación inicial y la contraseña, están encriptadas. Y en segundo lugar, que si el servidor admite SSH, también admitirá sftp. :-)

  * *

Me encanta Debian, ¡pero mi programa favorito está obsoleto!

Sí, es quizás el principal defecto de Debian, junto con el tema del reconocimiento automático del hardware.

Bien, lo cierto es que si te gusta ir a la última, no deberías usar Debian. Al menos, no la versión estable de Debian, claro. Pero por otro lado, eso es lo que la hace precisamente estable, ¿no?.

Debian revisa una y otra vez todos los paquetes de programas para asegurarse de que funcionan de la mejor forma posible y sin peligro para el sistema. Solo entonces, congelan la distribución, arrancan otra rama paralela y sacan la versión congelada como la próxima Debian estable. Pero eso necesita mucho tiempo, claro, y por eso los programas de la versión congelada tienen a quedarse anticuados rápidamente.

En otras palabras: en cierto modo NO es un defecto de Debian, sino su mayor fortaleza, porque convierten a esta distribución de Linux en una verdadera roca... por un precio razonable en innovación.

Pero a veces es una lata, sinceramente. Porque ese programa tan magnífico que necesitas, que usas a diario, que te tiene enganchado... tiene unas carácteristicas magníficas en sus últimas versiones. Pero no puedes instalarlo, porque al intentar arrancar "apt-get" te saltan todas las dependencias para que reinstales 80000 paquetes... o te dice que ya tienes la última versión disponible. Me entiendes, ¿verdad?.

Lo que necesitas es un "backport". Los backports son una colección de paquetes Debian que se han sacado de las versiones "testing" o inestable del propio Debian, pero que se han recompilado de nuevo para que acepten las dependencias existentes en la versión estable.

Dónde puedes conseguir esas maravillas?. Pues en una página Web, claro está. Para acceder a los paquetes que más te interesen, puedes buscarlos directamente.

¡Pero cuidado!. Instalando "backports", estás aceptando un cierto riesgo. Probablemente no pasará nada por meter uno o dos, pero cuantos más vayas metiendo, más grande es el riesgo. Puedes llegar a hacer tu sistema bastante inestable. Caramba, pero es que si necesitas instalar muchos, no quieres una Debian estable sino la versión de desarrollo que toque. Así que se coherente, hombre, porque si estás así deberías replantearte muchas cosas.

En mi ordenador solo hay un paquete que realmente necesité pasar a una versión backport. Ese paquete es LyX, porque uno de mis hobbies es escribir novelas y relatos de ciencia ficción, así que hago un uso intensivo de este programa y me conviene aprovechar sus mejores características.

Actualmente, sin embargo, ya no utilizo Debian, así que distribución no necesita backports.

  * *

Un prompt sencillo, rápido y con información

A continuación muestro un inductor de sistema (prompt) que es bastante sencillo, rápido y proporciona mucha información útil en línea de comandos.

Parte de este inductor es mío. Pero otra parte (de hecho, la gran mayoría) procede de otro prompt que está en la red y que me gustó mucho. Desde aquí mi agradecimiento a Jeremy (jeremy-bash algarroba batray.net) por su excelente prompt, que publicó en una página ya desaparecida: http://www.themedepot.org.

Y muchas gracias desde aquí a Rafa Berlanga, de Sevilla, que me puso sobre la pista de un par de errores que había en los script que siguen, por culpa de los cuales se producían resultados inesperados al ejecutarlos. ;-)

Vale. Hechas las debidas presentaciones, cread un fichero "shortstatus", por ejemplo /etc/shortstatus, que sea legible por todos y que contendrá esto:

	export T_normal=0
	export T_bold=1
	export T_underline=4
	export C_owner='1;32'
	export C_write='1;33'
	export C_nowrite='1;31'
	export C_error='1;31'
	export negrita='1;37m'

	export DIRCOLOR=$T_normal
	export EXIT_CODE=0
	export CODE_COLOR=$T_normal
	export CODE_STRING=
	export USER_STYLE=$T_normal

	prompt_command()
	{
	EXIT_CODE=$?
	DIRCOLOR=$T_normal

	# Código de colores para el directorio
	if [ -O $PWD ]
	then
		DIRCOLOR=$C_owner
	elif [ -w $PWD ]
	then
		DIRCOLOR=$C_write
	else
		DIRCOLOR=$C_nowrite
	fi

	# Añadir un número rojo para el código de error previo 
	if [ $EXIT_CODE -ne 0 ]
	then
		CODE_COLOR=$C_error
		CODE_STRING=\ "<"$EXIT_CODE">"
	else
		CODE_COLOR=$T_normal
		CODE_STRING=
	fi

	# subrayar el nombre de usuario si está corriendo ssh-agent
	if [ -S "$SSH_AUTH_SOCK" ]
	then
		USER_STYLE=$T_underline
	else
		USER_STYLE=$T_normal
	fi
	}

	export PROMPT_COMMAND=prompt_command

	# Ojito, las siguientes lineas son en realidad una sola, todo seguido hasta la última comilla 
	PS1=$PS1'\[\e[${USER_STYLE}m\]\u\[\e[${T_normal}m
		\e[$negrita\]@\h:\[\e[0m\]\[\e[${DIRCOLOR}m\]\w\[
		\e[${CODE_COLOR}m\]$CODE_STRING\[\e[${T_normal}m
		\e[1;37m\]\$ \[\e[0m \]'
	export PS1

Pero con esto solo no basta, claro. Además, vuestro fichero ".bashrc" debería contener estas líneas:

	AZUL="\[\033[0;34m\]"
	AZUL_CLARO="\[\033[1;34m\]"
	VERDE="\[\033[0;32m\]"
	VERDE_CLARO="\[\033[1;32m\]"
	ORO="\[\033[0;33m\]"
	ORO_CLARO="\[\033[1;33m\]"
	CIAN="\[\033[0;36m\]"
	CIAN_CLARO="\[\033[1;36m\]"
	ROJO="\[\033[0;31m\]"
	ROJO_CLARO="\[\033[1;31m\]"
	BLANCO="\[\033[1;37m\]"
	NOCOLOR="\[\033[0m\]"
	if [ "$USER" == "lacofi" ]; then  # Esto tendrás que personalizarlo tú *******
	  USUARIO_CLARO=$CIAN_CLARO
	  USUARIO=$CIAN
	elif [ "$USER" == "maria" ]; then
	  USUARIO_CLARO=$ORO_CLARO
	  USUARIO=$ORO
	fi

	prompt_command()
	{
	NULO=""
	}

	function inductor_status {
   	if [ ${TERM:0:5} = xterm ]
   	then
		PS1="${BARRA}$USUARIO_CLARO[$USUARIO\t/\j$USUARIO_CLARO]\[\e]0;\u@\h:\w\007\]"
   	else
		PS1="${BARRA}$USUARIO_CLARO[$USUARIO\t/\j$USUARIO_CLARO]"
   	fi
   	source /etc/shortstatus
	}

Bien, no importa que sea en .bashrc (también podría estar en el fichero donde almaceneis vuestras funciones, en caso de tenerlo por separado). Échale un vistazo a la sección sobre cómo organizar bashrc, si tienes dudas.

¿Qué proporciona este inductor?. Bueno, veríais algo así:

	[03:38:33/0]lacofi@moira:~/bash_prompts$ dirr
	bash: dirr: command not found
	[03:39:00/0]lacofi@moira:~/bash_prompts <127>$ cd /home
	[03:40:44/0]lacofi@moira:/home$ cd /etc
	[03:41:13/0]lacofi@moira:/etc$ sleep 300 &
	[1] 12986
	[03:41:36/1]lacofi@moira:/etc$ eval `ssh-agent`
	Agent pid 13130
	[03:43:58/1]lacofi@moira:/etc$ su maria
	password:
	[3:55:37/0]maria@moira:/etc$

A ver, de izquierda a derecha... primero sale la hora. En color cian, pero solo porque es lacofi quien está logado. Si fuese maría, la hora saldría en amarillo. Donde pone "/0" indica el número de comandos que están funcionando en background. Después sale el login y el nombre del ordenador. Luego el directorio actual, con un código de colores: verde significa que somos el dueño, amarillo significa que no lo somos pero tenemos permisos de escritura, rojo significa solo lectura. Si el comando previo dió algún error, después aparececía el código de error en color rojo. Pero solo si hubo error. Si no, no sale nada. Y si está funcionando "ssh-agent", además, el login aparecerá subrayado y en cian, para que nos demos por aludidos de un solo vistazo.

Este inductor bash da información a raudales. Y es muy rápido. Pruébalo. :-)

  * *

¡Mi cortafuegos odia la ciencia-ficción!

Esto me ocurrió hace tiempo, y fue de los más sorprendente:

Resulta que dos de mis páginas favoritas, que suelo visitar habitualmente, parecían caidas. Concretamente me refiero a Cyberdark y a El Sitio.

Al principio no le di mayor importancia. Interpreté como que "El Sitio" estaba en algún subdominio de "Cyberdark", o a la inversa. Pero pasaron tres o cuatro días y el fallo continuaba. Sorprendente. ¡Menudo follón debían tener en sus sistemas, los pobres!.

Mientras tanto yo continuaba navegando sin problemas por otras Webs. Hasta que, unos días más tarde me llegó por correo el habitual mensaje de la lista de correos de El Sitio (a la que estoy suscrito). Esto me hizo sospechar: ¡Cómo!. ¿La web se está actualizando normalmente?. ¿No hablan nada de los fallos de sus proveedores?. :-O

Me bastó con cerrar mi cortafuegos para entrar sin problemas en ambas Web. ¡La leche!. ¿Mi cortafuegos estaba bloqueando selectivamente las páginas de ciencia-ficción?. ¿Por qué?.

Así que hice unas pocas pruebas:

	[18:18:58/0][lacofi@claudia:~]$ ping www.ciencia-ficcion.com
	PING ciencia-ficcion.com (69.57.155.58): 56 data bytes
	64 bytes from 69.57.155.58: icmp_seq=0 ttl=47 time=200.9 ms
	64 bytes from 69.57.155.58: icmp_seq=1 ttl=47 time=188.7 ms
	64 bytes from 69.57.155.58: icmp_seq=2 ttl=47 time=199.2 ms
	64 bytes from 69.57.155.58: icmp_seq=3 ttl=47 time=211.3 ms
	64 bytes from 69.57.155.58: icmp_seq=4 ttl=47 time=206.6 ms
	64 bytes from 69.57.155.58: icmp_seq=5 ttl=47 time=199.6 ms
	64 bytes from 69.57.155.58: icmp_seq=6 ttl=47 time=209.7 ms
	64 bytes from 69.57.155.58: icmp_seq=7 ttl=47 time=205.5 ms
	64 bytes from 69.57.155.58: icmp_seq=8 ttl=47 time=206.1 ms

	--- ciencia-ficcion.com ping statistics ---
	9 packets transmitted, 9 packets received, 0% packet loss
	round-trip min/avg/max = 188.7/203.0/211.3 ms

	[18:24:06/0][lacofi@claudia:~]$ ping www.cyberdark.net
	PING cyberdark.net (69.57.155.57): 56 data bytes
	64 bytes from 69.57.155.57: icmp_seq=0 ttl=47 time=193.0 ms
	64 bytes from 69.57.155.57: icmp_seq=1 ttl=47 time=197.8 ms
	64 bytes from 69.57.155.57: icmp_seq=2 ttl=47 time=195.3 ms
	64 bytes from 69.57.155.57: icmp_seq=3 ttl=47 time=207.3 ms
	64 bytes from 69.57.155.57: icmp_seq=4 ttl=47 time=207.0 ms
	64 bytes from 69.57.155.57: icmp_seq=5 ttl=47 time=216.1 ms
	64 bytes from 69.57.155.57: icmp_seq=6 ttl=47 time=207.7 ms
	64 bytes from 69.57.155.57: icmp_seq=7 ttl=47 time=207.5 ms

	--- cyberdark.net ping statistics ---
	8 packets transmitted, 8 packets received, 0% packet loss
	round-trip min/avg/max = 193.0/203.9/216.1 ms

Vale. ya sabemos algo. Los ping enviados a ambas páginas son devueltos sin problemas. Es más, las direcciones IP de ambas máquinas son muy parecidas. Tanto que probablemente pertenecen al mismo dominio. Algo deben estar haciendo que a mi cortafuegos no le gusta ni un poquito.

Así que hay que editar el fichero de configuración que usa el cortafuegos (en ese momento yo usaba firestarter, y su configuración estaba en /etc/firestarter/firewall.sh). A propósito, os recomiendo que reviseis siempre el fichero de configuración incluso aunque no tengais problemas: se puede aprender mucho sobre cortafuegos simplemente echando un vistazo a este archivo.

Pero volviendo a lo que nos interesa... en torno a la línea 457 del archivo, me encontré con un largo listado de líneas que decían:

	# --( Rules Configuration - Block nonroutable IP Addresses )-- 

	#Block nonroutable IPs 
	$IPT -t filter -A INPUT -s 1.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 2.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 5.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 7.0.0.0/8 -d $NET -i $IF -j $STOP
		(sigue y sigue el listado hasta: )
	$IPT -t filter -A INPUT -s 59.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 60.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 69.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 70.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 71.0.0.0/8 -d $NET -i $IF -j $STOP
	 	(y sigue y sigue todavía más).

Vale. Fijaos en la línea marcada en color cian, donde menciona 69.0.0.0/8. Poniendo en su sitio todas la variables, y traducido al cristiano, viene a decir:

"regla iptables de filtrado, para entrada, cuya fuente proceda de una IP cuyo primer número sea 69: detener todos los paquetes dirigidos a esta red entrando por eth0".

Lo considera una IP no enrutable, una dirección reservada. Parece que ambas Webs habían cambiado recientemente su IP (quizás pertenecen al mismo proveedor o la misma red local). De ahí que ambas hayan sido bloqueadas selectivamente por mi cortafuegos. La solución es muy sencilla, solo tengo que comentar la linea marcada en cian. Quedaría así:

	$IPT -t filter -A INPUT -s 59.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 60.0.0.0/8 -d $NET -i $IF -j $STOP
	#$IPT -t filter -A INPUT -s 69.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 70.0.0.0/8 -d $NET -i $IF -j $STOP
	$IPT -t filter -A INPUT -s 71.0.0.0/8 -d $NET -i $IF -j $STOP

Y después reiniciar el cortafuegos. Por ejemplo con:

	[19:10:08/0][root@claudia:~]# /etc/init.d/firestarter stop 
	[19:10:23/0][root@claudia:~]# /etc/init.d/firestarter start

Y ya está. Mi madre, que susto me he llevao... :-)

La pregunta es "¿por qué mi cortafuegos consideraba reservadas las direcciones que empiezan por 69?". Bueno, pues resulta que esas direcciones del rango 69.0.0.0/8 estaban reservadas para uso futuro. El "futuro" en cuestión llegó a mediados de 2002, cuando el organismo competente (el IANA) liberó esas direcciones para uso común en Internet. Muchos cortafuegos que aún no se habían enterado de esto, y de ahí han surgido algunos problemas como el mío. La recomendación que rige actualmente es que se libere el acceso esos rango en todos los cortafuegos, según se indica específicamente en los listados del IANA.

Pero ten en cuenta que hay más direcciones reservadas. A medida que se vayan liberando pueden surgir otros problemas intermitentes como éste. Así que ya sabes.

  * *

Montar automáticamente unidades de disco

Habitualmente uso Linux en una pantalla de X-Windows, ya sea con WindowMaker, Gnome o KDE. Pero es muy, muy raro que no tenga abierta una ventana de comandos. Estoy acostumbrado, desde siempre, a usar comandos para todo, así que no me cuestan nada teclear un "mount /mnt/dvd".

Y es que el montaje de unidades de disco con mount es una de las características más típicas y potentes de UNIX y Linux. Ciertamente, es un sistema muy flexible que proporciona multitud de opciones, pudiendo... bla, bla, bla...

Chorradas. Seamos sinceros: todo el mundo usa mount para lo mismo, y al final plantas todas tus opciones en /etc/fstab y las ejecutas siempre igual con un comando estereotipado, como hago yo. Hasta que alguien acostumbrado a Windows, en su inocencia, te dice "Pues eso de montar los discos es un peñazo, en Windows no hay que hacer nada de eso".

Y entonces frunces el ceño y a poco que lo pienses, reconoces que sí, que tienen toda la razón. Windows no te pide que montes los CD antes de usarlos. Lo hace él de forma transparente. Y es una buena costumbre... sinceramente, tener que montarlo todo es un peñazo. Así que vamos a hacer que nuestro Linux se comporte igual.

En primer lugar necesitas instalar un demonio que haga exactamente eso: vigilar la disquetera o el CD, de tal forma que cuando metes un disco, él va y lo monta. Y que cuando no estás haciendo nada con él, va y lo desmonta. En Debian es tan complicado como esto: Anda, vete a una ventana de comandos y teclea "apt-get install autofs".

Ahora tienes que configurarlo. En este ejemplo configuraré el automontaje para mi DVD, mi Iomega ZIP y la disquetera.

Edita /etc/auto.master y déjalo tal que así

	# $Id: auto.master,v 1.2 1997/10/06 21:52:03 hpa Exp $
	# Sample auto.master file
	# Format of this file:
	# mountpoint map options
	# For details of the format look at autofs(5).
	/mnt/auto /etc/auto.discos --timeout=2

La entrada "/mnt/auto" es el directorio donde se van a montar las unidades. "/etc/auto.discos" desvía la configuración de este directorio de montaje hacia otro fichero (puedes especificar varios, si quieres, uno para cada unidad, pero en la práctica es más cómodo hacerlo con uno solo para todo). La opción "timeout" es el tiempo de inactividad, en segundos, a partir del cual el demonio desmontará automáticamente la unidad. En mi caso, son dos segundos.

Ahora edita el fichero /etc/auto.discos:

	# $Id: auto.misc,v 1.2 1997/10/06 21:52:04 hpa Exp $
	# This is an automounter map and it has the following format
	# key [ -mount-options-separated-by-comma ] location
	# Details may be found in the autofs(5) manpage
	dvd	-fstype=iso9660,ro,sync,nodev,nosuid	:/dev/hdd
	floppy	-fstype=auto,sync,nodev,nosuid		:/dev/fd0
	zip	-fstype=auto,sync,nodev,nosuid		:/dev/hdb

En este fichero, "dvd" será un subdirectorio de "/mnt/auto", donde el demonio montará el disco dvd, con las opciones especificads y usando el dispositivo que figura en la misma linea. El fichero es bastante claro, como ves.

Ahora tienes que crear el directorio de montaje y borrar los antiguos, que ya han dejado de ser válidos. Los vas a sustituir por simples enlaces simbólicos.

	[15:16:04/0][root@claudia:~]# mkdir /mnt/auto
	[15:16:10/0][root@claudia:~]# cd /
	[15:16:13/0][root@claudia:/]# ls -Fohld dvd floppy /mnt/zip
	drwxr-xr-x	1 root	13 ene 25 15:06 dvd
	drwxr-xr-x	1 root	16 ene 25 15:06 floppy
	drwxr-xr-x	1 root	13 ene 25 15:05 /mnt/zip
	[15:16:24/0][root@claudia:/]# rmdir dvd floppy /mnt/zip
	[15:16:29/0][root@claudia:/]# ln -s /mnt/auto/dvd /dvd
	[15:16:35/0][root@claudia:/]# ln -s /mnt/auto/floppy /floppy
	[15:16:43/0][root@claudia:/]# ln -s /mnt/auto/zip /mnt/zip
	[15:16:54/0][root@claudia:/]# ls -Fohld dvd floppy /mnt/zip
	lrwxrwxrwx	1 root	13 ene 25 15:06 dvd -> /mnt/auto/dvd
	lrwxrwxrwx	1 root	16 ene 25 15:06 floppy -> /mnt/auto/floppy
	lrwxrwxrwx	1 root	13 ene 25 15:05 /mnt/zip -> /mnt/auto/zip

Observa que hemos creado el directorio "/mnt/auto", pero no los subdirectorios "/mnt/auto/dvd", etc. Está bien, es correcto, y esto hace que los enlaces simbólicos estén rotos. Pero, insisto, así es como debe ser.

Existe un poderoso motivo por el cual estos enlaces simbólicos deben estar rotos. Ese motivo es un requerimiento de UNIX: "los directorios de montaje deben estar siempre vacios". Imagínate que los enlaces simbólicos están bien. ¿Qué ocurre si intentas copiar un fichero a tu disquetera ZIP, sin meter un disco ZIP?. ¡Que lo hace!. Solo que no va a ningún disco ZIP, claro, sino al directorio de montaje, con lo que la próxima vez que metas un disco ya no estará vacío. De ahí que el enlace simbólico esté roto: no se puede grabar nada, ni siquiera accidentalmente, porque el enlace apunta a... nada. No temas, el demonio de montaje se encargará de crear el subdirectorio adecuado en cuanto detecte un disco en la unidad. Y entonces, solo entonces, el enlace simbólico dejará de estar roto.

Ahora ya solo tienes que ponerlo en marcha:

	[15:22:12/0][root@claudia:/]# /etc/init.d/autofs stop 
	[15:22:16/0][root@claudia:/]# /etc/init.d/autofs start

Y ya está. Las unidades DVD, ZIP, y la disquetera de tu ordenador se comportarán de forma "transparente" y "automágica", como en Windows. De hecho, mejor que en Windows. Por ejemplo, si pulsas el botón de expulsión del DVD mientras tienes abierto su contenido en el Konqueror, descubrirás que el ordenador se niega a obedecerte. Sin embargo, bastará con que cierres el Konqueror para que el ordenador desmonte la unidad, "recuerde" la orden de expulsión y saque el DVD, todo en uno. :-)

Eso sí, si usas KDE, descubrirás un pequeño problema con los iconos del escritorio. La solución es sencilla, pero hay que encontrarla. ;-)

Pues eso, encuéntrala. :-D

Obviamente, la mayoría de las distribuciones modernas, como Ubuntu o Fedora, incluyen algun modo de montaje automático por defecto. Este truco solo necesitas aplicarlo si usas alguna distribución anticuada o para frikis (como mi querida Gentoo, por ejemplo ;-).

  * *

Cómo instalo un servidor de correo postfix en mi máquina

En primer lugar, quiero darle las gracias Sin Dominio. Esta configuración de Postfix es una copia descarada de la que ellos describen en su Web.

Mi problema era el siguiente: configurar postfix para manejar el correo es relativamente fácil, pero me enfrentaba a un problema que no conseguía solucionar. Mi máquina se identificaba localmente como "claudia", pero externamente como "telecable.es". Perfecto, pero mi cuenta root no recibía ningún log de sus actividades ni tampoco ninguna de las monitorizaciones de seguridad. Empecé a sospechar que iban a parar a root@telecable.es en lugar de a mi máquina. Y mis sospechas se confirmaron cuando recibí una amable queja de Telecable. Lo de "amable" no es con sarcasmo, realmente lo fueron.

Bien, encontrar esto no fue nada fácil, hasta que me tropecé con el documento Postfix en casa - Micro HOWTO, en Sin Dominio. Esta configuración sirve para Telecable, pero también para cualquier otro proveedor ISP por módem, cable, y supongo que también ADSL.

Lo primero, naturalmente es instalar Postfix, pero supongo que eso ya lo has hecho. :-) La gracia está en configurarlo.

Para Telecable, usando Fedora Core 1, hazte root y crea un fichero /etc/postfix/main.cf que contenga esto:

#
## Archivo de configuracion para el postfix en Telecable
#
# Es el típico ejemplo de configuración vía módem:
# - Conexión discontinua (le digo a mano cuándo tiene que enviar el mail)
# - La dirección de salida del mail es enmascarada
# - El correo para los usuarios locales es enviado localmente

##########################################################
#                                                        #
# NO CAMBIES MAS DE UN PAR DE VALORES CADA VEZ!!!!!!!!!! #
#                                                        #
##########################################################

# aquí el nombre de tu máquina. No tiene por que ser válido en Internet.
myhostname = claudia
mydomain = claudia

# De dónde parece que viene el correo que envío desde aquí
myorigin = telecable.es
defer_transports = smtp

# Programas que usará el servidor de correo para procesar datos
mailbox_command = /usr/bin/procmail

# Enlazar con más ficheros de configuración
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
virtual_maps = hash:/etc/postfix/virtual
transport_maps = hash:/etc/postfix/transport

# Importante! En las configuraciones antiguas no está por defecto, 
# y en Debian GNU/Linux no funciona sin él
setgid_group = postdrop

# Rutas por defecto
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
program_directory = /usr/lib/postfix

# usuarios y seguridad
mail_owner = postfix
default_privs = nobody

# Interfaces e identidades 
inet_interfaces = localhost, claudia
mydestination=$myhostname,localhost.$mydomain,claudia.$mydomain,localhost,claudia
mynetworks = 127.0.0.0/8

# Otros
smtpd_banner = $myhostname ESMTP $mail_name
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10

Ahora creamos un fichero /etc/postfix/virtual que contenga esto:

	# Lo primero, hacer que cuando un mensaje sea para root, 
	# o para un usuario local, se quede en la misma máquina.
	root root@localhost
	postmaster postmaster@localhost
	lacofi lacofi@localhost

Ahora creamos un fichero /etc/postfix/transport con:

	# Todo mensaje para el dominio "telecable.es" debe salir fuera. Todo
	# mensaje para "claudia" o "localhost" debe quedarse aquí.
	telecable.es            smtp:
	claudia                 local:
	localhost.localdomain   local:
	localhost               local:

Y ahora algunos alias, en el fichero /etc/postfix/aliases. Casi todos, excepto el último, vienen "de serie", con lo que no hay que cambiar nada. Excepto el último, sí, porque hace que finalmente todo el correo "root" se desvie a nuestra cuenta de usuario normal, que es la que usamos casi siempre.

	postmaster: root
	MAILER-DAEMON:  postmaster
	bin:            root
	daemon:         root
	games:          root
	ingres:         root
	nobody:         root
	system:         root
	toor:           root
	foo:            root
	falken:         root
	admin:          root
	manager:        root
	dumper:         root
	operator:       root
	decode:         root
	moof:           root
	moog:           root
	info:           staff
	marketing:      staff
	sales:          staff
	support:        staff
	abuse:          postmaster
	noc:            root
	security:       root
	hostmaster:     root
	news:           usenet
	usenet:         root
	www:            webmaster
	webmaster:      root
	uucp:           root
	ftp:            root
	staff:          postmaster
	office:         postmaster
	all:            postmaster
	tech:           postmaster
	ops:            postmaster
	# Person who should get root's mail.  This alias
	# must exist.
	# CHANGE THIS LINE to an account of a HUMAN
	root:           lacofi

Ahora tenemos que activarlo todo:

[root@claudia:/etc/postfix]# /usr/sbin/postalias /etc/postfix/aliases
[root@claudia:/etc/postfix]# /usr/sbin/postmap /etc/postfix/main.cf
[root@claudia:/etc/postfix]# /usr/sbin/postmap /etc/postfix/virtual
[root@claudia:/etc/postfix]# /usr/sbin/postmap /etc/postfix/transport
[root@claudia:/etc/postfix]# /etc/init.d/postfix restart

Actualmente, mi máquina ya no es claudia sino jeanette, y tiene IP fija y dominio propio legal (el domino jeanette.es me pertenece a mí, sí). Así que ya no tengo el problema que tenía con la vieja configuración, y cualquier referencia que se haga a jeanette.es en cualquier lugar del mundo, apunta directamente al ordenador de mi casa. Pero ese es otro tema. ;-)

  * *

¿Qué necesito para usar una cámara digital Olympus C60 Zoom con Linux?

Nada. :-)

Si tu linux soporta USB no necesitas nada, solo enchufar la cámara al puerto USB y cuando la Olympus te pregunte, pulsar el botón que dice "PC". La cámara estará en /dev/sda1 (por ejemplo), por lo que solo tienes que montarla para acceder a los datos.

Y aún puedes hacerlo más fácil. Yo tengo configurado el dispositivo /dev/sda1 en el autofs, por lo que solo tengo que enchufar la cámara y ella sola queda montada automáticamente, a todos los efectos convertida en un gran disquette. Si no sabes cómo configurar el autofs, lo tienes más arriba. Hasta donde yo se, probablemente todas las cámaras que admiten conexión USB, deberían funcionar correctamente con Linux así de fácil.

Si te has comprado el dispositivo MAUSB-100 de Olympus (una especie de lápiz USB para leer la tarjeta xD sin necesidad de la cámara), te diré que también funciona sin problemas, montandola igualmente en /dev/sda1 (u otro dispositivo del tipo /dev/sd*).

Y a continuación te pongo este script, que sirve para automatizar la copia de fotos, de la cámara a tu disco duro. El script se encarga de crear un subdirectorio con la fecha, y luego copia todas las fotos. Si estás en una consola de solo texto, los mensajes del script serán bastante espartanos, pero si estás en XWindow, te saldrá hasta un cuadro de progreso (usando Zenity). Solo tienes que enchufar la cámara, y ejecutarlo, vaya, incluso puedes poner un icono en tu escritorio. ;-)

--------------- Inicio de script "salvafotos" --------
#!/bin/bash
# Comprueba que estos dos directorios son correctos
origen=/mnt/usb/dcim/100olymp
destino=/datos/imagen/olympus

fecha=`date +%Y-%m-%d`
creado="no"
declare -i numero
declare -i fotos

# Se asume que el USB se automonta con autofs.
# Por eso no hay ninguna sentencia "mount /mnt/usb" ni similar.

# Subrutina para XWindow. Un programa independiente, en realidad
function xwindow {
	numero=1
	(
	for fichero in `find $origen -type f`
	do
		progresion=`echo "( $numero * 100 ) / $fotos" | bc`
		echo $progresion ;
		echo "# Copiando $fichero" ;
		cp $fichero $destino/$fecha
		numero=`expr $numero + 1`
	done
	)|
	zenity --progress --auto-close --title="Guardando las fotos" \
		--text="Guardando $fichero" --percentage=0
}

# Subrutina para consola. Un programa independiente, en realidad
function consola {
	if [ "$creado" = "si" ]; then
		echo "Creado directorio $fecha"
	fi
	for fichero in `find $origen -type f`
	do
		if [ -f $fichero ]; then
			echo "Copiando $fichero en $destino/$fecha"
			cp $fichero $destino/$fecha/.
		fi 
	done
	echo "$fotos fotos copiadas"
}

# Bloque principal. Decide si Xwindow o Consola y llama a subrutinas
if [ -d $origen ]; then
	if [ ! -d $destino/$fecha ]; then
		mkdir $destino/$fecha
		creado="si"
	fi

	fotos=`find $origen -type f | wc -l`

	if [ "$TERM" = "xterm" ] ||
		[ "$TERM" = "dumb" ]; then
		xwindow
	else
		consola
	fi
else
	if [ "$TERM" = "xterm" ] ||
		[ "$TERM" = "dumb" ]; then
		zenity --warning --text="Cámara no montada. ¿La has enchufado?."
	else
		echo "Cámara no montada. ¿La has enchufado?."
	fi
fi
--------------- Final de script "salvafotos" --------

Y si quieres ser un poquito más sofisticado, puedes meter tu cámara en una entrada UDEV, con lo que puedes hacer que el dispositivo de montaje sea siempre /dev/masub o /dev/olympus_c60zoom, por ejemplo.

  * *

El Stage 1 de Gentoo falla al compilar cups y más cosas

Te has decidido a instalar Gentoo 2004.2, decisión que te ha costado un huevo, porque sabes que no es sencilla y se maneja enterita a golpe de comando. Pero has descubierto que el Gentoo Handbook te guía de la mano, como si fueras tonto, diciéndote exáctamente qué tienes que teclear y dónde. Un linux-novato probablemente se pierda, pero tú, que tienes cierta experiencia, ves las cosas más claras, con el Gentoo Handbook en la mano. Tanto, que ya puestos te tiras a la calle y te metes en la instalación de un Stage 1, con un par. Y efectivamente, sigues al pie de la letra el manual y pasas fácilmente a Stage 2, y luego a Stage 3. Esto es jauja, piensas.

Y entonces le toca el turno a la instalación de Gnome. Y haces un "emerge gnome xscreensaver" tal y como dice el Handbook, y te vas a la cama tan ancho, mientras el ordenador se pasa toda la noche compilando. Y a la mañana siguiente, descubres que la compilación se ha detenido en cups con un error que dice algo parecido a esto:

Calculating dependencies ...done!
	emerge (1 of 1) net-print/cups-1.1.20-r3 to /
	md5 src_uri ;-) cups-1.1.20-source.tar.bz2
	Unpacking source...
	Unpacking cups-1.1.20-source.tar.bz2
to /var/tmp/portage/cups-1.1.20-r3/work
 * Applying disable-strip.patch...
[ ok ]
 * Applying cups-1.1.20-str633.patch...
[ ok ]
 * Applying cups-1.1.20-zero-len-udp-dos.patch...
[ ok ]
 * Applying str920.patch...
[ ok ]
FATAL ERROR: Autoconf version 2.50 or higher is required for this script
 
!!! ERROR: net-print/cups-1.1.20-r3 failed.
!!! Function src_unpack, Line 36, Exitcode 2
!!! (no error message)

Perplejo, haces un "emerge search autoconf" y descubres que tienes instalada la versión 2.59. ¿Qué está pasando aquí?.

Pues un bug, evidentemente. Solo aparece si instalas desde Stage 1, no desde Stage 3 ni desde binarios. Lo que ocurre es que Gentoo instala realmente DOS versiones de Autoconf, la 1.13 y la 2.59 y los programas informan al compilador de cual necesitan manipulando una variable de entorno que se llama "WANT_AUTOCONF". El problema es que en versiones anteriores de Gentoo eran dos variables que se llamaban "WANT_AUTOCONF_2_1" y "WANT_AUTOCONF_2_5". Por error, el programa que comprueba eso (/usr/lib/autoconf/ac-wrapper.pl) busca la variable antigua, mientras que los programas informan con la variable nueva. Y claro, no se ponen de acuerdo.

La solución es copiar el fichero ac-wrapper.pl correcto, que es el que viene con el Stage 3, y que es capaz de distinguir la versión correcta de Autoconf que necesitan los programas sea cual sea la variable que usen, la antigua o la nueva.

Pero tampoco hace falta que busques más. Aquí tienes el fichero ac-wrapper.pl correcto para Gentoo 2004.2. Solo tienes que copiarlo a /usr/lib/autoconf/ac-wrapper.pl, con usuario root y permisos de lectura y ejecución y ya está. Ahora debería compilar todo sin problemas.

De nada.

Este truco está totalmente obsoleto, claro. Gentoo ya no debería compilarse desde Stage 1, solo desde Stage 3, si seguimos las recomendaciones oficiales. Y en cualquier caso, a estas alturas ya nadie debería estar instalando la versión 2004.2, ¿no crees?. ;-)

Pero como siempre hay algún rarito... :-D

  * *

Gentoo tarda demasiado en instalarse, y yo necesito el ordenador

Gentoo, si se instala como Dios manda (y no con binarios), necesita compilar TODO, desde cero. Y eso lleva tiempo. Unos tres días, si metes Gnome, KDE, Openoffice y todo lo que uno necesita a diario, en una máquina como mi jeanette.

Pero eso no significa que tengas inutilizado el ordenador durante ese tiempo. En realidad, Gentoo se instala en un entorno enjaulado (chroot), de tal forma que puedes seguir usando la máquina normalmente mientras el entorno enjaulado trabaja en segundo plano compilando e instalando Gentoo.

Si usas Windows lo tienes un poco más difícil, porque no tiene entornos enjaulados. Pero si ya tienes una distribución Linux en tu ordenador, instalar Gentoo en otra partición es tan poco traumático como crear un entorno enjaulado con chroot, y empezar a saltar Stages y poner a compilar a lo bestia. Durante tres dias, sí, pero solo en una ventana de terminal, sin necesidad de resetear en ningún momento, con lo que puedes seguir usando el ordenador sin problemas. La única precaución necesaria es no apagar el ordenador mientras compila. Solo tendrás que resetear, cuando el sistema Gentoo esté ya completamente compilado e instalado, incluso configurado y listo para usar.

En el momento que me pasaba a Gentoo, claudia trabajaba con Fedora Core 1 y mientras tanto yo podía estar modificando la Web con gvim y con Epiphany abiertos, en un escritorio Gnome. Vamos, que seguía trabajando como siempre. Y entretanto, en un gnome-terminal tenía un chroot con Gentoo, compilando todo el KDE. ¿El truco?. No hace falta ninguno, solo seguir las instrucciones del Gentoo Handbook, solo que con tu Linux de siempre, en lugar de arrancar con el CD de Gentoo.

Una vez instalado y funcionando, las actualizaciones de Gentoo son automáticas y en background. Puedes hacer que durante las noches compile las últimas novedades, de tal forma que tu sistema operativo esté siempre 100% actualizado.

¿Ves?. Ya no tienes excusa.


  • Sintaxis HTML 4.01 comprobada
  • Enlaces comprobados


Hecho con gvim * Hecho con CSS