FTP, o “File Transfer Protocol” (Protocolo de transferencia de archivos), era un método popular sin cifrar para transferir archivos entre dos sistemas remotos.
SFTP, que significa Protocolo de transferencia de archivos SSH o Protocolo de transferencia segura de archivos, es un protocolo independiente empaquetado con SSH que funciona de forma similar pero a través de una conexión segura. La ventaja es la capacidad de aprovechar una conexión segura para transferir archivos y recorrer el sistema de archivos en los sistemas local y remoto.
En casi todos los casos, es preferible usar SFTP, en vez de FTP, debido a sus características de seguridad subyacentes y a su capacidad para aprovechar una conexión SSH. FTP es un protocolo no seguro que solo debería utilizarse en casos limitados o en redes de confianza.
Aunque SFTP está integrado en muchas herramientas gráficas, esta guía mostrará cómo utilizarlo en su interfaz de línea de comandos interactiva.
De forma predeterminada, SFTP utiliza el protocolo SSH para autenticarse y establecer una conexión segura. Por eso, están disponibles los mismos métodos de autenticación que en SSH.
Aunque las contraseñas son fáciles de usar y se configuran de forma predeterminada, le recomendamos crear claves SSH y transferir su clave pública a cualquier sistema al que necesite acceder. Eso 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 hizo.
Si puede conectarse al equipo usando SSH, habrá completado todos los requisitos necesarios para usar SFTP para administrar archivos. Pruebe el acceso SSH con el siguiente comando:
- ssh sammy@your_server_ip_or_remote_hostname
Si esto funciona, salga de nuevo escribiendo:
- exit
Ahora, podemos establecer una sesión SFTP ejecutando el siguiente comando:
- sftp sammy@your_server_ip_or_remote_hostname
Conectará el sistema remoto, y la entrada de su línea de comandos cambiará a una instrucción SFTP.
Si está trabajando en un puerto SSH personalizado (no el puerto 22 predeterminado), puede iniciar una sesión SFTP de la siguiente manera:
- sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname
Eso lo conectará al sistema remoto mediante el puerto especificado.
El comando más útil que debe conocer primero es el comando help. Este comando le da acceso a un resumen de la ayuda en SFTP. Puede invocarlo escribiendo cualquiera de estos en la instrucción:
- help
o
- ?
Eso 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'
. . .
En las siguientes secciones, exploraremos algunos de los comandos que verá.
Podemos navegar a través de la jerarquía de archivos del sistema remoto usando varios comandos que funcionan de forma similar a sus contrapartes de shell.
Primero, orientémonos averiguando en qué directorio estamos actualmente en el sistema remoto. Al igual que en una sesión típica de shell, 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 en la interfaz SFTP no son los comandos de shell normales y no cuentan con la misma cantidad de funciones, pero implementan algunos de los indicadores opcionales más importantes:
- 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 .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 ejecutar este comando:
- cd testDirectory
Ahora, podemos recorrer el sistema de archivos remotos, pero ¿qué pasa si necesitamos acceder a nuestro sistema de archivos local? Podemos dirigir los comandos al sistema de archivos locales precediéndolos con una l
que hace referencia a “local”.
Todos los comandos examinados hasta ahora tienen equivalentes locales. Podemos imprimir el directorio local de trabajo:
- lpwd
OutputLocal working directory: /Users/demouser
Podemos enumerar el contenido del directorio actual en el equipo local:
- lls
OutputDesktop local.txt test.html
Documents analysis.rtf zebra.html
También podemos cambiar el directorio con el que deseamos interactuar en el sistema local:
- lcd Desktop
Navegar por los sistemas de archivos locales y remotos es muy poco útil si no se puede transferir archivos entre ambos.
Si queremos descargar archivos de nuestro host remoto, podemos hacerlo ejecutando el siguiente 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 comando get
descarga un archivo remoto a un archivo con el mismo nombre en el sistema de archivos locales.
Podemos copiar el archivo remoto a un nombre diferente especificando el nombre después:
- get remoteFile localFile
El comando get
también toma algunos indicadores de opción. 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 los tiempos de acceso adecuados utilizando el indicador -P
o -p
:
- get -Pr someDirectory
Transferir archivos al sistema remoto es tan fácil como utilizar el comando correctamente llamado “put”:
- put localFile
OutputUploading localFile to /home/demouser/localFile
localFile 100% 7607 7.4KB/s 00:00
Los mismos indicadores que funcionan con get
se aplican a put
. Para copiar un directorio local completo, puede ejecutar:
- put -r localDirectory
Nota: Actualmente, hay un error en las versiones de OpenSSH incluidas en las versiones actuales de Ubuntu (al menos de la versión 14.04 a la 15.10) que impide que el comando anterior funcione correctamente. Cuando se ejecuta el comando anterior para transferir contenido a un servidor utilizando la versión con errores de OpenSSH, se producirá el siguiente error: Couldn't canonicalise: No such file or directory
(No se pudo canonizar: no existe tal archivo o directorio).
Para resolver este problema, primero cree el directorio de destino en el extremo remoto escribiendo mkdir localDirectory
. Luego, el comando anterior debería completarse sin errores.
Una herramienta familiar que es útil para descargar y cargar archivos es el comando df
, que funciona de forma similar a la versión de la línea de comandos. Al utilizarla, puede verificar 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 hay ninguna variación local de este comando, pero podemos solucionarlo ejecutando !
como 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 lo siguiente:
- !
y luego
- df -h
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á de la manera esperada. Para volver a su sesión SFTP, escriba lo siguiente:
- exit
Ahora, debería ver el retorno de la instrucción de SFTP.
SFTP le permite realizar el tipo de mantenimiento básico de archivos que es útil cuando se trabaja con jerarquías 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 comando chmod
del sistema, el comando SFTP no acepta nombres de usuario, sino que utiliza UID. Lamentablemente, no hay una manera sencilla de saber el UID adecuado desde la interfaz SFTP.
Se puede realizar una solución alternativa más compleja con:
- get /etc/passwd
- !less passwd
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 vez de utilizar el comando !
en sí, lo utilizamos como prefijo para un comando de shell local. Eso funciona para ejecutar cualquier comando disponible en nuestro equipo local y podría haberse utilizado anteriormente con el comando local df
.
El UID se encuentra 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:
- chgrp groupID file
De nuevo, no existe una forma sencilla 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 en la primera columna. Eso es lo que buscamos.
Por suerte, el comando chmod
funciona correctamente en el sistema de archivos remotos:
- chmod 777 publicFile
OutputChanging mode on /home/demouser/publicFile
No existe ningún comando para manipular permisos de archivo locales, pero puede quitar la máscara local para que todos los archivos que se copien al sistema local tengan los permisos adecuados.
Eso se puede lograr con el comando lumask
:
- lumask 022
OutputLocal umask: 022
Ahora, todos los archivos regulares descargados (siempre que no se utilice el indicador -p
) tendrán 644 permisos.
SFTP permite crear directorios en sistemas locales y en sistemas remotos con lmkdir
y mkdir
, respectivamente. Estos funcionan de la manera prevista.
El resto de los comandos del archivo solo apuntan al sistema de archivos remotos:
- ln
- rm
- rmdir
Estos comandos replican el comportamiento básico de las versiones del shell. Si necesita realizar estas acciones en el sistema de archivos local, recuerde que puede ingresar a un shell ejecutando este comando:
- !
O ejecutar un comando único en el sistema local anteponiendo !
al comando de esta manera:
- !chmod 644 somefile
Cuando termine con la sesión SFTP, utilice exit
o bye
para cerrar la conexión.
- bye
Aunque SFTP es una herramienta simple, es muy útil para administrar servidores y transferir archivos entre ellos.
Por ejemplo, puede usar SFTP para permitir que determinados usuarios transfieran archivos sin acceso SSH. Para obtener más información sobre este proceso, consulte nuestro tutorial Cómo habilitar SFTP sin acceso de 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 útil tenerlo en su repertorio por ser una herramienta flexible.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.