Linux Kung Fu: administración de archivos conveniente a través de SSH

Si tiene más de una computadora con Linux, probablemente la use todo el tiempo ssh. Es una gran herramienta, pero siempre encontré algo extraño en ella. A pesar de que las conexiones ssh permiten transferir archivos usando scpy sftp, no tenemos la capacidad de mover archivos entre los sistemas local y remoto sin ejecutar el programa en el host local o sin conectarnos a la máquina local desde el remoto.







Esto último es un problema real, ya que los servidores a menudo se conectan mientras están detrás de un firewall o detrás de un enrutador NAT, es decir, sin una dirección IP permanente. Como resultado, el servidor, en cualquier caso, no podrá conectarse al sistema local desde el que se accedió anteriormente. Si en una sesión ssh pudiera tomar un archivo local o remoto y transferirlo a donde lo necesite, sería muy conveniente.



En realidad, no logré este objetivo, pero estuve muy cerca de lograrlo. En este artículo le contaré acerca de un script que le permite montar directorios remotos en su computadora local. En la máquina local, deberá instalarsshfs, pero en una ubicación remota donde es posible que no pueda instalar programas, no tendrá que cambiar nada. Si dedica algún tiempo a configurar los sistemas y si hay un servidor ssh en funcionamiento en la computadora cliente, también puede montar directorios locales en sistemas remotos. No tiene que preocuparse por bloquear direcciones IP o puertos. De hecho, si puede conectarse a una máquina remota, eso significa que tendrá éxito en lo que quiero contarle.



Como resultado, si se combina todo esto, resulta que estoy muy cerca de la meta. Puedo trabajar con un shell de comandos en el cliente o en el servidor y tengo la capacidad de leer y escribir archivos cómodamente en ambos lados de la conexión. Para hacer esto, solo necesita configurar todo correctamente.



¿Hay alguna trampa aquí?



Quizás decidas que hay algún tipo de trampa. Después de todo, estamos, de hecho, hablando de usar dos conexiones ssh. Uno se usa para montar el sistema de archivos y el otro se usa para iniciar sesión en la computadora. Y este, de hecho, es el caso. Pero si se configura correctamente ssh, la autenticación deberá realizarse solo una vez, sin perder demasiado tiempo organizando dos conexiones.



Además, el trabajo se facilita enormemente con el guión, del que hablaré. Oculta los detalles al usuario, por lo que el procedimiento de conexión se ve (casi) como de costumbre, y luego todo funciona como debería.



Algunas palabras sobre sshfs



La utilidad le sshfspermite trabajar con el sistema de archivos en el espacio de usuario (sistema de archivos en el espacio de usuario, FUSE). Es decir, estamos hablando del hecho de que hay una capa en el espacio del usuario que se encuentra en la parte superior del sistema de archivos base. En este caso, dicho sistema de archivos es el servidor ssh que admite sftp. Esto le permite trabajar con archivos ubicados en un sistema remoto, tratándolos como si estuvieran en un sistema de archivos real en la computadora local. Si aún no lo ha probado sshfs, pruébelo. Esta utilidad funciona muy bien.



Suponga que inicia sesión en su computadora myservery ejecuta el siguiente comando desde su máquina local: 



sshfs myserver:/home/admin ~/mounts/myserver


Esto hará que el directorio de la computadora remota sea /home/adminaccesible en el sistema local a lo largo de la ruta ~/mounts/myserver.



Al usar, sshfspuede usar varias opciones. Por ejemplo, puede hacer arreglos para volver a conectarse después de perder la conexión. Para obtener más detalles, sshfsconsulte la ayuda.



Dado que sshfsutiliza una versión del archivo montada de forma remota, todos los cambios realizados en el archivo se guardan en la máquina remota. Y una vez que se cierra la conexión sshfs, no queda nada en la computadora local. Arreglaremos esto ahora.



Preparación preliminar



Antes de pasar a la descripción del script que se mencionó anteriormente, quiero hablar sobre algunas de las configuraciones del cliente, que usted, si lo desea, puede modificar usted mismo. Entonces, aquí creo un directorio ~/remotey en él creo subdirectorios para cada computadora remota. Por ejemplo, pueden ser directorios ~/remote/fileservery ~/remote/lab.



El guión se llama sshmount. Toma los mismos argumentos que ssh. Para simplificar el trabajo con el script, la información sobre el host remoto debe almacenarse en un archivo ~/.ssh/config, lo que permitirá utilizar nombres de host simples y cortos. Por ejemplo, la información de la computadora labpodría verse así:



Host lab
Hostname lab.wd5gnr-dyn.net
Port 444
User alw
ForwardX11 yes
ForwardX11Trusted yes
TCPKeepAlive yes
Compression yes
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p


Esto no es realmente necesario, pero con este enfoque tiene un directorio atractivo a su disposición ~/remote/lab, no una construcción de vista compleja ~/remote/alw@lab.wd5gnr-dyn.net:444. No hay nada misterioso en todos estos parámetros. Lo único que quiero llamar tu atención es eso ControlMastery ControlPathpermitir que te organices para correr más rápido con compuestos que, en este caso, es muy importante.



Además, puede organizar una conexión automática a un sistema remoto utilizando claves ssh privadas. Aquí está el tema.



Guión



Nuestro guión se puede utilizar de dos formas. Entonces, si se llama a través de un enlace a sshunmount, desmontará el sistema de archivos asociado con el host remoto especificado. Si se llama de manera diferente (generalmente cómo sshmount), entonces realiza las siguientes tres acciones:



  1. Comprueba si el directorio contiene un ~/remotesubdirectorio con el mismo nombre que el nombre de host (por ejemplo - lab). Si no existe tal directorio, muestra un mensaje de error y continúa funcionando.
  2. Si tal directorio existe, el script busca en la lista de sistemas de archivos montados en caso de que el sistema de archivos requerido ya esté montado. Si es así, continúa trabajando.
  3. Si el directorio no está montado, llama sshfsy continúa.


Este script se puede encontrar en GitHub . Y aquí está su código, del que se han eliminado algunos comentarios:



#!/bin/bash
 
if [ "$1" == "" ]
then
echo Usage: sshmount host [ssh_options] - Mount remote home folder on ~/remote/host and log in
echo or: sshunmount host - Remove mount from ~/remote/host
exit 1
fi
 
#    sshunmount...
if [ $(basename "$0") == sshunmount ]
then
echo Unmounting... 1>&2
fusermount -u "$HOME/remote/$1"
exit $?
fi
 
#  ...
if [ -d "$HOME/remote/$1" ] #   ?
then
if mount | grep "$HOME/remote/$1 " #    ?
then
echo Already mounted 1>&2
else
sshfs -o reconnect $1: $HOME/remote/$1 # mount
fi
else
echo No remote directory ~/remote/$1 exists 1>&2
fi
ssh $@ #  


Este script me da la mitad de lo que necesito. Es decir, le permite trabajar cómodamente con archivos remotos en la computadora local a la que estoy conectado. Pero lograr que desde una computadora remota sea posible trabajar con archivos ubicados en la máquina local es un poco más difícil.



Resolviendo el problema inverso



Si desea experimentar con el montaje de carpetas en su máquina local en un servidor, necesitará tener un servidor ssh ejecutándose en la máquina local. Por supuesto, si su computadora local es visible y accesible para el servidor, entonces es simple: simplemente ejecútelo en la computadora remota sshfsy monte la carpeta en ella desde la computadora local. Pero en muchos casos, no tenemos acceso al sistema local, que puede estar ubicado detrás de firewalls o enrutadores. Esto es especialmente cierto si el papel del sistema local lo desempeña una computadora portátil que puede conectarse a la red desde diferentes lugares.



Pero nuestra tarea, a pesar de todas estas dificultades, aún puede resolverse. Hay dos partes en su solución.



En primer lugar, es necesario, al llamarsshmount, especifique un argumento adicional (el archivo se puede editar en caso de que necesite ejecutar constantemente un comando similar):



sshmount MyServer -R 5555:localhost:22


En segundo lugar, después de conectarse al host, debe ejecutar el siguiente comando:



sshfs -p 5555 localhost:/home/me ~/local


Gracias a la opción -R, se crea un socket en el puerto en la máquina remota 5555(que, por supuesto, debería estar libre) y se realiza su conexión con el puerto de la 22máquina local. Suponiendo que el servidor ssh se esté ejecutando en el puerto 22, esto permitirá que el servidor se conecte a la máquina local a través de la misma conexión. No necesita saber nuestra dirección IP o tener un puerto abierto.



El comando sshfs, que se puede ejecutar al iniciar el sistema, vincula el directorio local /home/mecon el directorio del ~/localservidor remoto. Si, además, ha iniciado sesión localmente, puede echar un vistazo a las variables de entorno que comienzan con SSH_y obtener más información sobre la conexión SSH. Por ejemplo, se trata de variables $SSH_CLIENTy $SSH_TTY.



Por supuesto, para que los comandos anteriores funcionen para usted, deberá cambiar los nombres de host y los directorios, así como las direcciones de los puertos a los que se utilizan en sus sistemas. Pero después de que todo esté configurado, todos los archivos que necesita estarán disponibles tanto en máquinas locales como remotas. Por cierto, no intenté organizar el montaje circular de directorios. Si intentas hacer esto, puede resultar algo muy extraño.



Salir



Supongo que debe tener cuidado al montar carpetas remotas en la máquina local y carpetas locales en la máquina remota al mismo tiempo. Por ejemplo, las utilidades que escanean todo el sistema de archivos pueden confundirse en tales configuraciones. Además, sigo buscando una respuesta a la pregunta de cómo desconectarme correctamente del sistema de archivos del servidor al salir de la última sesión.



Pero incluso ahora, todo esto nos brinda buenas herramientas para organizar un trabajo conveniente y confiable con archivos de software ssh. Cabe señalar que otra opción para resolver el problema de trabajar con archivos en sistemas remotos puede ser sincronizar carpetas y usarlas para transferir archivos entre computadoras.



¿Qué utiliza para trabajar con archivos en sistemas Linux remotos?










All Articles