Linux / Comando / sftp: transferir archivos de forma segura mediante SSH

SFTP (SSH File Transfer Protocol) permite transferir archivos y realizar operaciones remotas mediante una conexión SSH (Secure Shell) cifrada. El cliente sftp de OpenSSH se conecta con sftp USUARIO@HOST y utiliza la verificación de la clave del servidor y los métodos de autenticación de SSH.

sftp user@example.com

SFTP es distinto de FTP (File Transfer Protocol) y de FTPS, que protege FTP mediante TLS (Transport Layer Security). El servidor debe ofrecer el subsistema SFTP de SSH y el puerto TCP configurado para ese servicio. Los nombres example.com y las rutas de este artículo son ejemplos: necesita una cuenta autorizada y un servidor real para practicarlos.

Características de SFTP y comprobaciones antes de la conexión

sftp de OpenSSH realiza la transferencia de archivos a través de una conexión SSH cifrada y permite el uso de funciones de SSH como la autenticación mediante clave pública, archivos de configuración SSH y hosts intermedios. Puede consultar todas las opciones y los comandos interactivos en el manual oficial de sftp de OpenSSH.

  • Dirección del servidor y puerto SSH
  • Cuenta de usuario para iniciar sesión
  • Contraseña o clave privada SSH
  • Ruta confiable para verificar la huella digital de la clave del host del servidor
  • Permisos de lectura y escritura para el directorio remoto

Compare la huella digital de la clave del host que se muestra al conectarse por primera vez con los valores obtenidos del administrador del servidor o de una pantalla de administración de confianza. Si aprueba sin verificar, podría pasar por alto un ataque de intermediario o la conexión a un servidor incorrecto.

Cómo conectarse al servidor

Conexión básica

sftp user@example.com

Cuando esté conectado, aparecerá el indicador sftp> y podrá ingresar comandos interactivos. Este indicador es solo para fines descriptivos y en el ejemplo de código a continuación solo se muestran los comandos.

Usar otro puerto SSH

sftp -P 2222 user@example.com

La opción de puerto de SFTP es la letra mayúscula -P. La minúscula -p es otra opción que solicita conservar la hora de modificación, la hora de acceso y los permisos del archivo a transferir, así que no la confunda.

Especificar clave privada

sftp -i ~/.ssh/id_ed25519 user@example.com

Restrinja la lectura de la clave privada y protéjala, cuando corresponda, con una frase de paso local; es diferente de la contraseña de la cuenta del servidor. Un agente SSH puede gestionar el uso de la clave. No copie la clave privada al servidor ni a una carpeta compartida: el servidor utiliza la clave pública autorizada.

Diferenciar entre rutas locales y remotas

En el modo interactivo de SFTP, los comandos que se ejecutan en el servidor remoto y en la computadora local son diferentes.

Comando Objetivo Descripción
pwd Remoto Muestra el directorio actual del servidor remoto.
lpwd Local Muestra el directorio actual de la computadora donde se ejecuta SFTP.
cd RUTA Remoto Cambia el directorio remoto.
lcd RUTA Local Cambiar el directorio local.
ls Remoto Mostrar la lista de archivos remotos.
lls Local Mostrar la lista de archivos locales.
mkdir Remoto Crear un directorio remoto.
lmkdir Local Crear un directorio local.

Es una buena costumbre verificar pwd y lpwd antes de la operación para no transferir archivos a lugares incorrectos.

Descargar archivos

Descargar un archivo

get reports/daily.csv

El segundo argumento indica la ruta local. Prepare primero la carpeta ./download y confirme con lpwd dónde se encuentra; el ejemplo no la crea. Los archivos de reports deben existir en el servidor y ser legibles. Los ejemplos de cada apartado son independientes, no una secuencia que deba ejecutar completa.

get reports/daily.csv ./download/daily.csv

Descargar varios archivos y directorios

get reports/*.csv
get -R reports

Los comodines pueden coincidir con nombres de archivos remotos. Al descargar directorios de forma recursiva, SFTP no sigue los enlaces simbólicos dentro del árbol y, según la versión del servidor y del cliente, las opciones compatibles pueden variar.

Reanudar descargas interrumpidas

reget archive.tar.zst

O puede reanudar transferencias parciales con get -a. Esto asume que el archivo parcial local es exactamente igual a la parte inicial del archivo remoto, por lo que si el archivo remoto ha cambiado, el resultado podría estar dañado. Para archivos importantes, compare la suma de verificación después de la transferencia.

Subir archivos

Subir un archivo

put ./release.tar.zst

Puede especificar la ruta de almacenamiento remoto o el nombre como el segundo argumento.

put ./release.tar.zst uploads/release.tar.zst

Cargar directorios de forma recursiva

put -R ./assets uploads/assets

Las cargas pueden sobrescribir archivos. Compruebe las carpetas locales y remotas con lpwd, pwd, lls y ls y prepare el destino permitido antes de transferir. En la copia recursiva, verifique el directorio resultante para evitar niveles duplicados. SFTP no sigue los enlaces simbólicos encontrados durante ese recorrido.

Reanudar cargas interrumpidas

reput ./large-image.img

put -a también intenta reanudar la carga parcial. Si el archivo parcial remoto no coincide con la parte inicial del archivo local, se puede crear un archivo dañado, así que verifique si hubo cambios y valide el hash al finalizar.

Rutas, espacios en blanco y manejo de nombres de archivos

Las rutas con espacios se deben encerrar entre comillas.

get "Monthly Reports/September Report.csv"
put "./Release Files/app package.tar.zst" uploads/

La interpretación de comandos interactivos de SFTP no es exactamente igual que la de una shell normal. Para nombres de archivos que contengan comodines o barras invertidas, primero verifique el nombre exacto en la lista, y en la automatización, es más seguro usar nombres de archivos simples y predecibles.

Gestionar la información de conexión usando el archivo de configuración SSH

Agrupar las opciones repetidas en la entrada Host

Si escribe un alias, usuario, puerto y la ruta de la clave en ~/.ssh/config, puede conectarse de manera rápida.

Host fileserver
    HostName sftp.example.com
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
sftp fileserver

No incluya la contraseña ni el contenido de la clave privada en el archivo de configuración. Restrinja los permisos del archivo y verifique la prioridad entre la configuración del sistema y la configuración del usuario.

Conectarse a través del host de salto

sftp -J bastion.example.com user@internal.example.com

-J usa ProxyJump para conectar mediante un host de salto. Verifique por una vía confiable las claves tanto del intermediario como del destino. No necesita activar la retransmisión del agente para todos los casos de ProxyJump; habilítela únicamente si su procedimiento la requiere y confía en los sistemas implicados.

Enviar automáticamente en modo batch

Crear un archivo batch

Guarde los comandos siguientes en upload.sftp y ejecútelos con el cliente SFTP, no como un script de Bash. Antes de hacerlo, prepare incoming en el servidor, ./exports/report.csv en el equipo local y una carpeta de prueba con un único proceso de carga. Los nombres fijos report.tmp y report.csv son ilustrativos; en una aplicación con cargas concurrentes, elija nombres temporales únicos y una política de reemplazo.

cd incoming
lcd ./exports
put report.csv report.tmp
rename report.tmp report.csv
bye

Subir con un nombre temporal y renombrarlo al terminar puede impedir que los consumidores lean un archivo parcial. Que la publicación sea atómica depende de las garantías de renombrado del servidor y del protocolo, además de que origen y destino estén en el mismo sistema de archivos. El cambio puede fallar si el destino existe; no suponga que sobrescribirá de forma atómica en todos los servidores. Esta operación tampoco demuestra por sí sola que los datos se hayan sincronizado físicamente a disco.

Ejecutar archivo por lotes

sftp -b upload.sftp fileserver

El modo por lotes no debe depender de la interacción con el usuario para solicitar contraseñas. Use cuentas dedicadas restringidas y autenticación de clave pública, y limite los permisos de clave, el origen de acceso y las rutas permitidas según la política del servidor. No incluya contraseñas en scripts ni en la línea de comandos.

Comprender el manejo de fallos

En el modo por lotes, si fallan los comandos principales como get, put, rename, generalmente se detiene el proceso. Puede ignorar fallos con - frente al comando, pero úselo solo de manera selectiva, ya que podría parecer que la tarea tuvo éxito mientras faltan archivos necesarios.

En la automatización, se debe verificar el estado de salida del proceso SFTP, el tamaño de los archivos transferidos y, si es posible, la suma de verificación; además, se deben establecer políticas de notificación y reintentos en caso de fallo.

Lista de verificación de seguridad y operaciones

  • Clave del host: Compruebe la huella digital a través de una ruta confiable en el primer acceso y cuando se cambie la clave.
  • Autenticación: La automatización utiliza claves públicas de alcance limitado y cuentas dedicadas en lugar de contraseñas.
  • Clave privada: Limite los permisos de lectura y no se sube a repositorios, carpetas compartidas de respaldo o servidores.
  • Permisos de ruta: Se restringe el acceso a los directorios necesarios solo para la cuenta de subida.
  • Sobrescritura: Se verifica la ruta de destino y los archivos existentes, utilizando nombres temporales y políticas de conservación de versiones.
  • Integridad: Transferencias importantes generan y comparan sumas de verificación confiables en ambos lados.
  • Registro: Se registran éxitos y fallos de transferencia y el destino, pero no se almacenan contraseñas, claves privadas ni contenido de archivos sensibles.

Comparación de SFTP, SCP, rsync

Herramientas Situaciones adecuadas Características
sftp Gestión de archivos interactiva y transferencia estandarizada Proporciona lista remota, cambio de directorio, reanudación y comandos por lotes.
scp Copia de archivos sencilla Es fácil de copiar con un solo comando, pero las funciones de gestión remota interactiva son limitadas.
rsync Sincronización repetida y directorios grandes Proporciona transferencia de cambios, reglas de exclusión y sincronización de eliminación, pero también requiere un entorno de soporte en el servidor.

El hecho de que cualquier herramienta use SSH no significa automáticamente que los permisos de la cuenta y los procedimientos de implementación sean seguros. Elija según el propósito de la transferencia y el método de recuperación ante fallos.

Preguntas frecuentes

¿Es SFTP FTP con TLS aplicado?

No. SFTP es el SSH File Transfer Protocol y funciona sobre la conexión SSH. FTPS es un método separado que aplica TLS a FTP y la configuración del servidor y la estructura de puertos son diferentes.

¿Cuál es la razón por la que ocurre el error Connection refused?

La dirección o el puerto pueden ser incorrectos, el servicio SSH puede no estar escuchando o el firewall puede rechazar la conexión. Compruebe la dirección del servidor, el puerto indicado mediante -P en mayúscula, el estado del servicio SSH y las políticas de red.

¿Qué hacer si aparece Permission denied?

Debe distinguir si el fallo proviene de la autenticación en sí o de la falta de permisos de archivos tras iniciar sesión. Revise la información de diagnóstico de conexión con sftp -v, pero no comparta directamente nombres de usuario, rutas ni información del servidor en registros públicos.

¿Cómo verificar si la carga se completó?

Verifique el estado de finalización y el tamaño del archivo remoto, y para archivos importantes, calcule y compare sumas de verificación como SHA-256 tanto local como remotamente. Si el servidor SFTP es una cuenta restringida que no permite la ejecución arbitraria de comandos, puede ser necesario un API de verificación separado o un procedimiento de procesamiento en el servidor.