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:
Si eso funciona, sal del sistema escribiendo:
Ahora podemos establecer una sesión SFTP emitiendo el siguiente comando:
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:
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:
o
Esto mostrará una lista de los comandos disponibles:
OutputAvailable 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.
Navegación con SFTP
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:
OutputRemote working directory: /home/demouser
Podemos ver el contenido del directorio actual del sistema remoto con otro comando familiar:
OutputSummary.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:
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 .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:
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:
OutputLocal working directory: /Users/demouser
Podemos listar el contenido del directorio actual en la máquina local:
OutputDesktop local.txt test.html
Documents analysis.rtf zebra.html
También podemos cambiar el directorio con el que queremos interactuar en el sistema local:
Transferencia de archivos con SFTP
Si queremos descargar archivos de nuestro host remoto, podemos hacerlo usando el comando get
:
OutputFetching /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:
El comando get
también acepta algunas opciones. Por ejemplo, podemos copiar un directorio y todo su contenido especificando la opción recursiva:
Podemos indicar a SFTP que mantenga los permisos y tiempos de acceso apropiados usando la bandera -P
o -p
:
Transferencia de archivos locales al sistema remoto
La transferencia de archivos al sistema remoto funciona de la misma manera, pero con un comando put
:
OutputUploading 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
:
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:
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:
y luego
OutputFilesystem 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:
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:
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:
Outputroot: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:
Nuevamente, no hay una forma incorporada de obtener una lista de los grupos del sistema remoto. Podemos solucionarlo con el siguiente comando:
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 en la primera columna. Esto es lo que estamos buscando.
El comando chmod
de SFTP funciona normalmente en el sistema de archivos remoto:
OutputChanging 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
:
OutputLocal 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:
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:
O ejecutar un solo comando en el sistema local anteponiendo el comando con !
de la siguiente manera:
Cuando haya terminado con su sesión SFTP, use exit
o bye
para cerrar la conexión.
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.