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

Introducción
FTP, el Protocolo de transferencia de archivos , era un método popular y sin cifrar para transferir archivos entre dos sistemas remotos. A partir de 2022, la mayoría del software moderno lo ha dejado en desuso debido a la falta de seguridad y, en su mayoría, solo se puede utilizar en aplicaciones antiguas.
SFTP, que significa Protocolo de transferencia segura de archivos, es un protocolo independiente integrado en SSH que puede implementar comandos FTP a través de una conexión segura. Por lo general, puede actuar como un reemplazo directo en cualquier contexto en el que 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 la capacidad de conectarse a una conexión SSH. FTP es un protocolo inseguro que solo se debe utilizar en casos limitados o en redes en las que confíe.
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
De forma predeterminada, SFTP utiliza el protocolo SSH para autenticar y establecer una conexión segura. Por este motivo, están disponibles los mismos métodos de autenticación que están presentes en SSH.
Aunque puede autenticarse con contraseñas de forma predeterminada, le recomendamos que cree claves SSH y transfiera su clave pública a cualquier sistema al que necesite acceder. Esto es mucho más seguro y puede ahorrarle tiempo a largo plazo.
Consulte esta guía para configurar claves SSH para acceder a su servidor si aún no lo ha hecho.
Si puede conectarse a la máquina mediante SSH, habrá cumplido con todos los requisitos necesarios para utilizar SFTP para administrar archivos. Pruebe el acceso SSH con el siguiente comando:
- ssh sammy@your_server_ip_or_remote_hostname
Si eso funciona, salga nuevamente escribiendo:
- exit
Ahora podemos establecer una sesión SFTP emitiendo el siguiente comando:
- sftp sammy@your_server_ip_or_remote_hostname
Se conectará al sistema remoto y su mensaje cambiará a un mensaje SFTP.
Si está trabajando en un puerto SSH personalizado (no el puerto predeterminado 22), puede abrir una sesión SFTP de la siguiente manera:
- sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname
Esto lo conectará al sistema remoto a través del puerto especificado.
Obtención de ayuda en SFTP
El comando más útil que conviene aprender primero es el comando de ayuda. Este le permite acceder a un resumen de los demás comandos SFTP. Puede llamarlo escribiendo cualquiera de estos en el mensaje de solicitud:
- help
o
- ?
Esto mostrará una lista de los comandos disponibles:
OutputAvailable commands:bye Quit sftpcd 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 sftpget [-Ppr] remote [local] Download filehelp Display this help textlcd path Change local directory to 'path'. . .
Exploraremos algunos de los comandos que verá en las siguientes secciones.
Podemos navegar a través de la jerarquía de archivos del sistema remoto utilizando una serie de comandos que funcionan de manera similar a sus contrapartes de shell.
En primer lugar, orientémonos para averiguar 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:
- pwd
OutputRemote working directory: /home/demouser
Podemos ver el contenido del directorio actual del sistema remoto con otro comando familiar:
- ls
OutputSummary.txt info.html temp.txt testDirectory
Tenga en cuenta que los comandos disponibles en la interfaz SFTP no son exactamente iguales a la sintaxis típica del shell y no tienen tantas funciones. Sin embargo, sí implementan algunas de las opciones más importantes, como agregar -la
para ls
ver más metadatos y permisos de archivos:
- ls -la
Outputdrwxr-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 .bashrcdrwx------ 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:
- cd testDirectory
Ahora podemos recorrer el sistema de archivos remoto, pero ¿qué sucede si necesitamos acceder a nuestro sistema de archivos local? Podemos dirigir comandos hacia el sistema de archivos local precediéndolos con un l
for local.
Todos los comandos que hemos analizado hasta ahora tienen equivalentes locales. Podemos imprimir el directorio de trabajo local:
- lpwd
OutputLocal working directory: /Users/demouser
Podemos enumerar el contenido del directorio actual en la máquina local:
- lls
OutputDesktoplocal.txttest.htmlDocumentsanalysis.rtfzebra.html
También podemos cambiar el directorio con el que queremos interactuar en el sistema local:
- lcd Desktop
Transferencia de archivos con SFTP
Si queremos descargar archivos desde nuestro host remoto, podemos hacerlo usando el get
comando:
- get remoteFile
OutputFetching /home/demouser/remoteFile to remoteFile/home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01
Como puede ver, de forma predeterminada, el get
comando 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:
- get remoteFile localFile
El get
comando también acepta algunas opciones. Por ejemplo, podemos copiar un directorio y todo su contenido especificando la opción recursiva:
- get -r someDirectory
Podemos indicarle a SFTP que mantenga los permisos y tiempos de acceso adecuados mediante el indicador -P
o -p
:
- 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 put
comando:
- put localFile
OutputUploading localFile to /home/demouser/localFilelocalFile 100% 7607 7.4KB/s 00:00
Las mismas banderas que funcionan con get
se aplican a put
. Por lo tanto, para copiar un directorio local completo, puede ejecutar put -r
:
- put -r localDirectory
Una herramienta conocida y útil para descargar y cargar archivos es el df
comando, que funciona de manera similar a la versión de línea de comandos. Con él, puede comprobar que tiene suficiente espacio para completar las transferencias que le interesan:
- df -h
Output Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%
Tenga en cuenta que no existe una variación local de este comando, pero podemos evitarlo emitiendo el !
comando.
El !
comando nos lleva a un shell local, donde podemos ejecutar cualquier comando disponible en nuestro sistema local. Podemos comprobar el uso del disco escribiendo:
- !
y luego
- df -h
OutputFilesystem Size Used Avail Capacity Mounted on/dev/disk0s2 595Gi 52Gi 544Gi 9% /devfs 181Ki 181Ki 0Bi 100% /devmap -hosts 0Bi 0Bi 0Bi 100% /netmap auto_home 0Bi 0Bi 0Bi 100% /home
Cualquier otro comando local funcionará como se espera. Para volver a la sesión SFTP, escriba:
- exit
Ahora deberías ver el retorno del mensaje SFTP.
Manipulaciones sencillas de archivos con SFTP
SFTP le permite realizar algunos tipos de mantenimiento del sistema de archivos. Por ejemplo, puede cambiar el propietario de un archivo en el sistema remoto con:
- chown userID file
Observe cómo, a diferencia del chmod
comando del sistema, el comando SFTP no acepta nombres de usuario, sino que utiliza identificadores de usuario (UID). Lamentablemente, no existe una forma integrada de saber el UID apropiado desde la interfaz SFTP.
Como solución alternativa, puede leer el /etc/passwd
archivo que asocia los nombres de usuario con los UID en la mayoría de los entornos Linux:
- get /etc/passwd
- !less passwd
Outputroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/bin/shbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/shsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/bin/shman:x:6:12:man:/var/cache/man:/bin/sh. . .
Observe cómo, en lugar de proporcionar el !
comando por sí solo, lo hemos utilizado como prefijo para un comando de shell local. Esto sirve para ejecutar cualquier comando disponible en nuestra máquina local y podría haberse utilizado con el df
comando local anteriormente.
El UID estará en la tercera columna del archivo, como lo delinean los caracteres de dos puntos.
De manera similar, podemos cambiar el propietario del grupo de un archivo con:
- chgrp groupID file
Nuevamente, no existe una forma integrada de obtener una lista de los grupos del sistema remoto. Podemos solucionarlo con el siguiente comando:
- get /etc/group
- !less group
Outputroot: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 de la primera columna. Esto es lo que estamos buscando.
El chmod
comando SFTP funciona normalmente en el sistema de archivos remoto:
- chmod 777 publicFile
OutputChanging mode on /home/demouser/publicFile
No existe un comando equivalente para manipular los permisos de archivos locales, pero puede configurar la umask local , de modo que cualquier archivo copiado al sistema local tenga sus permisos correspondientes.
Esto se puede hacer con el lumask
comando:
- lumask 022
OutputLocal umask: 022
Ahora todos los archivos normales descargados (siempre que -p
no se use la bandera) tendrán permisos 644.
SFTP también le permite crear directorios en sistemas locales y remotos con lmkdir
y mkdir
respectivamente.
El resto de los comandos de archivo apuntan únicamente al sistema de archivos remoto:
- ln
- rm
- rmdir
Estos comandos replican el comportamiento básico de sus equivalentes de shell. Si necesita realizar estas acciones en el sistema de archivos local, recuerde que puede ingresar a un shell ejecutando este comando:
- !
O bien, ejecute un solo comando en el sistema local anteponiendo el comando con algo !
como esto:
- !chmod 644 somefile
Cuando haya terminado su sesión SFTP, utilice exit
o bye
para cerrar la conexión.
- bye
Conclusión
Aunque la sintaxis SFTP es mucho menos completa que las herramientas de shell modernas, puede ser útil para brindar compatibilidad con la sintaxis FTP heredada o para limitar cuidadosamente la funcionalidad disponible para los usuarios remotos de algunos entornos.
Por ejemplo, puede utilizar SFTP para permitir que determinados usuarios 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 shell .
Si está acostumbrado a utilizar FTP o SCP para realizar sus transferencias, SFTP es una buena forma de aprovechar las ventajas de ambos. Si bien no es adecuado para todas las situaciones, es una herramienta flexible que puede tener en su repertorio.
Deja una respuesta