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

Introducción

FTP, el Protocolo de Transferencia de Archivos, fue un método popular y no cifrado para transferir archivos entre dos sistemas remotos. A partir de 2022, ha sido desaprobado por la mayoría del software moderno debido a la falta de seguridad y en su mayoría solo puede ser utilizado en aplicaciones heredadas.

SFTP, que significa Protocolo de Transferencia de Archivos Seguro, es un protocolo separado integrado en SSH que puede implementar comandos FTP sobre una conexión segura. Típicamente, puede actuar como un reemplazo directo en cualquier contexto donde aún se necesite un servidor FTP.

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

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

Cómo Conectarse con SFTP

Por defecto, 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.

Aunque puedes autenticarte con contraseñas de forma predeterminada, te recomendamos que crees claves SSH y transfieras 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 claves SSH para acceder a tu servidor si aún no lo has hecho.

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

  1. ssh sammy@your_server_ip_or_remote_hostname

Si eso funciona, sal del sistema escribiendo:

  1. exit

Ahora podemos establecer una sesión SFTP emitiendo el siguiente comando:

  1. sftp sammy@your_server_ip_or_remote_hostname

Te conectarás al sistema remoto y tu indicador cambiará a un indicador SFTP.

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

  1. sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

Esto te conectará al 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. Esto te da acceso a un resumen de los otros comandos SFTP. Puedes llamarlo escribiendo cualquiera de estos en el indicador:

  1. help

o

  1. ?

Esto mostrará una lista de los comandos disponibles:

Output
Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-Ppr] remote [local] Download file help Display this help text lcd path Change local directory to 'path' . . .

Exploraremos algunos de los comandos que verás en las siguientes secciones.

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

Primero, vamos a orientarnos averiguando en qué directorio nos encontramos 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:

  1. pwd
Output
Remote working directory: /home/demouser

Podemos ver el contenido del directorio actual del sistema remoto con otro comando familiar:

  1. ls
Output
Summary.txt info.html temp.txt testDirectory

Ten en cuenta que los comandos disponibles dentro de la interfaz SFTP no son una coincidencia 1:1 con la sintaxis típica de shell y no son tan ricos en funciones. Sin embargo, implementan algunas de las banderas opcionales más importantes, como agregar -la a ls para ver más metadatos y permisos de archivos:

  1. ls -la
Output
drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 . drwxr-xr-x 3 root root 4096 Aug 13 15:02 .. -rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history -rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout -rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . .

Para llegar a otro directorio, podemos emitir este comando:

  1. cd testDirectory

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 imprimir el directorio de trabajo local:

  1. lpwd
Output
Local working directory: /Users/demouser

Podemos listar el contenido del directorio actual en la máquina local:

  1. lls
Output
Desktop local.txt test.html Documents analysis.rtf zebra.html

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

  1. lcd Desktop

Transferencia de archivos con SFTP

Si queremos descargar archivos de nuestro host remoto, podemos hacerlo usando el comando get:

  1. get remoteFile
Output
Fetching /home/demouser/remoteFile to remoteFile /home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01

Como puedes ver, por defecto, el comando get descarga un archivo remoto con el mismo nombre en el sistema de archivos local.

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

  1. get remoteFile localFile

El comando get también acepta algunas opciones. Por ejemplo, podemos copiar un directorio y todo su contenido especificando la opción recursiva:

  1. get -r someDirectory

Podemos indicar a SFTP que mantenga los permisos y tiempos de acceso apropiados usando la bandera -P o -p:

  1. get -Pr someDirectory

Transferencia de archivos locales al sistema remoto

La transferencia de archivos al sistema remoto funciona de la misma manera, pero con un comando put:

  1. put localFile
Output
Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00

Las mismas banderas que funcionan con get se aplican a put. Entonces, para copiar un directorio local completo, puedes ejecutar put -r:

  1. put -r localDirectory

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

  1. df -h
Output
Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%

Ten en cuenta que no hay una variación local de este comando, pero podemos solventarlo emitiendo el comando !.

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

  1. !

y luego

  1. df -h
Output
Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home

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

  1. exit

Ahora deberías ver el regreso del indicador SFTP.

Manipulaciones de archivos simples con SFTP

SFTP te permite realizar algunos tipos de mantenimiento del sistema de archivos. Por ejemplo, puedes cambiar el propietario de un archivo en el sistema remoto con:

  1. chown userID file

Nota cómo, a diferencia del comando chmod del sistema, el comando SFTP no acepta nombres de usuario, sino que utiliza UID. Desafortunadamente, no hay una manera integrada de conocer el UID apropiado desde la interfaz SFTP.

Como solución alternativa, puedes leer desde el archivo /etc/passwd, que asocia nombres de usuario con UIDs en la mayoría de los entornos Linux:

  1. get /etc/passwd
  2. !less passwd
Output
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh . . .

Observe cómo en lugar de dar el comando ! por sí solo, lo hemos utilizado 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, delimitado por caracteres de dos puntos.

De manera similar, podemos cambiar el propietario del grupo de un archivo con:

  1. chgrp groupID file

Nuevamente, no hay una forma incorporada de obtener una lista de los grupos del sistema remoto. Podemos solucionarlo con el siguiente comando:

  1. get /etc/group
  2. !less group
Output
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .

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

El comando chmod de SFTP funciona normalmente en el sistema de archivos remoto:

  1. chmod 777 publicFile
Output
Changing mode on /home/demouser/publicFile

No hay un comando equivalente para manipular los permisos de archivo locales, pero puede configurar el umask local, de modo que cualquier archivo copiado al sistema local tendrá sus permisos correspondientes.

Esto se puede hacer con el comando lumask:

  1. lumask 022
Output
Local umask: 022

Ahora, todos los archivos regulares descargados (siempre que no se use la bandera -p) tendrán permisos 644.

SFTP también te permite crear directorios tanto en sistemas locales como remotos con lmkdir y mkdir respectivamente.

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

  1. ln
  2. rm
  3. rmdir

Estos comandos replican el comportamiento central de sus equivalentes de shell. Si necesitas realizar estas acciones en el sistema de archivos local, recuerda que puedes ingresar a un shell emitiendo este comando:

  1. !

O ejecutar un solo comando en el sistema local anteponiendo el comando con ! de la siguiente manera:

  1. !chmod 644 somefile

Cuando haya terminado con su sesión SFTP, use exit o bye para cerrar la conexión.

  1. bye

Conclusión

Aunque la sintaxis de SFTP es mucho menos completa que las herramientas de shell modernas, puede ser útil para proporcionar compatibilidad con la sintaxis heredada de FTP o para limitar cuidadosamente la funcionalidad disponible para los usuarios remotos en algunos entornos.

Por ejemplo, puede utilizar SFTP para permitir que usuarios específicos transfieran archivos sin acceso SSH. Para obtener más información sobre este proceso, consulte nuestro tutorial sobre Cómo Habilitar SFTP Sin Acceso a la Shell.

Si está acostumbrado a usar FTP o SCP para realizar sus transferencias, SFTP es una buena manera de aprovechar las fortalezas de ambos. Aunque no es apropiado para todas las situaciones, es una herramienta flexible para tener en su repertorio.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server