17 años en Internet

15 mayo 2010

Compartir carpetas por ssh

Fuente utilizada: begnu.wordpress.com

He creado un pequeño sistema casero para montar carpetas en mi netbook pertenecientes a mi PC de sobremesa, pero a través de ssh (la gente suele gastar Samba). Como me ha costado mi tiempo... os comparto las acciones que he realizado.

Primer paso, instalar el servicio de sshd
Para utilizar la solución que propongo es muy importante que la máquina "servidor" tenga el servicio de ssh instalado. Distribuciones como Ubuntu incluyen sólo instalada la versión cliente, pero no el demonio. Para instalar el servicio:
sudo apt-get install ssh

Segundo: conexiones ssh sin contraseña
Aunque parezca una contradicción utilizar ssh sin contraseña es mucho más seguro, puesto que obligamos a que se haga uso de comprobaciones de firmas digitales. Esto implica que desde cada máquina cliente (el que será vuestro terminal "ligero") se deberá generar su fichero de firma digital:
ssh-keygen -t rsa
Este comando os pedirá que pongáis una frase... pero no escribáis nada. Limitaros a pulsar intro en cada pregunta que haga. Una vez generada la firma, la copiaremos a nuestro servidor de ssh:
ssh-copy-id -i ~/.ssh/id_rsa.pub seb@192.168.4.39
Donde seb sería el usuario y 192.168.4.39 la ip del servidor. Si nuestra distribución no tiene el comando ssh-copy-id, habrá que copiar la firma manualmente:
scp ~/.ssh/id_rsa.pub seb@192.168.4.39:tmp
ssh seb@192.168.4.39
cat tmp >> .ssh/authorized_keys
La prueba de fuego se realizará desde la máquina cliente, y es comprobar que no se nos pide password al realizar una conexión ssh:
ssh seb@192.168.4.39
Ok, perfecto, ya podemos conectarnos sin contraseña. Ahora configuraremos el sshd para que NADIE más pueda conectarse. Para ello editaremos la configuracion sshd del servidor:
sudo nano /etc/ssh/sshd_config
Y buscamos las siguintes variables para aplicarles los siguientes valores:
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes
Y por último resetearemos el servicio para aplicar los cambios:
sudo /etc/init.d/ssh restart
(Si no existe ssh, prueba con sshd).

Paso tres: "La nube"
Par montar una carpeta por ssh deberemos tener instalado el siguiente paquete:
sudo apt-get install sshfs
Y su funcionamiento es muy sencillo:
sshfs usuario@ip_servidor:carpeta_origen/ mi_carpeta/

Por si os es útil, os facilito el código de dos scripts que he creado. El primero sirve para automatizar el montado de mis carpetas, y el segundo lógicamente es para desmontarlas. Veréis que en vez de usar ip's hago uso de "servidor_interno" y "servidor_externo". Esos dos nombres los defino en mi /etc/hosts con la ip de mi servidor en la red local y la que tiene en el exterior (por si me conecto por internet). También veréis que hago varios mv, esto es por que la carpeta donde tenéis que montar el sshfs debe de estar vacía.

El esquema del primer script es el siguiente:
- ¿El sshf está ya montado? -> Entonces aborto el script.
- Mover los contenidos de las carpetas afectadas, para poder montar en ellas.
- Montar carpetas con ip de red interna.
- Si falla, montar las carpetas con ip de red externa.
- Si vuelve a fallar, volvemos a poner los contenidos en las carpetas afectadas.

nube.sh
#!/bin/bash
#Verificacion de sistema montado
if [ $(echo $(df -h | grep Movies | wc -l)) -eq 1 ]
then
echo "El sistema ya está montado"
exit 1
fi
#Moviendo contenidos locales
mkdir ~/.copia_local 1> /dev/null 2> /dev/null
cd ~/.copia_local
mkdir Movies Pictures Music Downloads Documents 1> /dev/null 2> /dev/null
cd - 1>/dev/null 2>/dev/null
mv ~/Vídeos/* ~/.copia_local/Movies/ 1> /dev/null 2> /dev/null
mv ~/Música/* ~/.copia_local/Music/ 1> /dev/null 2> /dev/null
mv ~/Descargas/* ~/.copia_local/Downloads/ 1> /dev/null 2> /dev/null
mv ~/Imágenes/* ~/.copia_local/Pictures/ 1> /dev/null 2> /dev/null
mv ~/Documentos/* ~/.copia_local/Documents/ 1> /dev/null 2> /dev/null
#Montando las carpetas remotas
sshfs moncho@server_interno:Sebas/Movies/ /home/sebas/Vídeos/
if [ $? -eq 1 ]
then
echo "Falla red local"
echo "Probando IP externa"
sshfs moncho@server_externo:Sebas/Movies/ ~/Vídeos/
if [ $? -eq 1 ]
then
#Restaurando contenidos locales
cd ~/.copia_local
mv Movies/* ~/Vídeos/ 1> /dev/null 2> /dev/null
mv Music/* ~/Música/ 1> /dev/null 2> /dev/null
mv Downloads/* ~/Downloads/ 1> /dev/null 2> /dev/null
mv Pictures/* ~/Imágenes/ 1> /dev/null 2> /dev/null
mv Documents/ ~/Documentos/ 1> /dev/null 2> /dev/null
cd - 1>/dev/null 2>/dev/null
echo "Conexion fallida"
exit 1
else
sshfs moncho@server_externo:Sebas/Music/ ~/Música/
sshfs moncho@server_externo:Sebas/Downloads/ ~/Descargas/
sshfs moncho@server_externo:Sebas/Pictures/ ~/Imágenes/
sshfs moncho@server_externo:Sebas/Documents/ ~/Documentos/
fi
else
sshfs moncho@server_interno:Sebas/Music/ ~/Música/
sshfs moncho@server_interno:Sebas/Downloads/ ~/Descargas/
sshfs moncho@server_interno:Sebas/Pictures/ ~/Imágenes/
sshfs moncho@server_interno:Sebas/Documents/ ~/Documentos/
fi
echo "Conectado a la nube"
exit 0

Y para desmontar he hecho el siguiente script:
desnubar.sh
#!/bin/bash
if [ $(echo $(df -h | grep Movies | wc -l)) -eq 0 ]
then
echo "El sistema ya está desmontado"
exit 1
fi
#Desmontando
sudo umount ~/Vídeos
if [ $? -eq 1 ]
then
echo "Abortando el desnubamiento"
echo "Debe insertar bien el password"
exit 1
fi
sudo umount ~/Música
sudo umount ~/Imágenes
sudo umount ~/Documentos
sudo umount ~/Descargas
#Moviendo contenidos locales
cd ~/.copia_local
mv Movies/* ~/Vídeos/ 1> /dev/null 2> /dev/null
mv Music/* ~/Música/ 1> /dev/null 2> /dev/null
mv Downloads/* ~/Downloads/ 1> /dev/null 2> /dev/null
mv Pictures/* ~/Imágenes/ 1> /dev/null 2> /dev/null
mv Documents/* ~/Documentos/ 1> /dev/null 2> /dev/null
cd - 1>/dev/null 2>/dev/null
exit 0

Un saludo :)

2 comentarios:

Si te ha gustado la entrada o consideras que algún dato es erróneo o símplemente deseas dar algún consejo, no dudes en dejar un comentario. Todo feedback es bienvenido siempre que sea respetuoso. También puedes contactarme vía Twitter @Hamster_ruso si lo consideras necesario.