Hasta hace poco no había necesitado trabajar con Subversion, un sistema de control de versiones diseñado para trabajar con grandes proyectos de software. Pero la hora ha llegado y ahora digo: “¡¿Por que demonios no lo usaba antes?!”.
A lo que vamos. Supondré que el servidor SVN está instalado y que cuentas con acceso SSH a él. Te han dicho que para empezar a trabajar en el proyecto es por medio de SSH (que es un tanto inusual, normalmente se usa el protocolo svn o http) de la siguiente forma:
svn checkout svn+ssh://usuario@xxx.xxx.xxx.xxx/ruta/de/tu/proyecto
SSH te pedirá tu contraseña y listo. Pero, ¿tenemos que introducir la contraseña cada vez que hacemos un commit, update, add…? Si, es parte de la fuerte seguridad que ofrece, sin embargo tambien existe una manera de configurar el servidor y el cliente para no tener que hacerlo siempre.
Normalmente el acceso SSH es por el puerto 22 pero si no es el caso, te puedes ahorrar escribir siempre los mismos datos (como el nombre de usuario, el puerto) predefiniendolos en el archivo: ~/.ssh/config. Detalles aquí: Getting started with SSH. La ventaja sería la siguiente:
# Conectarse con SSH sin el archivo ~/.ssh/config ssh usuario@xxx.xxx.xxx.xxx -p 2222 # Conectarse con SSH con ~/.ssh/config ssh xxx.xxx.xxx.xxx # Conectarse con SSH con ~/.ssh/config y agregando un dominio local a la IP en /etc/hosts ssh mi_servidor # En cualquier de los casos, nos pedirá la contraseña despues de introducir el comando.
Se trata de hacer esto más fácil, ¿no? Si configuras el archivo ~/.ssh/config, te evitas escribir siempre el nombre de usuario y el puerto que usas.
Tambien puedes agregar la IP de tu servidor en el archivo /etc/hosts es aún más fácil, por que aquí es donde se pueden dar de alta dominios locales para tu equipo. La 127.0.0.1 está normalmente asignada al dominio localhost, de modo que cuando hacemos ping localhost, el sistema apuntará a 127.0.0.1. Entonces, tu podrías asignarle a tu IP xxx.xxx.xxx.xxx al dominio julia y cuando hagas ping Julia, te apuntará a la IP que diste de alta.
Ahora tenemos que crear las claves SSH para no tener que volver a escribir la contraseña, cosa que se vuelve molesto con el tiempo. Esto lo logramos con el siguiente comando:
ssh-keygen -t dsa -f ~/.ssh/id_dsa -C "Escribe aquí un comentario sobre la clave."
Despues tenemos que envíar es clave al servidor donde se encuentra el proyecto, vía SSH:
cat ~/.ssh/id_dsa.pub | ssh xxx.xxx.xxx.xxx "cat - >> ~/.ssh/authorized_keys"
Lo anterior es una serie de comandos que básicamente, lee el contenido del archivo local ~/.ssh/id_dsa.pub, luego ejecuta un comando vía SSH para insertar esa lectura en el archivo del servidor ~/.ssh/authorized_keys.
Esto lo puedes hacer manualmente: abres el archivo local, copias el contenido, te conectas al servidor y lo guardas en la ruta especificada. Es lo mismo, solo que lo he hecho en un solo comando :) En ambos casos, para comprobar que esto te ha funcionado, prueba conectarte por SSH:
# "mostro" apunta a 192.168.1.100, usuario, contraseña y puerto estan predefinidos. ssh mostro
Si despues de esto te conectas automáticamente a tu servidor sin escribir la contraseña, entonces vas por buen camino y si eres usuario de Ubuntu, aquí termina el tutorial para ti. Solo prueba:
svn list svn+ssh://mostro/svn/proyecto
Te pedirá la contraseña la primera vez y despues dejará de molestar. Si esto no es así, tendrás que hacer algunos pasos extra- Deberás configurar el ssh-agent.
Si usas Linux (una distro antigua), tendrás que editar ~/.profile para agregar el siguiente código:
SSH_ENV=$HOME/.ssh/environment function start_agent { echo "Initialising new SSH agent..." /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV} echo succeeded chmod 600 ${SSH_ENV} . ${SSH_ENV} > /dev/null /usr/bin/ssh-add; } # Source SSH settings, if applicable if [ -f "${SSH_ENV}" ]; then . ${SSH_ENV} > /dev/null #ps ${SSH_AGENT_PID} doesn’t work under cywgin ps -ef | grep ${SSH_AGENT_PID} | grep ssh- agent$ > /dev/null || { start_agent; } else start_agent; fi
Si utilizas Mac, tendrás que editar el archivo ~/.login con este código:
set sshAgent=/usr/bin/ssh-agent set sshAgentArgs="-c" set tmpFile=~/.ssh/ssh-agent-info # # Check for existing ssh-agent process # if ( -s $tmpFile ) source $tmpFile if ( $?SSH_AGENT_PID ) then set this=`ps -elf | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null` # start ssh-agent if status is nonzero if (( $? != 0 ) && ( -x "$sshAgent" )) then $sshAgent $sshAgentArgs | head -2 > $tmpFile source $tmpFile echo "ssh agent started [${SSH_AGENT_PID}]" ssh-add endif endif
Ambos scripts, los he encontrado en Stormsilver: Getting started with SVN+SSH y son pieza clave para lograr el objetivo de éste post, aunque como dije para los usuarios de Ubuntu esto no es necesario, más no se si es igual en otras distribuciones pero es fácil saberlo. Finalmente has:
svn list svn+ssh://mostro/svn/proyecto
No solo no te pedirá la contraseña, sino que ya no necesitas escribir el usuario, la IP o incluso el puerto, basta con escribir el dominio local para tu servidor en particular, en mi caso mostro… que en realidad ese servidor es un pequeño NSlu2 hackeado con GNU/Linux Unslung ;)
El resultado es una forma de acceso más fácil de recordar y no tienes que escribir siempre los mismos datos. Ahorras tiempos y te quitas una razón para estresarte :)