Hiparco

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

Alojado en http://guimi.net

Background / Foreground jobs – gestión de trabajos en fondo

Para pasar un trabajo al fondo (background) podemos pulsar Ctrl+z durante su ejecución y detenerlo:

$ sleep 10
^Z
[1]+  Detenido                sleep 10

También podemos ejecutarlo directamente en background con “&”:

$ sleep 10 &
[1] 5166

Otra opción es ejecutarlo modificando su prioridad con “nice” y “renice”:

$ nice
0
$ nice sleep 10 &
$ nice -n 5 ls
# nice -n -2 ls
$ renice +1 [PID]

Para ver el listado de trabajos en background:

$ jobs
[1]+  Detenido                sleep 10
[2]-  Ejecutando              sleep 10 &

Atención Como se ve, no es lo mismo detenerlo y dejarlo en background, que ejecutarlo en background.

Siguiendo el ejemplo, pasados 10 segundos, cuando ejecutemos cualquier comando, o pulsando intro nos dice:

$
[2]-  Hecho                   sleep 10

Pero el primero sigue en espera:

$ jobs
[1]+  Detenido                sleep 10

Podemos matarlo y terminarlo con:

$ kill %1
[1]+  Terminado               sleep 10

O podemos recuperarlo con:

$ fg %1
sleep 10

Gestión de paquetes en Debian

Recordemos que la gestión de paquetes de Debian se basa en la lista de fuentes que hay en:

/etc/apt/sources.list

Además, dependiendo de las acciones a realizar puede ser necesario disponer de permisos de administrador.

Hay programas que ayudan a gestionar los paquetes en modo texto, como:

dselect
tasksel
aptitude

En modo gráfico tenemos:

synaptic
gsynaptic

En modo comando existen muchos (apt-cache, apt-get, dpkg, apt-file…), pero casi todo se puede hacer con aptitude.

Ejemplos para buscar, instalar, desinstalar y eliminar absolutamente un paquete.

$ aptitude search bittorrent
# aptitude install bittorrent
# aptitude remove bittorrent
# aptitude purge bittorrent

Para mantener el sistema actualizado, utilizamos:

# aptitude update && aptitude safe-upgrade -y

A continuación veremos algunas funciones menos utilizadas.

Mostrar información de un paquete

$ aptitude show bittorrent
Paquete: bittorrent                              
Estado: instalado
Instalado automáticamente: sí
Versión: 3.4.2-11.3
Prioridad: opcional
Sección: net
Desarrollador: Michael Janssen 
Tamaño sin comprimir: 602 k
Depende de: python (>= 2.3), python-support (>= 0.90.0), lsb-base (>= 3.0-10)
Recomienda: mime-support
Sugiere: bittorrent-gui
Descripción: Original BitTorent client - console tools
 BitTorrent is a tool for distributing files. It's extremely easy to use - downloads are started by clicking on hyperlinks. Whenever more than one person is downloading at once they send
 pieces of the file(s) to each other, thus relieving the central server's bandwidth burden. Even with many simultaneous downloads, the upload burden on the central server remains quite
 small, since each new downloader introduces new upload capacity. 
 
 This package contains the tools which are used for console-only downloading.  If you want the GUI interface, install the bittorrent-gui package. 
 
 Homepage: http://bitconjurer.org/BitTorrent/

Averiguar a qué paquete pertenece un archivo del sistema.

$ dpkg -S stdio.h
     libc6-dev: /usr/include/stdio.h
     libc6-dev: /usr/include/bits/stdio.h
     perl: /usr/lib/perl/5.6.0/CORE/nostdio.h

Averiguar qué ficheros proporciona un paquete instalado en el sistema.

$ dpkg –listfiles bittorrent

Averiguar qué ficheros proporciona un paquete, esté instalado o no en el sistema.

$ apt-file list bittorrent
bittorrent: /usr/bin/btcompletedir.bittorrent
bittorrent: /usr/bin/btdownloadcurses.bittorrent
bittorrent: /usr/bin/btdownloadheadless.bittorrent
...



Para solucionar problemas ocurridos durante la instalación de paquetes podemos utilizar synaptic (Filtros > rotos) o en modo comando:

dpkg –configure -a
apt-get -f install
aptitude autoclean
aptitude autoremove



Si tras intentar todo lo anterior hay un paquete que no hemos podido instalar y que ya no queremos instalar, pero que el sistema nos dice cada vez que usamos apt-get/aptitude “Se encontraron errores al procesar (paquete)”, editamos

/var/lib/dpkg/status

y borramos la información relativa al paquete.

Para instalar un paquete descargado:

dpkg -i paquete.deb

Para instalar un paquete descargado, con todas sus dependencias:

gdebi paquete.deb


Modificar fecha y hora de fotos con jhead

Podemos modificar la fecha y hora de varias fotos. Esto es muy útil si nos damos cuenta de que la fecha y hora de la cámara estaba mal y queremos corregirla, por ejemplo para después renombrar fotos en base a la fecha de la cabecera Exif.

Por ejemplo, quitarle una hora y 9 minutos:
$ jhead -ta-1:09 *.jpg
Por ejemplo, sumarle dos hora y 15 minutos:
$ jhead -ta+2:15 *.jpg

Podemos ver como trabajar con imágenes desde el prompt y un script para procesar fotos.

jhead, prompt, fotos, jpg, imágenes

Uso de scp

El uso de scp es muy similar al de ssh (Uso de ssh).
El único parámetro “importante” que cambia es el que indica el puerto, que en ssh es -p y en scp es -P. Todavía no entiendo el porqué de este cambio tan molesto.

El uso es muy similar a cp pero indicando el equipo remoto.

Para copiar el fichero local “prueba” en el equipo remoto (servidor) usamos:

$ scp prueba servidor:.

El fichero se copiará en la carpeta inicial del usuario en el servidor (generalmente ‘/home/usuario/’).

Podemos indicar rutas relativas a la carpeta inicial o absolutas.
Para copiar el fichero “documentos/prueba” del servidor al equipo local usamos:

$ scp servidor:documentos/prueba .

Ahora, usando parámetros de ssh/scp:

$ scp -P 10022 -i .ssh/id_dsa *.tgz usuario@servidor:/ruta/fichero

Otros artículos relacionados:
Configuración de ssh
Confianza ssh
Túneles SSH
Uso de ssh
sshfs – Montando recursos mediante SSH y FUSE

ssh, scp

Uso de ssh

En esta entrada resumiré los diferentes usos del cliente ssh que han ido apareciendo en otras entradas.
Para configurar un servidor ssh se puede consultar: Configuración de ssh.

El uso más sencillo del cliente ssh es:

$ ssh servidor

Esto nos abre una sesión remota interactiva con servidor.
Estamos dando por supuesto que el usuario del equipo remoto tiene el mismo nombre que nuestro usuario local y que el servidor ssh está escuchando en el puerto estándar (22).
Para indicar el usuario del servidor hacemos:

$ ssh usuario@servidor

Algunos parámetros útiles:

-p puerto
Indica el puerto del servidor ssh al que conectarse (puerto)
-i fichero
utiliza el fichero de claves fichero para autenticar la conexión, en vez de usuario/password (ver Confianza ssh)
-X
Indica que queremos utilizar nuestro servidor X para las aplicaciones gráficas (ver Túneles SSH)
-L puerto_local:maquina3:puerto_maquina3
Realiza un túnel entre puerto_local y maquina3:puerto_maquina3 (ver Túneles SSH)
-R puerto_remoto:maquina3:puerto_maquina3
Realiza un túnel entre servidor:puerto y maquina3:puerto_maquina3 (ver Túneles SSH)
-N
Sin conexión interactiva (útil en Túneles SSH)
-f
En segundo plano (útil en Túneles SSH). Al acabar puede usarse, por ejemplo $ killall ssh

Por ejemplo con ficheros de claves, puerto no estándar, usuario diferente del local y varios túneles:

$ ssh usuario@servidor -p 10022 -i .ssh/id_dsa -X -L 18070:localhost:8070 -L 5555:localhost:5901

Otros artículos relacionados

Configuración de ssh
Confianza ssh
Túneles SSH
Uso de scp
sshfs – Montando recursos mediante SSH y FUSE

ssh
 

Túneles SSH

Podemos usar SSH para generar túneles seguros. Estos túneles ssh establecen una conexión cifrada entre un puerto de nuestra máquina local y otro puerto accesible desde la máquina remota, generalmente un puerto local de la máquina remota, pero no necesariamente.

Puede ver como configurar un servidor ssh [Configuración de ssh], de confianza ssh, usos básicos de ssh [Uso de ssh] y scp [Uso de scp].

Túnel directo

Si queremos conectar con un servidor MySQL de una maquina remota “servidor” sin usar ssh conectaremos con nuestro cliente de base de datos al puerto 3306 del servidor. El problema es que toda la comunicación es insegura y viaja en claro.
Si “servidor” dispone de ssh podemos generar un túnel ssh para proteger la comunicación. Lo que hacemos es “conectar” un puerto de nuestra máquina local, por ejemplo 13306 con el puerto 3306 de “servidor”. Después conectamos nuestro cliente de base de datos al puerto local 13306 y ssh se encargará de comunicar con “servidor” de manera segura.

Para hacer este primer túnel sencillo hacemos:

$ ssh servidor -L 13306:localhost:3306

Esto indica que el puerto 13306 de la máquina local (cliente) se dirige al puerto que servidor conoce como “localhost:3306″; esto es el puerto local 13306 apunta al puerto 3306 de “servidor”.

También podemos complicar un poco el comando ssh para usar ficheros de claves (http://guimi.net/blogs/hiparco/confianza-ssh/) que es lo recomendado, mediante -i; para indicar el usuario de la máquina “servidor” si no coincide con el usuario de la máquina local; para indicar el puerto ssh del servidor (si no utiliza el puerto por omisión: 22).
Esta vez generaremos un túnel para el puerto 5432 (el puerto habitual de PostgreSQL) desde el puerto local 5555:

$ ssh usuario@servidor -p x -i id_dsa_copiada -L 5555:localhost:5432

El puerto 5555 de la máquina local (cliente) se dirige al puerto que servidor conoce como “localhost:5432″; esto es el puerto local 5555 apunta al puerto 5432 de “servidor”.

Túnel a una tercera máquina

Supongamos que “servidor-ssh” y “servidor-svn” son dos máquinas de una red local. Uno tiene ssh y otro svn. Nos interesa desde internet conectar de forma segura al servidor de svn:

$ ssh servidor-ssh -L 3690:servidor-svn:13690

El puerto 3690 de la máquina local (cliente) se dirige al puerto que servidor-ssh conoce como “servidor-svn:5432″; esto es el puerto local 5555 apunta al puerto 5432 de la máquina que servidor-ssh conoce como “servidor-svn”. Es importante remarcar que el nombre “servidor-svn” lo resuelve “servidor-ssh”, no nuestro cliente local, por tanto puede ser la IP de la red local o un nombre que sea capaz de resolver “servidor-ssh”.

Con esto establecemos una conexión segura hasta “servidor-ssh” que a su vez conecta en claro (por la red local) con “servidor-svn”. De esta forma si utilizamos un cliente SVN para conectar con el puerto local 13690, la información estará viajando protegida por el túnel ssh hasta “servidor-ssh” y después en claro hasta “servidor-svn”.
Esto permite que “servidor-svn” no tenga ninguna conexión directa con el exterior y esté más protegido.

Túnel inverso

Aunque menos utilizado puede interesarnos que un puerto del equipo “servidor-ssh” se redirija a un puerto a través de nuestra máquina local:

$ ssh servidor -R 13690:localhost:3690

De esta manera todas las conexiones al puerto 13690 de “servidor” será redirigidas al puerto “localhost:3690″ de la máquina local.
También se puede hacer por tanto:

$ ssh servidor -R 13690:otra-maquina:3690

El puerto 13690 de la máquina “servidor” se dirige al puerto que nuestra máquina local conoce como “otra-maquina:3690″; esto es el puerto servidor:13690 apunta al puerto que nuestra máquina local conoce como “otra-maquina:3690″. Es importante remarcar que el nombre “otra-maquina” lo resuelve nuestra máquina local.

Túnel no interactivo

Podemos usar la opción -N para que no se abra una conexión interactiva (una consola remota) y podemos usar -f para que el cliente ssh pase a en segundo plano. De esta forma si solo queremos hacer el túnel es más cómodo. Por ejemplo para habilitar un túnel a un servidor de OpenERP:

$ ssh servidor -N -f -L 18070:localhost:8070

Túnel de las X (servidor gráfico)

Aquí trataremos algo totalmente diferente a todo lo anterior. En principio, cuando abrimos una terminal remota mediante ssh “solo” podemos utilizar comandos sin GUI y no aplicaciones gráficas. Podemos pedirle a ssh que para la sesión abierta utilice nuestras X locales (si las tenemos, claro) como servidor gráfico. Así podemos lanzar comandos con GUI, es decir aplicaciones gráficas, que se ejecutarán en el servidor pero las veremos en nuestra máquina local.

$ ssh servidor -X

Varios túneles a la vez

Pueden generarse varios túneles a la vez, por ejemplo:

$ ssh servidor -X -L 18070:localhost:8070 -L 5555:localhost:5901

O con ficheros de claves, puerto no estándar y usuario diferente del local:

$ ssh usuario@servidor -p 10022 -i .ssh/id_dsa -X -L 18070:localhost:8070 -L 5555:localhost:5901

Otros artículos relacionados

Configuración de ssh
Confianza ssh
Uso de ssh
Uso de scp
sshfs – Montando recursos mediante SSH y FUSE

ssh, túnel, túneles ssh

Crear un DVD a partir de archivos de vídeo

Para crear un DVD a partir de archivos de vídeo puede ser interesante preparar primero el vídeo. Recordatorio: uso de mencoder.

Una vez tenemos el vídeo en formato avi usamos ffmpeg:

$ ffmpeg -i my_video.avi -target dvd -aspect 16:9 -sameq my_dvd_video.mpg

Preparamos el DVD en una carpeta, llamada en un alarde de originalidad “DVD”:

$ dvdauthor --title -f my_dvd_video.mpg -o DVD
$ dvdauthor -T -o DVD

Con esto generamos un DVD en la carpeta DVD y ya podemos grabarlo físicamente, generar una iso o lo que deseemos.

Para saber que formatos admite nuestro ffmpeg:

$ ffmpeg -formats
ffmpeg, video, dvdauthor, dvd

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 -f best 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

La opción “-f best” permite descargar la versión con el formato de vídeo de mejor calidad. Si queremos descargar solo el audio podemos hacer,
OGG:

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

MP3:

$ clive --exec="ffmpeg -i %i %i.mp3;" -e http://www.youtube.com/watch?v=oHg5SJYRHA0

Nota: has sido rickrolleado ;-)

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 ficheros de claves pública/privada de ssh (confianza ssh), ni modificar el puerto de ssh, ni en definitiva usar toda la potencia de ssh.
El sistema directo para configuraciones sencillas de ssh es:
$ svn co svn+ssh://servidor/proyecto
Pero si el servidor está configurado con un mínimo de seguridad esto no es suficiente (Configuración de ssh).

Sin embargo hay una forma casi igual de sencilla usando los túneles SSH que nos permite toda la funcionalidad y potencia de SSH (claves ssh, puerto…).
Primero, desde el cliente, hacemos un túnel ssh desde el puerto 3690 del servidor al puerto 3690 de la máquina local (cliente). En este ejemplo modificamos el puerto y utilizamos claves ssh:
$ ssh usuario@servidor -p xx -N -f -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. [Túneles SSH]

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