Hiparco

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

Alojado en http://guimi.net

(Des)Activar Ctrl+Alt+Backspace en Gnome

Desde hace unas cuantas versiones, el escritorio Gnome no permite reiniciar el servidor X con la combinación Ctrl+Alt+Backspace.
Para rehabilitarla hay que ir al menú ‘Sistema->Preferencias->Teclado‘ y una vez ahí en la pestaña ‘Distribuciones’ seleccionar ‘Opciones’.

La opción que buscamos es ‘Key sequence to kill the X server‘:

Gnome, kill, X server

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

Solventar en OSCommerce eregi is deprecated

Si tienes OSCommerce y actualizas PHP, aparece el error “eregi is deprecated”.

Para solventarlo vamos al foro de OSCommerce, donde tenemos los parches.

Después siguiendo esta receta de cómo generar (diff) y aplicar (patch) parches, bajamos de github los parches, añadiendo “.patch” al URL y aplicar los parches.

$ wget https://github.com/osCommerce/oscommerce2/commit/79c601a7b3ee87943b92a5e6d77ce02480b49ffe.patch
$ wget https://github.com/osCommerce/oscommerce2/commit/88d550f392d86c02d2fe16d0b93f1de8aa6a6770.patch
$ wget https://github.com/osCommerce/oscommerce2/commit/1bfed2f6bf0e9c1c0ce4b160bce1e881cc6e6ef8.patch
$ wget https://github.com/osCommerce/oscommerce2/commit/15101263fa27b523139b405f99b1613c71a8e2c1.patch
$ wget https://github.com/osCommerce/oscommerce2/commit/bc2bcd9b1bd2148bf852409b3843543555bc01e2.patch
$ patch -p1 < 79c601a7b3ee87943b92a5e6d77ce02480b49ffe.patch
patching file catalog/admin/backup.php
patching file catalog/admin/cache.php
Hunk #1 succeeded at 91 with fuzz 2.
patching file catalog/admin/configuration.php
patching file catalog/admin/ext/modules/payment/sofortueberweisung/install.php
[...]
patching file catalog/admin/includes/functions/general.php
Hunk #1 FAILED at 939.
1 out of 1 hunk FAILED -- saving rejects to file catalog/admin/includes/functions/general.php.rej
[...]
patching file catalog/includes/modules/payment/paypal_express.php
Hunk #1 FAILED at 59.
1 out of 1 hunk FAILED -- saving rejects to file catalog/includes/modules/payment/paypal_express.php.rej
[...]

Si nos fijamos en esta parte de la salida:

patching file catalog/admin/includes/functions/general.php
Hunk #1 FAILED at 939.
1 out of 1 hunk FAILED -- saving rejects to file catalog/admin/includes/functions/general.php.rej

Vemos que al parchear el fichero "catalog/admin/includes/functions/general.php" en la línea 939 ha habido un error.
Tenemos más información en "catalog/admin/includes/functions/general.php.rej". Lo que hace patch en este casp es generar 3 ficheros:
- general.php es el fichero original CON los cambios que SÍ ha aplicado.
- general.php.orig es el fichero original.
- general.php.rej contiene los cambios que NO ha aplicado.
Así si el parche incluye varios cambios para un fichero puede ocurrir que unos cambios se apliquen y otros no.
En este caso no queda más remedio que revisar el cambio no realizado a mano.

Puede ocurrir que el archivo a parchear no exista. En ese caso tendremos solo dos ficheros:
- x.orig con 0 bytes, es copia del original. Como éste no existía, es un archivo en blanco.
- x.rej los cambios que no se han aplicado.
Basta con confirmar que es correcto que el fichero no exista. podría ocurrir que esté movido (revisar porqué), o que sea de un módulo del que no disponemos -lo habitual- (ignorar).

Igual con el resto de parches:

$ patch -p1 < 88d550f392d86c02d2fe16d0b93f1de8aa6a6770.patch
$ patch -p1 < 1bfed2f6bf0e9c1c0ce4b160bce1e881cc6e6ef8.patch
$ patch -p1 < 15101263fa27b523139b405f99b1613c71a8e2c1.patch
$ patch -p1 < bc2bcd9b1bd2148bf852409b3843543555bc01e2.patch
OSCommerce, OSC, github, eregi deprecated, patch,

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

Instalación de firmware en Debian

[Este apartado es un resumen de una entrada de Raphael Hertzog. Si el artículo todavía está disponible recomiendo ir al original.]

Una duda habitual al instalar un GNU/Linux es el tipo de procesador del que se dispone. En un PC con linux (por ejemplo arrancando con un Live-CD) podemos hacer:
$ grep “^flags” /proc/cpuinfo | grep -q ” lm ” && echo “amd64″ || echo “i386″

Puede ocurrir que al instalar Debian un equipo, una parte del hardware no funcione correctamente por falta del correspondiente firmware (o el uso de uno que no es totalmente adecuado). Una opción es obtener de Raphael Hertzog un disco de Debian con firmware.

Otra opción es realizar una instalación básica de Debian y posteriormente verificar el firmware necesario e instalarlo.
Si es necesario, pueden bajarse paquetes desde otro equipo desde la web de Debian.
Después se instala con # dpkg -i paquete

Si el equipo necesita algún firmware, durante la instalación, al actualizar el kernel o al hacer un update-initramfs aparecerán mensajes diciendo:
may require additional firmware” o “Failed to load firmware” o “Possible missing firmware“.
Podemos buscar más mensajes mediante:
# dmesg | grep firmware
# grep firmware /var/log/installer/*

Por ejemplo podemos encontrar:

e100: eth0: e100_request_firmware: Failed to load firmware "e100/d101m_ucode.bin": -2

El firmware que requiere el módulo e100 es:
$ modinfo -F firmware /lib/modules/2.6.32-5-amd64/kernel/drivers/net/e100.ko

e100/d102e_ucode.bin
e100/d101s_ucode.bin
e100/d101m_ucode.bin

Lo mejor es regenerar la imagen de inicio:
# update-initramfs

update-initramfs: Generating /boot/initrd.img-2.6.32-5-amd64
W: Possible missing firmware /lib/firmware/e100/d102e_ucode.bin for module e100
W: Possible missing firmware /lib/firmware/e100/d101s_ucode.bin for module e100
W: Possible missing firmware /lib/firmware/e100/d101m_ucode.bin for module e100

Una vez visto el firmware que nos falta averiguamos dónde obtenerlo y lo instalamos:
$ apt-cache search d101m_ucode.bin

firmware-linux-nonfree - Binary firmware for various drivers in the Linux kernel

# aptitude install firmware-linux-nonfree

Para ver todos los paquetes de firmware disponibles:
$ aptitude search firmware

El firmware se instala en:

  • /lib/firmware/$(uname -r)

  • /lib/firmware
  • /usr/local/lib/firmware
  • /usr/lib/hotplug/firmware

Configuración de sudo

Autorizamos algunos usuarios a realizar tareas administrativas
# vi /etc/sudoers

# DEFAULTS
# env_reset : resetea las variables de entorno antes de ejecutar
# insults : cuando te equivocas de contraseña
#+    te "insulta" irónicamente
# timestamp_timeout=5 : una vez pones la contraseña correctamente,
#+    no te la vuelve a pedir en 5 minutos (0 : pedir siempre)
# lecture=once : solo te avisa sobre la responsabilidad una vez por sesión
# passwd_tries=2 : permite 2 intentos para la contraseña
# rootpw : pide la clave de root en vez de la del usuario

Defaults env_reset, insults, timestamp_timeout=5, lecture=once, passwd_tries=2

# User alias specification
User_Alias ADMINS=guimi

# Cmnd alias specification
Cmnd_Alias APT = /usr/bin/apt-get, /usr/bin/dpkg, /usr/bin/aptitude
Cmnd_Alias APAGADO = /sbin/shutdown, /sbin/halt, /sbin/reboot
Cmnd_Alias RED = /usr/bin/kismet, /sbin/iwlist, /sbin/ifuop, /sbin/ifdown, /sbin/wpa_cli
Cmnd_Alias PROPIOS = /root/bin/SCRIPT1

# User privilege specification
root	ALL=(ALL) ALL
# Si el usuario admin esta en el grupo 'sudo' no le pedira clave
admin	ALL=(ALL) ALL

# Indicamos expresamente que no solicite clave para estos comandos
ADMINS ALL= NOPASSWD: APT
ADMINS ALL= NOPASSWD: APAGADO
ADMINS ALL= NOPASSWD: RED
ADMINS ALL= NOPASSWD: PROPIOS

sudo

Algunos paquetes interesantes en GNU/Linux

Todos los paquetes están disponibles en las principales distribuciones.

Servicios
apache2 Servidor web
cups-pdf Añade una impresora virtual CUPS que genera PDFs
mysql-server Servidor de bases de datos
openssh-server Servidor de ssh
openntpd Sincronizacion de reloj (servicio inseguro)
phpmyadmin Gestor PHP de MySQL
sane-utils xsane Herramientas para escáneres
vnc4server Servidor de vnc (X remoto)
Sistema y herramientas de línea de comandos
linux-image-686-bigmem Núcleo compilado para usar mucha RAM (>2GB).
linux-headers-`uname -r` Las cabeceras del núcleo. Necesarias para compilar módulos.
build-essential Paquete básico para compilar.
acct Grupo de herramientas para “auditar” login, procesos y comandos
apt-file El poder de APT orientado a los ficheros de los paquetes
dosfstools Utilidades para manejar FAT
less Paginador
lshw lsof usbutils Listan el HW, los ficheros abiertos, los dispositivos pci y los dispositivos usb
lynx w3mlinks2 Navegadores en consola
mc Midnight Commander. Gestor de ficheros para línea de comandos con muchas posibilidades
module-assistant modconf Configuradores (opcionales) de módulos
ip nmap nbtscan fping Herramientas / Analizadores de redes
iftop Monitoriza el uso de interfaces de red.
renameutils Utilidades de renombrado masivo. Incluye qmv, imv y qcp
screen Multiplexor de terminales (Gestor de conexiones)
testdisk Verificador de discos
tofrodos convmv Conversores. Por ejemplo:
$ convmv -f iso-8859-15 -t UTF-8 -r * –notest
Eso convertiria el nombre del fichero. Para convertir el contenido hay que usar iconv (viene en libc6):
$ iconv fichero.in -f iso-8859-15 -t utf-8 -o fichero.out
unrar-free Descompresor de rar
vim Vi IMproved
watch Ejecuta repetidamente un comando. Por ejemplo watch cat /proc/mdstat permite seguir la sincronizacion de un RAID.
zgv fbi Visores de imagenes en framebuffer
cowsay fortunes-es Citadores, a combinar con fortunecow.sh
vrms Muestra los paquetes no libres instalados en el sistema
imagemagick Manipulación de imágenes desde la línea de comandos
pdftk Manipulación de PDFs desde la línea de comandos
console-data console-tools Permiten ajustar los parámetros de la consola
Otras herramientas simples de hack como arping, bmon, icmpinfonetstat-nat, cutter, sacnlogd, MTR, bing Un articulillo sobre herramientas simples de hack en epzylon
Herramientas de Escritorio
alacarte Editor de menús de Gnome
gdm-themes Temas de entrada del gestor de inicio de Gnome
gnome-audio Sonidos de Gnome
gnomebaker k3b Grabadores de CD/DVD
gftp Cliente FTP
gsfonts-other ttf-freefont Fuentes para GUI
gthumb Visor de imagenes mejor que el que viene por defecto en Gnome
gtodo Sencillo gestor de tareas
iceweasel iceweasel-gnome-support iceweasel-l10n-es-es Navegador web
icedove icedove-gnome-support icedove-l10n-es-es iceowl iceowl-extension Cliente de correo-e y calendario
openoffice.org openoffice.org-l10n-es openoffice.org-help-es openoffice.org-gtk openoffice.org-kde Paquete ofimático en español
xplanet xplanet-images Genera imagenes del sistema solar. Incluye salvapantallas.
xplanet -vroot -wait 1 -timewarp 90000 -label -origin moon
Herramientas multimedia
amarok EL reproductor de música
BIG (blender, inkscape, gimp (+plugin pandora)) Diseño gráfico.
liblame0 gstreamer0.10-lame Librerias MP3
lsdvd Describe un dvd
kino Permite pasar videos de una cámara al ordenador.
dvdstyler Permite crear DVDs
k9copy Copias de DVD de video
soundconverter flac lame mp3splt audacity Herramientas de audio
tagtool id3ed Gestion de etiquetas ID3 (mp3) (grafico y comando)
xine-ui mplayer libdvdcss w32codecs/w64codecs transcode avidemux subtitleeditor lsdvd mencoder Herramientas de video

Configurar juego de caracteres (charset) en LAMP (Linux, Apache, MySQL, PHP)

Instalamos los paquetes necesarios:
# aptitude install apache2 mysql-server php5

Modificamos la configuración de apache:
# vi /etc/apache2/conf.d/charset

...
AddDefaultCharset       UTF-8
...

Modificamos la configuración de PHP:
# vi /etc/php5/apache2/php.ini

...
default_charset = "utf8"
...

En la cabecera de las páginas indicar:

...
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...

Y en los scripts PHP de conexión:

...
$sql_script("SET NAMES 'utf8'");
...

Modificamos la configuración de MySQL:
# vi /etc/mysql/my.cnf

...
language    = /usr/share/mysql/spanish
...

Y reiniciamos los servicios:
# /etc/init.d/apache2 restart
# /etc/init.d/mysql restart

En caso de tener una BB.DD. en otra codificación como iso-8859-1, conviene exportarla a un fichero de texto, convertir el fichero con “iconv bbdd.sql -f iso-8859-15 -t utf-8 -o bbdd_utf8.sql” y volver a importarla.

juego de caracteres, charset, Linux, Apache, MySQL, PHP