> La lista completa de artículos está en [llms.txt](https://docs.f3cloud.com/llms.txt). Cada página tiene versión en Markdown, basta con añadir .md a su dirección. Esta página en Markdown: [https://docs.f3cloud.com/es/vps/sftp-file-transfer.md](https://docs.f3cloud.com/es/vps/sftp-file-transfer.md).

# SFTP – cómo transferir archivos al servidor y crear un usuario solo para SFTP

Cómo transferir archivos a un VPS por SFTP. Conexión con el comando sftp desde macOS, Linux y Windows, comandos básicos put y get, conexión con FileZilla, un usuario aparte solo para SFTP con acceso a una sola carpeta mediante chroot y errores frecuentes. Probado en Debian 12 con OpenSSH 9.2.

Tarde o temprano hace falta subir al servidor los archivos de un sitio web, descargar una copia de seguridad o corregir un archivo de configuración en un editor cómodo de tu propio ordenador. Para eso existe **SFTP**, un protocolo de transferencia de archivos que funciona sobre SSH. Si ya te conectas al servidor por SSH, SFTP ya lo tienes y no hace falta instalar nada más. En este artículo veremos cómo funciona SFTP, aprenderemos a transferir archivos desde el terminal y con FileZilla, y después crearemos un usuario aparte que solo puede trabajar con los archivos de una carpeta y no puede entrar al servidor por SSH. Hemos probado todos los ejemplos en un servidor de pruebas con Debian 12.

***

## Cómo funciona SFTP

A pesar del nombre parecido, SFTP no tiene nada que ver con el viejo protocolo FTP. Es una parte de SSH. Cuando te conectas por SFTP, el cliente abre una conexión SSH normal al puerto 22, pasa la misma comprobación de contraseña o de clave y, en lugar de la línea de comandos, inicia en el servidor un programa especial para trabajar con archivos. En la configuración de SSH de nuestro servidor con Debian 12 viene activado por defecto con la línea `Subsystem sftp /usr/lib/openssh/sftp-server`.

De aquí se desprenden tres propiedades prácticas. En primer lugar, todo lo que se transmite se cifra igual que una sesión SSH, así que ni la contraseña ni los archivos viajan por la red en texto abierto. En segundo lugar, no hace falta abrir puertos nuevos en el cortafuegos ni instalar un servidor FTP aparte. En tercer lugar, para entrar sirven los mismos usuarios y claves que para SSH.

Esto también tiene su lado malo. Un usuario normal que puede conectarse por SFTP también puede entrar por SSH y ver todos los archivos que tiene permiso para leer. Si una persona necesita acceso solo para subir archivos, por ejemplo el desarrollador de un sitio web, es mejor crearle un usuario que tenga solo SFTP y solo una carpeta. Esto se hace con las herramientas integradas de SSH, y lo veremos en el paso 3.

***

## Qué necesitas

* **Un servidor** con Debian 12 o Ubuntu 24.04 y acceso a él por SSH. Cómo conectarte se explica en el artículo sobre [Termius](https://docs.f3cloud.com/es/vps/termius-connection.md).
* **El programa `sftp`** en tu ordenador. En macOS y Linux ya viene instalado. En Windows 10 y 11 forma parte del componente **OpenSSH Client**. Si el comando no se encuentra, añade este componente en la sección de características opcionales de Windows, **Optional Features**.

***

## Paso 1. Conéctate por SFTP desde el terminal

Abre el terminal en tu ordenador y conéctate al servidor. En lugar de `IP-del-servidor`, indica la dirección de tu VPS.

```bash
sftp root@IP-del-servidor
```

El programa te pedirá la contraseña, como en una conexión SSH normal, y en la primera conexión te pedirá que confirmes la clave del servidor. Si has reinstalado el servidor y ha aparecido el aviso de que la clave ha cambiado, te ayudará el artículo sobre [REMOTE HOST IDENTIFICATION HAS CHANGED](https://docs.f3cloud.com/es/linux/remote-host-identification-changed.md). Después de entrar aparecerá el indicador `sftp>`.

***

## Paso 2. Transfiere archivos

En una sesión SFTP tienes dos directorios actuales, el del servidor y el de tu ordenador. Los comandos para el servidor se escriben como siempre, y los de tu ordenador, con la letra `l` al principio, de la palabra local.

| Comando | Qué hace |
| --- | --- |
| `pwd` y `lpwd` | Mostrar la carpeta actual en el servidor y en el ordenador |
| `ls` y `lls` | Lista de archivos en el servidor y en el ordenador |
| `cd` y `lcd` | Ir a una carpeta en el servidor y en el ordenador |
| `put archivo` | Subir un archivo del ordenador al servidor |
| `get archivo` | Descargar un archivo del servidor al ordenador |
| `put -R carpeta` y `get -R carpeta` | Subir o descargar una carpeta entera |
| `reput archivo` y `reget archivo` | Continuar una subida o una descarga interrumpida |
| `mkdir`, `rm`, `rename` | Crear una carpeta, borrar un archivo, cambiar el nombre |
| `bye` | Cerrar la sesión |

A continuación verás una sesión real desde nuestro ordenador. Creamos una carpeta en el servidor, subimos a ella un archivo, comprobamos que estaba en su sitio y lo descargamos de vuelta con otro nombre.

```bash
mkdir site-backup
cd site-backup
put report.txt
ls -l
get report.txt report-copy.txt
bye
```

<figure><img src="https://docs.f3cloud.com/img/sftp-session.png" alt="Sesión de sftp, creación de la carpeta site-backup, subida de report.txt con el comando put y descarga con el comando get"><figcaption><p>El archivo se ha subido al servidor y se ha descargado de vuelta</p></figcaption></figure>

El comando `put` toma el archivo de la carpeta actual de tu ordenador, y `get` guarda el archivo en esa misma carpeta. Por eso, antes de empezar conviene ir con el comando `lcd` a la carpeta que necesites en tu ordenador.

***

## Cómo conectarse con FileZilla

Si te resulta más cómodo arrastrar los archivos con el ratón, usa FileZilla, un programa gratuito para Windows, macOS y Linux. Según las instrucciones oficiales de FileZilla, la conexión por SFTP se hace así.

1. En la barra de conexión rápida de la parte superior de la ventana, escribe en el campo de la dirección la dirección del servidor con el prefijo `sftp://`, por ejemplo `sftp://203.0.113.10`.
2. Indica el nombre de usuario y la contraseña.
3. El puerto puedes dejarlo vacío, para SFTP se usa por defecto el 22.
4. Pulsa el botón de conexión rápida **Quickconnect** o la tecla <kbd>Enter</kbd>.

Después de conectarte, a la izquierda verás los archivos de tu ordenador y a la derecha, los del servidor. Los archivos se pasan de un lado a otro arrastrándolos.

> **No olvides el prefijo sftp://.**
>
> Sin él, FileZilla se conectará por FTP normal al puerto 21. En un VPS donde no hay servidor FTP, esa conexión no funcionará.

***

## Paso 3. Crea un usuario solo para SFTP

Ahora crearemos el usuario `sftpuser`, que podrá trabajar con los archivos solo en una carpeta y no podrá entrar por SSH. Para eso, SSH sabe encerrar al usuario en un directorio con ayuda de **chroot**. Para ese usuario, la carpeta indicada se convierte en la raíz del sistema de archivos y no puede subir más arriba.

chroot tiene una regla estricta. La propia carpeta en la que se encierra al usuario y todas las carpetas por encima de ella deben pertenecer a `root`, y nadie más que `root` debe tener permiso de escritura en ellas. Por eso, el usuario pondrá los archivos en una subcarpeta `files`, que ya le pertenece a él.

1. Crea un grupo y un usuario sin acceso a la línea de comandos.

   ```bash
   groupadd sftponly
   useradd -m -d /home/sftpuser -s /usr/sbin/nologin -G sftponly sftpuser
   passwd sftpuser
   ```

   El comando `passwd` te pedirá que introduzcas dos veces la contraseña del nuevo usuario. Con esa contraseña se conectará por SFTP.

2. Crea la carpeta para chroot y la carpeta para los archivos con los propietarios correctos.

   ```bash
   mkdir -p /srv/sftp/sftpuser/files
   chown root:root /srv/sftp /srv/sftp/sftpuser
   chmod 755 /srv/sftp /srv/sftp/sftpuser
   chown sftpuser:sftpuser /srv/sftp/sftpuser/files
   ```

3. Haz una copia de seguridad de los ajustes de SSH y ábrelos.

   ```bash
   cp /etc/ssh/sshd_config /root/sshd_config.bak
   nano /etc/ssh/sshd_config
   ```

4. Añade al final del todo del archivo el bloque de abajo y guarda el archivo. SSH sustituirá `%u` por el nombre del usuario, así que un solo bloque sirve para todos los futuros usuarios del grupo `sftponly`.

   ```bash
   Match Group sftponly
       ChrootDirectory /srv/sftp/%u
       ForceCommand internal-sftp -d /files
       AllowTcpForwarding no
       X11Forwarding no
   ```

5. Comprueba los ajustes y aplícalos. Si `sshd -t` muestra un error, no recargues SSH, corrige el archivo.

   ```bash
   sshd -t && systemctl reload ssh
   ```

> **No cierres la conexión actual.**
>
> Mientras cambias los ajustes de SSH, mantén abierta la ventana en la que trabajas. Primero comprueba en una ventana nueva que la entrada al servidor sigue funcionando y solo después cierra la antigua. Nosotros lo hicimos así, y la entrada de `root` siguió funcionando después del cambio.

Conéctate con el nuevo usuario con el comando `sftp sftpuser@IP-del-servidor`. Aparece enseguida en la carpeta `/files`, puede subir archivos a ella y no puede subir más arriba. En la raíz solo ve la carpeta `files`, y la carpeta `/etc` del servidor para él sencillamente no existe.

<figure><img src="https://docs.f3cloud.com/img/sftp-chroot-user.png" alt="Sesión de sftp del usuario sftpuser, carpeta /files, en la raíz solo se ve files, cd /etc no funciona"><figcaption><p>El usuario está encerrado en su carpeta</p></figcaption></figure>

Si ese mismo usuario intenta entrar por SSH, el servidor responderá **This service allows sftp connections only.** y cerrará la conexión.

Para añadir otro usuario así, repite los pasos 1 y 2 con su nombre. No hace falta cambiar el bloque de `sshd_config`.

***

## Preguntas frecuentes

<details>

<summary>fatal: bad ownership or modes for chroot directory</summary>

La carpeta chroot o una de las carpetas por encima de ella no pertenece a `root` o tiene permiso de escritura para alguien más. El cliente solo ve **Connection closed**, pero la causa se puede encontrar en el registro con el comando `journalctl -u ssh -n 20`. Nosotros obtuvimos este error cuando hicimos propietario de `/srv/sftp/sftpuser` al propio usuario. Devuelve el propietario con los comandos `chown root:root /srv/sftp/sftpuser` y `chmod 755 /srv/sftp/sftpuser`.

</details>

<details>

<summary>dest open "/report.txt": Permission denied</summary>

El usuario intenta escribir un archivo en la raíz de su carpeta chroot, y esa carpeta pertenece a `root`. Así debe ser. Los archivos hay que ponerlos en la subcarpeta `files`, a la que el usuario llega nada más entrar.

</details>

<details>

<summary>This service allows sftp connections only.</summary>

Esto no es un error. Un usuario del grupo `sftponly` solo puede trabajar por SFTP, y se le prohíbe entrar a la línea de comandos por SSH.

</details>

<details>

<summary>Permission denied (publickey,password)</summary>

El servidor no ha aceptado ni la clave ni la contraseña. Obtuvimos este error al conectarnos con el usuario `sftpuser` sin clave y sin contraseña. Comprueba el nombre de usuario y la contraseña, y si todavía no has puesto una contraseña, créala con el comando `passwd sftpuser`. Si entras con clave, la clave pública hay que ponerla en `/home/sftpuser/.ssh/authorized_keys`, justo en la carpeta personal y no en la carpeta chroot. Encontrarás más información sobre las claves en el artículo sobre las [claves SSH](https://docs.f3cloud.com/es/vps/security/ssh-keys.md).

</details>

***

## Nuestros recursos

**Canal de Telegram:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Web del hosting:** [https://f3cloud.com](https://f3cloud.com/es)
