Trucos

He aquí unos cuantos trucos, principalmente para GNU/Linux.

Pasar de fecha en formato 'UNIX' (epoch) a fecha normal
date -d "1970-01-01 1064435867 sec"
Fallo de djbdns al compilar (errno)
Editar error.h, borrar extern int errno; y añadir en su lugar #include <errno.h>
rsync sobre ssh
rsync -avz -e ssh <em>directorio</em>
  <em>usuario@servidor</em>:/ruta/remota
Usar las teclas de windows en Linux
Para ello debemos decirle a XFree que usamos un teclado de 105 letras en XF86Config. Buscamos por XkbModel y le decimos pc105.
Después de esto, crearemos en nuestro $HOME un fichero llamado por ejemplo .Xmodmap, en el que introduciremos lo siguiente:
keycode 115 = Super_L
keycode 116 = Super_R
keycode 117 = Menu
Ahora toca meter un xmodmap ~/.Xmodmap en nuestro ~/.xinitrc, ~/.xsession o el que usemos, y listo. No he conseguido hacer funcionar bien del todo la tecla de la derecha como Hyper_R en vez de Super_R, si alguien lo ha conseguido en condiciones... agradecería una ayuda.
Cambiar en vim todos las tabulaciones por espacios
:set expandtab
:retab
Evitar que al pegar en mozilla/firefox/etc con el botón del medio del ratón en la ventana, se interprete lo pegado como URL
Hay que abrir about:config, y modificar la opción middlemouse.contentLoadURL para ponerla a false.
Pegar con el teclado
En vez de pulsar el botón central del ratón, se puede pulsar la combinación de teclas Shift+Insert para obtener el mismo efecto.
SpamAssassin, spamd y spamc con opciones para cada usuario
Se debe arrancar spamd de la siguiente forma: spamd -d --user-config --pidfile=/fichero/pid/ Luego basta con llamar a spamc desde procmail, maildrop o lo que usemos.
Convertir a HTML código fuente y colorearlo
Para ello podemos usar enscript o Source-highlight. El primero está más extendido y suele estar instalado en la mayoría de distribuciones por defecto.
En enscript, podemos usar la siguiente orden:
 enscript --highlight=lenguaje(c,bash...) -o salida.html \
 --language=html --color fichero_con_códigofuente
 
Con source-highlight, podríamos ejecutar lo siguiente:
  source-highlight --src-lang=lenguaje(c,bash...) \
  --out-format=html --input fichero a colorear \
  --output salida.html 
 
Parar un servicio gestionado por supervise
Debemos realizar los siguientes pasos:
  • cd /service/nombre
  • rm /service/nombre
  • svc -dx . log
  • Confirmar mediante svstat . log que supervise ya no gestiona ese directorio
  • Si falla lo anterior, svc -kx . log
Reemplazar una cadena en múltiples ficheros
Hacerlo con perl es muy sencillo: perl -pi -e "s/antiguo/nuevo/g;" *
Formatear un disco como FAT32 sin mkfs.vfat
Hay que hacerlo con mkfs.msdos:
     mkfs.msdos -F 32 /dev/fd0
   

Activar bloqueo numérico al arrancar las X

Muchos nos habremos dado cuenta de que el bloqueo numérico no se activa automáticamente al arrancar las X Window, por lo que debemos hacerlo de forma manual una y otra vez.

Buscando en Google una solución al problema, encontré un mensaje publicado en un foro de Fedora. Lo que hay que hacer es bastante sencillo.

Nos bajamos este programita en C, al que yo he llamado numlockx. El código del mismo es el siguiente:

#include <X11/extensions/XTest.h>
#include <X11/keysym.h>

int main(void)
{
        Display* disp = XOpenDisplay(NULL);
        if (disp == NULL)
                return 1;
        XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_Num_Lock),
                        True, CurrentTime);
        XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_Num_Lock),
                        False, CurrentTime);
        XCloseDisplay(disp);
        return 0;
}

Lo compilamos mediante la siguiente orden:

gcc -I/usr/X11R6/include -L/usr/X11R6/lib \ -o numlockx numlockx.c -lX11 -lXtst

Ahora sólo tendremos que colocar el ejecutable numlockx en el directorio que queramos, y añadir a nuestro ~/.xinitrc, por ejemplo, una línea en la que ejecutemos el programa.

Bloquear dominios con djbdns

Diría que lo que voy a explicar a continuación es consecuencia de haberme planteado si es ético que se espíen las páginas web que visito con técnicas rastreras, pero realmente me he puesto manos a la obra por otro motivo.

doubleclick.net hoy no funcionaba, y las páginas que tenían algún tipo de treta de las que usa no terminaban de cargar en mi navegador. Para el que no lo sepa, doubleclick es una ¿empresa? que introduce imágenes en blanco, pequeñas funciones javascript, etc. en páginas web a cambio de una cantidad de dinero y que están destinadas a hacer estadísticas comerciales y mostrar publicidad.

Como además de esto, hoy doubleclick no funcionaba, he aprovechado para bloquear el dominio en mi ordenador.

El artículo explica cómo instalar un servidor tinydns sólo para esto, aunque como yo ya lo tenía instalado no me hizo falta. En mi caso ha sido un simple:

# cd /etc/tinydns/root
# echo ".doubleclick.net:" >> data
# make
# cd /etc/dnscache/root/servers
# echo "192.168.1.69" > doubleclick.net
# svc -dx /service/dnscache
# svc -u /service/dnscache

Y todo solucionado:

$ host ad.es.doubleclick.net                                      
Host ad.es.doubleclick.net not found: 3(NXDOMAIN)

Limpiar readproctitle en daemontools

En la utilidad daemontools hay una aplicación llamada readproctitle. Su finalidad es presentarnos algunos errores en el nombre del proceso. Ahora veremos cómo limpiar el texto que aparece, para no confundirnos leyendo un error que ya no se da pero que sigue ahí.

Podemos ver el error que existe observando la lista de procesos con ps. Normalmente aparecerá el proceso readproctitle seguido de varias líneas de puntos.

Si hay algún error, en cambio, aparecerá un texto descriptivo. Un ejemplo de este caso es el siguiente:

turing:/service# ps aux|grep readproctitle
readproctitle service errors: ...o /var/log/qmail/smtpd/current, pausing: out of disk space?......

Supongamos que ya hemos solucionado el problema (en este caso habernos quedado sin espacio en disco 0:) ¿cómo podemos limpiar ese texto?

Encontré este truco en alguna web que no recuerdo, pero consiste básicamente en crear un nuevo servicio, por ejemplo readproctitle-clean, con el siguiente fichero run, al que deberemos dar permisos de ejecución.

#!/bin/sh
svc -d .
exec 1>&2
echo -n '..................................................'
echo -n '..................................................'
echo -n '..................................................'
echo -n '..................................................'
echo -n '..................................................'
echo    '..................................................'

sleep 2
exit 0

Cada vez que queramos limpiar el texto de readproctitle, habrá que activar el servicio mediante svc -u /services/readproctitle-clean.

PHP y nullmailer

Esta tarde hice una instalación de Apache 2.0.55 y de PHP 5.1.2, y tras instalar Drupal vi que obtenía un error diciendo que mail() no existía.

En php.net se puede ver que quizás no haya detectado el ejecutable de sendmail en tiempo de compilación.

Tiene su lógica, ya que uso nullmailer como pseudo-sendmail, que coloca su ejecutable en /usr/local/sbin/sendmail. La solución ha sido sencilla:

  1. Entrar al directorio donde tengamos los fuentes de php
  2. echo '#define HAVE_SENDMAIL 1' >> main/php_config.h
  3. Compilar e instalar de nuevo php
  4. Editar /usr/local/lib/php.ini y especificar la opción: sendmail_path = /usr/local/sbin/sendmail -t -i

SSH y Message too long

Existe un problema bastante recurrente a la hora de conectar mediante sftp/scp a una máquina. Es el fatídico:

mandarina:~ jorge$ sftp maquina
Connecting to maquina...
jorge@maquina's password: 
Received message too long 538976288

Es tan habitual que mucha gente se pregunta qué ocurre, y descripciones del problema hay a puñados. ¿Qué ocurre y cómo se soluciona?

Lo que ocurre es que al acceder mediante sftp o scp, el sistema ejecuta el fichero ~/.bashrc que tengamos, y si éste muestra texto por pantalla, nuestro cliente ssh recibe "basura" y falla. La solución es simple: organizar nuestro ~/.bashrc en dos partes. La primera contendrá todas aquellas órdenes que no produzcan salida por pantalla, mientras que la segunda contendrá el resto de órdenes.

Luego basta con encerrar esta segunda parte en un condicional como el siguiente:

if [ "$TERM" != "dumb" ]; then
 # Instrucciones que producen salida por pantalla
fi

Y ya está: cada vez que conectemos mediante sftp o scp, no se ejecutará esa segunda parte y no fallará el proceso.

Referencia: Received message too long solution

Salir de telnet

¿No os ha pasado que estando conectados mediante telnet a algún sitio habéis querido salir y la única forma que os ha venido a la cabeza ha sido cerrar la ventana de terminal, si es que tenemos la suerte de estar haciéndolo en un terminal?

Pues hoy he encontrado la forma de hacerlo: pulsar Ctrl + Alt Gr + ç.

Lo encontré en el wiki de Catsec.