SFTP o Protocolo Seguro de Transferencia de Archivos es una utilidad segura de transferencia remota de archivos basada en el Protocolo de Transferencia de Archivos (FTP).

El tráfico FTP no está cifrado y es inseguro, por lo que ha sido sustituido en su mayor parte por SFTP.

SFTP se ejecuta por defecto sobre el protocolo SSH en el puerto TCP 22 y ofrece el mismo conjunto de capacidades de seguridad y encriptación que SSH. El demonio SSH por defecto que se ejecuta como parte del servidor OpenSSH en sistemas Linux soporta por defecto las características básicas del protocolo SFTP aunque existe software dedicado independiente disponible como vsftpd que puede configurarse para obtener características y personalizaciones adicionales.

En este artículo, cubriremos el uso de SFTP desde la línea de comandos. Utilizaré un sistema Ubuntu aunque los comandos listados aquí funcionarán en cualquier sistema Linux con cliente sftp.

Antes de entrar en los comandos, debe saber que SCP está quedando obsoleto y como alternativa, es bueno familiarizarse con el comando SFTP. Con SFTP puede hacer prácticamente todo lo que hace con SCP.

Copiar archivos

SFTP puede utilizarse como sustituto del comando SCP (Copia Segura) en algunos casos de uso compatibles. Uno de estos casos es el uso de SCP para empujar o extraer archivos de un servidor remoto de una sola vez.

La sintaxis para subir archivos utilizando el comando SCP es la siguiente:

$ scp {ruta-local} {usuario}@{host-remote}:{ruta-remote}

Y para la descarga así

$ scp {usuario}@{host-remote}:{ruta-archivo-remote} {ruta-local}

Del mismo modo, podemos utilizar la siguiente sintaxis del comando sftp para subir archivos a un servidor remoto:

$ sftp {usuario}@{host}:{ruta-remota} <<< $'put {ruta-local}'

A continuación se muestra una demostración de la carga de archivos mediante s ftp en una sola línea:

$ sftp ftpuser@192.168.1.231:/home/ftpuser/remote_test_dir <<< $'put /home/abhisheknair/archivo_nuevo'
ftpuser@192.168.1.231's password:
Conectado a 192.168.1.231.
Cambiando a /home/ftpusuario/remote_test_dir
sftp> put /home/abhisheknair/archivo_nuevo
Cargando /home/abhisheknair/archivo_nuevo a /home/ftpuser/remote_test_dir/archivo_nuevo
/home/abhisheknair/archivo_nuevo 100% 9 7.2KB/s 00:00
$

Para descargar un archivo de un servidor remoto, utilice la siguiente sintaxis de comando:

$ sftp {usuario}@{host-remote}:{nombre-archivo-remote} {nombre-archivo-local}

He aquí una demostración de la descarga de un archivo en una línea utilizando sftp:

$ sftp ftpuser@192.168.1.231:/home/ftpuser/new_file1 /home/abhisheknair/nuevo_dir_local
ftpuser@192.168.1.231's password:
Conectado a 192.168.1.231.
Fetching /home/ftpuser/new_file1 to /home/abhisheknair/new_local_dir/new_file1
/home/ftpuser/archivo_nuevo1 100% 12 3.6KB/s 00:00
$

También puede intercambiar la clave SSH para la autenticación sin contraseña.

Conexión a un servidor SFTP

Para iniciar una conexión SFTP, utilice el comando sftp con un nombre de usuario y el nombre o IP del host remoto. El puerto TCP 22 por defecto debe estar abierto para que esto funcione o bien especifique explícitamente el puerto utilizando la bandera -oPort.

Me estoy conectando a un servidor SFTP con IP 192.168.1.231. La primera vez que se conecte a un servidor SFTP, se le pedirá que confirme la huella digital del servidor como SSH. Una vez confirmada tecleando‘sí‘ la conexión procede y solicita la contraseña del usuario.

En una conexión exitosa, se le mostrará el prompt sftp>.

$ sftp ftpuser@192.168.1.231
No se puede establecer la autenticidad del host '192.168.1.231 (192.168.1.231)'.
La huella de la clave ECDSA es SHA256:k90E28Pfnjoiq1svFw18dA2mazweoCmR5Hqi8SH0mj0.
¿Está seguro de que desea continuar conectándose (sí/no/[huella digital])? sí
Advertencia: Añadido permanentemente '192.168.1.231' (ECDSA) a la lista de hosts conocidos.
ftpuser@192.168.1.231's password:
Conectado a 192.168.1.231.
sftp>

Comprobar versión

Puede comprobar la versión de SFTP utilizando el comando version en el prompt sftp.

sftp> versión
Protocolo SFTP versión 3
sftp>

Obtener ayuda

Para obtener ayuda sobre los comandos disponibles y la sintaxis de SFTP, utilice ‘?‘ o‘help‘.

sftp> ?
Comandos disponibles:
bye Salir de sftp
cd ruta Cambiar el directorio remoto a 'ruta
chgrp [-h] grp ruta Cambiar el grupo del archivo 'ruta' a 'grp'
chmod [-h] mode ruta Cambiar los permisos del archivo 'ruta' a 'mode'
chown [-h] own ruta Cambiar el propietario del archivo 'ruta' a 'own'
df [-hi] <x><x>[</x></x> ruta] Muestra estadísticas del directorio actual o del
sistema de archivos que contiene 'ruta'
exit Salir de sftp
get [-afpR] remoto <x>[local</x> ] Descargar archivo
help Mostrar este texto de ayuda
lcd path Cambiar el directorio local a 'path
lls [ls-opciones <x><x>[ruta]</x></x>] Mostrar el listado del directorio local
lmkdir ruta Crear directorio local
ln [-s] oldpath newpath Enlazar archivo remoto (-s para enlace simbólico)
lpwd Imprimir el directorio de trabajo local
ls [-1afhlnrSt] <x><x>[</x></x> ruta] Mostrar el listado de directorios remotos
lumask umask Establecer umask local a 'umask'
mkdir ruta Crea el directorio remoto
progress Alternar la visualización del medidor de progreso
put [-afpR] local <x>[remote</x> ] Cargar archivo
pwd Mostrar el directorio de trabajo remoto
quit Salir de sftp
reget [-fpR] remote [ <x>local</x> ] Reanudar la descarga del archivo
rename oldpath newpath Renombrar archivo remoto
reput [-fpR] local [ <x>remoto</x> ] Reanudar archivo de subida
rm ruta Eliminar archivo remoto
rmdir ruta Eliminar directorio remoto
symlink oldpath newpath Symlink archivo remoto
version Mostrar la versión SFTP
!command Ejecutar 'command' en shell local
¡! Escapar al shell local
? Sinónimo de ayuda
sftp>

Mostrar directorio de trabajo

Cuando esté conectado a un servidor remoto, puede mostrar el directorio de trabajo actual del sistema remoto utilizando el comando pwd.

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp>

Para mostrar el directorio de trabajo actual del sistema local utilice el comando lpwd.

sftp> lpwd
Directorio de trabajo local: /home/abhisheknair
sftp>

Listar archivos

Puede listar archivos en el directorio de trabajo remoto utilizando el comando ls.

sftp> ls
remote_file1 remote_file2 remote_file3 remote_test_dir
sftp>

Para listar los archivos en el directorio de trabajo local, utilice el comando lls.

sftp> lls
bin archivo1 archivo2 archivo3 lib oci-scripts sys_info.sh test.tgz testdir
sftp>

Cambio de directorios

El cambio del directorio de trabajo remoto puede realizarse utilizando el comando cd. Consulte el siguiente ejemplo:

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp> ls
remote_file1 remote_file2 remote_file3 remote_test_dir
sftp> cd directorio_remoto_prueba
sftp> pwd
Directorio de trabajo remoto: /home/ftpuser/remote_test_dir
sftp>

Para cambiar el directorio de trabajo local, utilice el comando lcd. A continuación se muestra un ejemplo sencillo para mostrar el uso de lcd.

sftp> lpwd
Directorio de trabajo local: /home/abhisheknair
sftp> lls
bin file1 file2 file3 lib oci-scripts sys_info.sh test.tgz testdir
sftp> lcd testdir
sftp> lpwd
Directorio de trabajo local: /home/abhisheknair/testdir
sftp>

Cargar archivos

Para subir un solo archivo, utilice el comando put. Vea cómo subo el fichero local file1 al directorio de trabajo remoto utilizando el comando put. Puedo verificarlo utilizando el comando ls que imprime el contenido del directorio de trabajo remoto.

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp> lpwd
Directorio de trabajo local: /home/abhisheknair
sftp> ls
remote_file1 remote_file2 remote_file3 remote_test_dir
sftp> lls
bin archivo1 archivo2 archivo3 lib oci-scripts sys_info.sh test.tgz testdir
sftp> put fichero1
Subiendo archivo1 a /home/ftpusuario/archivo1
archivo1 100% 6 6.0KB/s 00:00
sftp> ls
file1 remote_file1 remote_file2 remote_file3 remote_test_dir
sftp>

Para subir varios archivos de una sola vez, podemos utilizar el comando mput como se muestra a continuación. Yo utilizo mput con un patrón de expresión regular file[23] que básicamente sube file2 y file3 y se salta file1 puesto que ya ha sido subido en el paso anterior. Puede utilizar cualquier comodín o expresión regular con mput.

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp> lpwd
Directorio de trabajo local: /home/abhisheknair
sftp> ls
file1 remote_file1 remote_file2 remote_file3 remote_test_dir
sftp> lls
bin archivo1 archivo2 archivo3 lib oci-scripts sys_info.sh test.tgz testdir
sftp> mput fichero<x>[</x>23]
Subiendo archivo2 a /home/ftpusuario/archivo2
archivo2 100% 6 6.5KB/s 00:00
Subiendo archivo3 a /home/ftpusuario/archivo3
archivo3 100% 6 5.3KB/s 00:00
sftp> ls
file1 file2 file3 remote_file1 remote_file2 remote_file3 remote_test_dir
sftp>

Descarga de archivos

Un solo archivo usando SFTP puede ser descargado usando el comando get. Aquí hay un ejemplo donde descargué archivo_remoto4 usando sftp:

sftp> pwd
Directorio de trabajo remoto: /home/ftpuser/remote_test_dir
sftp> lpwd
Directorio de trabajo local: /home/abhisheknair/testdir
sftp> ls
archivo_remoto4
sftp> lls
fichero4
sftp> get archivo_remoto4
Fetching /home/ftpuser/remote_test_dir/remote_file4 to remote_file4
/home/ftpuser/remote_test_dir/remote_file4 100% 13 5.2KB/s 00:00
sftp> lls
archivo4fichero_remoto4
sftp>

Para descargar varios archivos, utilice el comando <strong>mget</strong>. Aquí estoy descargando todos los archivos que coinciden con el patrón archivo_remoto* en el directorio de trabajo remoto a mi directorio de trabajo local. Finalmente utilizo el comando <strong>lls</strong> para ver los archivos descargados.

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp> lpwd
Directorio de trabajo local: /home/abhisheknair/testdir
sftp> ls
remote_file1 remote_file2 remote_file3 remote_test_dir
sftp> lls
archivo4 archivo_remoto4
sftp> mget archivo_remoto*
Fetching /home/ftpuser/remote_file1 to remote_file1
/home/ftpuser/archivo_remoto1 100% 12 5.9KB/s 00:00
Fetching /home/ftpuser/remote_file2 to remote_file2
/home/ftpuser/archivo_remoto2 100% 13 5.8KB/s 00:00
Fetching /home/ftpuser/remote_file3 to remote_file3
/home/ftpuser/archivo_remoto3 100% 13 7.3KB/s 00:00
sftp> lls
archivo4 archivo_remoto1 archivo_remoto2 archivo_remoto3 archivo_remoto4
sftp>

Crear directorio

Se puede crear un nuevo directorio en un servidor remoto utilizando el comando mkdir.

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp> ls
file1 file2 file3 remote_file1 remote_file2 remote_file3 remote_test_dir
sftp> mkdir directorio_nuevo
sftp> ls
file1 file2 file3 new_dir remote_file1 remote_file2 remote_file3 remote_test_dir
sftp>

Del mismo modo, si desea crear un nuevo directorio en el directorio de trabajo actual del sistema local desde el indicador sftp, utilice el comando lmkdir.

sftp> lpwd
Directorio de trabajo local: /home/abhisheknair
sftp> lls
bin archivo1 archivo2 archivo3 lib oci-scripts sys_info.sh test.tgz testdir
sftp> lmkdir directorio_local_nuevo
sftp> lls
bin file1 file2 file3 lib new_local_dir oci-scripts sys_info.sh test.tgz testdir
sftp>

Eliminar directorio

Puede eliminar un directorio remoto vacío utilizando el comando rmdir. Tenga en cuenta que si no está vacío, obtendrá un error.

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp> ls
file1 file2 file3 new_dir remote_file1 remote_file2 remote_file3 remote_test_dir
sftp> rmdir directorio_nuevo
sftp> ls
file1 file2 file3 remote_file1 remote_file2 remote_file3 remote_test_dir
sftp>

Eliminar archivo

Se puede eliminar un archivo remoto utilizando el comando rm.

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp> ls
file1 file2 file3 remote_file1 remote_file2 remote_file3 remote_test_dir
sftp> rm archivo_remoto3
Eliminando /home/ftpusuario/archivo_remoto3
sftp> ls
file1 file2 file3 remote_file1 remote_file2 remote_test_dir
sftp>

Renombrar archivo

También se puede renombrar fácilmente un archivo remoto utilizando el comando rename.

sftp> pwd
Directorio de trabajo remoto: /home/ftpusuario
sftp> ls
archivo1 archivo2 archivo3 archivo_remoto1 archivo_remoto2 directorio_remoto_prueba
sftp> renombrar archivo_remoto1 nuevo_archivo1
sftp> ls
archivo1 archivo2 archivo3 archivo_nuevo1 archivo_remoto2 directorio_remoto_prueba
sftp>

Uso del sistema de archivos

Para mostrar las estadísticas del directorio actual o del sistema de archivos que contiene ‘ruta’, utilice el comando df. Podemos utilizar la bandera -h para mostrar las estadísticas en un formato legible por humanos. Tenga en cuenta que las estadísticas mostradas son para el respectivo sistema de archivos del servidor SFTP remoto y no para el sistema de archivos de la máquina local.

sftp> df
        Tamaño Utilizado Disponible (root) Êpacidad
    17811456 1845472 15965984 15965984 10%
sftp> df -h
    Size Used Avail (root) Êpacity
  17.0GB 1.8GB 15.2GB 15.2GB 10%
sftp>

Salir de la sesión SFTP

Para salir de la sesión SFTP, utilice el comando bye, exit o quit. Volverá al prompt de su sistema operativo después de salir de SFTP.

sftp> exit
$

Conclusión

SFTP es una de las mejores opciones disponibles que es segura así como fácil de usar. Ofrece características CLI así como GUI y es compatible con diferentes plataformas. Consulte la página man de sftp para más información.

$ man sftp

Si está interesado en aprender más entonces eche un vistazo a este curso Udemy Linux Mastery.