Este post se lo dedico a Luis que, con razón, siempre me pide que explique las cosas 🙂

Cuando te tienes que mover mucho entre servidores, uno de los principales problemas es tener que introducir el contraseña del usuario en el servidor al que te conectas. Este proceso se puede evitar de forma sencilla mediante partes de claves y ssh. Esto no te evita tener que usar una contraseña, pero será únicamente una y tienes que elegirla lo más robusta posible (para este post, la contraseña que tú elijas viene representada por AQUITUCONTRASEÑA).

Los pasos son los siguientes.

Crear el par de claves.

$ ssh-keygen -t dsa -f ~/.ssh/id_dsa
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): AQUITUCONTRASEÑA
Enter same passphrase again: AQUITUCONTRASEÑA
Your identification has been saved in ~/.ssh/id_dsa.
Your public key has been saved in ~/.ssh/id_dsa.pub.
The key fingerprint is:
60:92:6a:6e:48:b1:1a:2d:ae:51:9b:04:8a:9f:4c:6d tatai@localhost

Esto genera dos ficheros: ~/.ssh/id_dsa y ~/.ssh/id_dsa.pub que son la clave privada y la clave pública respectivamente.

Ahora tenemos que copiar la clave pública en el servidor remoto (podremos copiar la clave en tantos servidores como nos haga falta). Para ello, teniendo en cuenta que queremos acceder a server.com con el usuario user, usamos el siguiente comando:

$ ssh-copy-id -i ~/.ssh/id_dsa user@server.com

Tras este comando, el sistema pedirá (por última vez) la contraseña del servidor para ese usuario.

Una vez tengas estos dos pasos hechos, verás como si intentas realizar una conexión ssh al servidor:

$ ssh user@server.com

Entrarás directamente, sin que te pida contraseña.

No sólo podrás realizar sesiones ssh (o ejecución de comandos mediante ssh), sino que también podrás usar scp, sftp, etc… y sin tener que introducir la contraseña.

Por último, comentar un par de cosas con respecto a todo este proceso. Lo primero es que se necesita un denominado agente de sesión ssh que se encarga de cachear las claves. Este agente se puede llamar mediante el comando ssh-agent. Por defecto, los gestores gráficos (gdm, kdm, etc) lo instancian al arrancar y por eso, mientras uses tu máquina y usuario en el entorno gráfico, no tendrás que llamarlo, pero en el caso de que te conectes a tu máquina, en general, no tendrás este agente ni tendrás clave autentificada. En este caso, tendrás que ejecutar los siguientes comandos:

$ ssh-agent bash
$ ssh-add ~/.ssh/id_dsa
Enter passphrase for ~/.ssh/id_dsa: AQUITUCONTRASEÑA

El primero de los comandos abre una consola bash con el agente de sesión ssh y con el segundo, añadimos la clave anteriormente creada de modo que el sistema nos considera autentificado.

Y ya para finalizar, comentar que puedes disponer de varios pares de claves, cada uno con su correspondiente contraseña, método de encriptación (rsa o dsa), número de bits, etc. Tan sólo es necesario cambiar el nombre del fichero que se usa. Se recomienda crearlos todos bajo el directorio .ssh en nuestra cuenta.

Update (2010-02-04): gracias a Mariotux que me ha avisado que tení­a mal algunas llamadas ( s/rsa/dsa/g :p)