Cómo usar SFTP para transferir archivos de forma segura a un servidor remoto

Introducción

FTP (File Transfer Protocol), o “Protocolo de transferencia de archivos” es un método popular para transferir archivos entre dos sistemas remotos.

SFTP, que significa SSH File Transfer Protocol, o Secure File Transfer Protocol, es un protocolo separado empaquetado con SSH que funciona de manera similar a través de una conexión segura. La ventaja es la capacidad de aprovechar una conexión segura para transferir archivos y atravesar el sistema de archivos tanto en el sistema local como en el remoto.

En casi todos los casos, SFTP es preferible a FTP debido a sus características de seguridad subyacentes y su capacidad para conectarse a una conexión SSH. FTP es un protocolo inseguro que solo debe usarse en casos limitados o en redes de confianza.

Aunque SFTP está integrado en muchas herramientas gráficas, esta guía mostrará cómo usarla a través de su interfaz de línea de comandos interactiva.

Cómo conectarse con SFTP

De forma predeterminada, SFTP utiliza el protocolo SSH para autenticar y establecer una conexión segura. Debido a esto, están disponibles los mismos métodos de autenticación que están presentes en SSH.

Si bien las contraseñas son fáciles de usar y configurar de forma predeterminada, te recomendamos que crees claves SSH y transferir tu clave pública a cualquier sistema al que necesites acceder. Esto es mucho más seguro y puede ahorrarte tiempo a largo plazo.

Consulta esta guía para configurar las claves SSH para acceder a tu servidor si aún no lo has hecho.

Si puedes conectarte a la máquina utilizando SSH, entonces has completado todos los requisitos necesarios para usar SFTP para administrar archivos. Prueba el acceso SSH con el siguiente comando:

Si eso funciona, sal de nuevo escribiendo:

Podemos establecer una conexión SSH y luego abrir una sesión SFTP usando esa conexión emitiendo el siguiente comando:

Conectarás al sistema remoto y tu solicitud cambiará a una solicitud SFTP.

Si estás trabajando en un puerto SSH personalizado (no en el puerto predeterminado 22), puedes abrir una sesión de SFTP de la siguiente manera:

Esto te conectará con el sistema remoto a través de tu puerto especificado.

Obtener ayuda en SFTP

El comando más útil para aprender primero es el comando de ayuda (help). Esto te da acceso a un resumen de la ayuda de SFTP. Puedes invocarlo escribiendo cualquiera de estos comandos en el indicador:

Esto mostrará una lista de los comandos disponibles:

Exploraremos algunos de los comandos que ves en las siguientes secciones.

Navegando con SFTP

Podemos navegar a través de la jerarquía de archivos del sistema remoto usando una serie de comandos que funcionan de manera similar a sus contrapartes de shell.

Primero, orientémonos al descubrir en qué directorio estamos actualmente en el sistema remoto. Al igual que en una sesión de shell típica, podemos escribir lo siguiente para obtener el directorio actual:

Podemos ver los contenidos del directorio actual del sistema remoto con otro comando familiar:

Ten en cuenta que los comandos dentro de la interfaz SFTP no son los comandos de shell normales y no son tan ricos en características, pero implementan algunos de los indicadores opcionales más importantes:

Para llegar a otro directorio, podemos emitir este comando:

Ahora podemos atravesar el sistema de archivos remoto, pero ¿qué pasa si necesitamos acceder a nuestro sistema de archivos local? Podemos dirigir los comandos hacia el sistema de archivos local precediéndolos con una “l” para local.

Todos los comandos discutidos hasta ahora tienen equivalentes locales. Podemos mostrar el directorio de trabajo local:

Podemos listar los contenidos del directorio actual en la máquina local:

También podemos cambiar el directorio con el que deseamos interactuar en el sistema local:

Transfiriendo archivos con SFTP

Navegar por los sistemas de archivos locales y remotos es de utilidad limitada sin poder transferir archivos entre los dos.

Transferencia de archivos remotos al sistema local

Si nos gustaría descargar archivos de nuestro host remoto, podemos hacerlo emitiendo el siguiente comando:

Como puedes ver, de forma predeterminada, el comando “get” descarga un archivo remoto a un archivo con el mismo nombre en el sistema de archivos local.

Podemos copiar el archivo remoto a un nombre diferente especificando el nombre después:

El comando “get” también tiene algunos indicadores de opción. Por ejemplo, podemos copiar un directorio y todos sus contenidos especificando la opción recursiva:

Podemos decirle a SFTP que mantenga los permisos adecuados y los tiempos de acceso utilizando el indicador “-P” o “-p”:

Transferencia de archivos locales al sistema remoto

La transferencia de archivos al sistema remoto se realiza con la misma facilidad utilizando el comando “put” con el nombre apropiado:

Los mismos indicadores que funcionan con “get” se aplican a “put“. Así que, para copiar un directorio local completo, puedes emitir:

Nota:

Actualmente hay un error en las versiones de OpenSSH incluidas con las versiones actuales de Ubuntu (al menos 14.04 a 15.10) que impiden que el comando anterior funcione correctamente. Tras emitir el comando anterior para transferir el contenido a un servidor utilizando la versión con errores de OpenSSH, se dará el error siguiente: Couldn’t canonicalise: No such file or directory.

Para solucionar este problema, crea primero el directorio de destino en el extremo remoto escribiendo mkdir localDirectory. Después, el comando anterior debe completarse sin error.

Una herramienta familiar que es útil al descargar y cargar archivos es el comando “df“, que funciona de manera similar a la versión de la línea de comandos. Usando esto, puedes verificar que tienes suficiente espacio para completar las transferencias que te interesan:

Ten en cuenta que no existe una variación local de este comando, pero podemos solucionarlo emitiendo el comando “!”.

El comando “!” nos deja en un shell local, donde podemos ejecutar cualquier comando disponible en nuestro sistema local. Podemos verificar el uso del disco escribiendo:

Cualquier otro comando local funcionará como se espera. Para volver a tu sesión de SFTP, escribe:

Ahora deberías ver el retorno de solicitud de SFTP.

Manipulaciones de archivos simples con SFTP

SFTP te permite realizar el tipo de mantenimiento de archivos básico que es útil cuando se trabaja con jerarquías de archivos.

Por ejemplo, puedes cambiar el propietario de un archivo en el sistema remoto con:

Observa cómo, a diferencia del comando “chmod” del sistema, el comando SFTP no acepta nombres de usuario, sino que utiliza los UID. Desafortunadamente, no hay una manera fácil de conocer el UID apropiado desde la interfaz SFTP.

Una manera en que podrías lograrlo es la siguiente:

Observa cómo en lugar de dar el comando “!” por sí mismo, lo hemos usado como un prefijo para un comando de shell local. Esto funciona para ejecutar cualquier comando disponible en nuestra máquina local y podría haber sido utilizado con el comando local “df” anteriormente.

El UID estará en la tercera columna del archivo, como se delimita con caracteres de dos puntos.

Cambiar propietario de grupo

Del mismo modo, podemos cambiar el propietario del grupo de un archivo con:

Nuevamente, no hay una manera fácil de obtener una lista de los grupos del sistema remoto. Podemos solucionarlo con el siguiente comando:

La tercera columna contiene el ID del grupo asociado con el nombre en la primera columna. Esto es lo que estamos buscando.

Afortunadamente, el comando “chmod” funciona como se esperaba en el sistema de archivos remoto:

No hay ningún comando para manipular los permisos de archivos locales, pero puede establecer la umask local, de modo que cualquier archivo copiado en el sistema local tenga los permisos adecuados.

Eso se puede hacer con el comando “lumask”:

Ahora todos los archivos normales descargados (siempre que no se use el indicador “-p”) tendrán permisos 644.

SFTP te permite crear directorios en sistemas locales y remotos con “lmkdir” y “mkdir” respectivamente. Estos funcionan como te imaginas.

El resto de los comandos de archivo solo se dirigen al sistema de archivos remoto:

Estos comandos replican el comportamiento básico de las versiones de shell. Si necesitas realizar estas acciones en el sistema de archivos local, recuerda que puedes ingresar a una shell emitiendo este comando:

O ejecuta un solo comando en el sistema local precediendo el comando con “!” al igual que:

Cuando hayas terminado con tu sesión de SFTP, usa “exit” o “bye” para cerrar la conexión.

Conclusión

Aunque SFTP es una herramienta simple, es muy útil para administrar servidores y transferir archivos entre ellos.

Por ejemplo, puedes usar SFTP para permitir que usuarios particulares transfieran archivos sin acceso SSH.

Si estás acostumbrado a usar FTP o SCP para realizar tus transferencias, SFTP es una buena manera de aprovechar los puntos fuertes de ambos. Si bien no es apropiado para cada situación, es una herramienta flexible para tener en tu repertorio.