> Полный список статей есть в [llms.txt](https://docs.f3cloud.com/llms.txt). Markdown-версия есть у каждой страницы, достаточно добавить .md к её адресу. Эта страница в Markdown: [https://docs.f3cloud.com/ru/vps/sftp-file-transfer.md](https://docs.f3cloud.com/ru/vps/sftp-file-transfer.md).

# SFTP – как передавать файлы на сервер и создать пользователя только для SFTP

Как передавать файлы на VPS по SFTP. Подключение командой sftp из macOS, Linux и Windows, основные команды put и get, подключение через FileZilla, отдельный пользователь только для SFTP с доступом к одной папке через chroot и частые ошибки. Проверено на Debian 12 с OpenSSH 9.2.

Рано или поздно на сервер нужно залить файлы сайта, забрать резервную копию или поправить конфиг в удобном редакторе на своём компьютере. Для этого есть **SFTP**, протокол передачи файлов, который работает поверх SSH. Если вы уже подключаетесь к серверу по SSH, то SFTP у вас уже есть, ничего дополнительно ставить не нужно. В этой статье разберём, как работает SFTP, научимся передавать файлы из терминала и через FileZilla, а затем создадим отдельного пользователя, который может работать только с файлами в одной папке и не может войти на сервер по SSH. Все примеры мы проверили на тестовом сервере с Debian 12.

***

## Как устроен SFTP

Несмотря на похожее название, SFTP не имеет отношения к старому протоколу FTP. Это часть SSH. Когда вы подключаетесь по SFTP, клиент открывает обычное SSH-соединение на порт 22, проходит ту же проверку пароля или ключа, а затем вместо командной строки запускает на сервере специальную программу для работы с файлами. В конфигурации SSH на нашем сервере с Debian 12 она подключена по умолчанию строкой `Subsystem sftp /usr/lib/openssh/sftp-server`.

Отсюда следуют три удобных свойства. Во-первых, всё, что передаётся, шифруется так же, как SSH-сессия, поэтому пароль и файлы не уходят по сети открытым текстом. Во-вторых, не нужно открывать в брандмауэре новые порты и ставить отдельный FTP-сервер. В-третьих, для входа подходят те же пользователи и ключи, что и для SSH.

У этого есть и обратная сторона. Обычный пользователь, который может подключиться по SFTP, может войти и по SSH и увидеть все файлы, которые ему разрешено читать. Если доступ нужен человеку только для загрузки файлов, например разработчику сайта, лучше создать для него пользователя, у которого есть только SFTP и только одна папка. Это делается встроенными средствами SSH, и мы разберём это в шаге 3.

***

## Что понадобится

* **Сервер** с Debian 12 или Ubuntu 24.04 и доступ к нему по SSH. Как подключиться, рассказано в статье про [Termius](https://docs.f3cloud.com/ru/vps/termius-connection.md).
* **Программа `sftp`** на вашем компьютере. В macOS и Linux она уже есть. В Windows 10 и 11 она входит в компонент **OpenSSH Client**. Если команда не находится, добавьте этот компонент в разделе дополнительных компонентов Windows **Optional Features**.

***

## Шаг 1. Подключитесь по SFTP из терминала

Откройте терминал на своём компьютере и подключитесь к серверу. Вместо `IP-адрес-сервера` укажите адрес вашего VPS.

```bash
sftp root@IP-адрес-сервера
```

Программа спросит пароль, как при обычном SSH-подключении, а при первом подключении попросит подтвердить ключ сервера. Если сервер переустанавливали и появилось предупреждение о смене ключа, поможет статья про [REMOTE HOST IDENTIFICATION HAS CHANGED](https://docs.f3cloud.com/ru/linux/remote-host-identification-changed.md). После входа появится приглашение `sftp>`.

***

## Шаг 2. Передавайте файлы

В сеансе SFTP у вас два текущих каталога, на сервере и на вашем компьютере. Команды для сервера пишутся как обычно, а для своего компьютера с буквой `l` в начале, от слова local.

| Команда | Что делает |
| --- | --- |
| `pwd` и `lpwd` | Показать текущую папку на сервере и на компьютере |
| `ls` и `lls` | Список файлов на сервере и на компьютере |
| `cd` и `lcd` | Перейти в папку на сервере и на компьютере |
| `put файл` | Загрузить файл с компьютера на сервер |
| `get файл` | Скачать файл с сервера на компьютер |
| `put -R папка` и `get -R папка` | Загрузить или скачать папку целиком |
| `reput файл` и `reget файл` | Продолжить прерванную загрузку или скачивание |
| `mkdir`, `rm`, `rename` | Создать папку, удалить файл, переименовать |
| `bye` | Завершить сеанс |

Ниже настоящий сеанс с нашего компьютера. Мы создали на сервере папку, загрузили в неё файл, проверили, что он на месте, и скачали его обратно под другим именем.

```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="Сеанс sftp, создание папки site-backup, загрузка report.txt командой put и скачивание командой get"><figcaption><p>Файл загружен на сервер и скачан обратно</p></figcaption></figure>

Команда `put` берёт файл из текущей папки на компьютере, а `get` сохраняет файл в неё же. Поэтому перед работой удобно перейти командой `lcd` в нужную папку на своём компьютере.

***

## Как подключиться через FileZilla

Если удобнее перетаскивать файлы мышкой, используйте FileZilla, бесплатную программу для Windows, macOS и Linux. По официальной инструкции FileZilla подключение к SFTP выглядит так.

1. В строке быстрого подключения вверху окна в поле адреса введите адрес сервера с приставкой `sftp://`, например `sftp://203.0.113.10`.
2. Укажите имя пользователя и пароль.
3. Порт можно не указывать, для SFTP по умолчанию используется 22.
4. Нажмите кнопку быстрого подключения **Quickconnect** или клавишу <kbd>Enter</kbd>.

После подключения слева будут файлы вашего компьютера, а справа файлы сервера. Файлы переносятся между ними перетаскиванием.

> **Не забудьте приставку sftp://.**
>
> Без неё FileZilla будет подключаться по обычному FTP на порт 21. На VPS, где FTP-сервера нет, такое подключение не заработает.

***

## Шаг 3. Создайте пользователя только для SFTP

Теперь создадим пользователя `sftpuser`, который сможет работать с файлами только в одной папке и не сможет войти по SSH. Для этого SSH умеет запирать пользователя в каталоге с помощью **chroot**. Для такого пользователя указанная папка становится корнем файловой системы, и выйти выше неё он не может.

У chroot есть строгое правило. Сама папка, в которой запирается пользователь, и все папки выше неё должны принадлежать `root`, и никто, кроме `root`, не должен иметь права записи в них. Поэтому файлы пользователь будет класть во вложенную папку `files`, которая уже принадлежит ему.

1. Создайте группу и пользователя без доступа к командной строке.

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

   Команда `passwd` попросит дважды ввести пароль для нового пользователя. С этим паролем он будет подключаться по SFTP.

2. Создайте папку для chroot и папку для файлов с правильными владельцами.

   ```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. Сделайте резервную копию настроек SSH и откройте их.

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

4. Добавьте в самый конец файла блок ниже и сохраните файл. `%u` SSH заменит на имя пользователя, поэтому один блок подойдёт для всех будущих пользователей группы `sftponly`.

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

5. Проверьте настройки и примените их. Если `sshd -t` выведет ошибку, не перезагружайте SSH, а исправьте файл.

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

> **Не закрывайте текущее подключение.**
>
> Пока вы меняете настройки SSH, держите открытым окно, в котором работаете. Сначала проверьте в новом окне, что вход на сервер по-прежнему работает, и только потом закрывайте старое. Мы так и сделали, и вход для `root` после изменения продолжил работать.

Подключитесь новым пользователем командой `sftp sftpuser@IP-адрес-сервера`. Он сразу оказывается в папке `/files`, может загружать в неё файлы, а выше подняться не может. В корне ему видна только папка `files`, а папка `/etc` сервера для него просто не существует.

<figure><img src="https://docs.f3cloud.com/img/sftp-chroot-user.png" alt="Сеанс sftp пользователя sftpuser, папка /files, в корне видна только files, cd /etc не работает"><figcaption><p>Пользователь заперт в своей папке</p></figcaption></figure>

Если тот же пользователь попробует войти по SSH, сервер ответит **This service allows sftp connections only.** и закроет соединение.

Чтобы добавить ещё одного такого пользователя, повторите шаги 1 и 2 с его именем. Блок в `sshd_config` менять не нужно.

***

## Частые вопросы

<details>

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

Папка chroot или одна из папок выше неё принадлежит не `root` либо доступна для записи кому-то ещё. Клиент при этом видит только **Connection closed**, а саму причину можно найти в журнале командой `journalctl -u ssh -n 20`. Мы получили эту ошибку, когда сделали владельцем `/srv/sftp/sftpuser` самого пользователя. Верните владельца командами `chown root:root /srv/sftp/sftpuser` и `chmod 755 /srv/sftp/sftpuser`.

</details>

<details>

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

Пользователь пытается записать файл в корень своей папки chroot, а она принадлежит `root`. Так и должно быть. Файлы нужно класть во вложенную папку `files`, в неё пользователь попадает сразу после входа.

</details>

<details>

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

Это не ошибка. Пользователь из группы `sftponly` может работать только по SFTP, а вход в командную строку по SSH ему запрещён.

</details>

<details>

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

Сервер не принял ни ключ, ни пароль. Мы получили эту ошибку, подключаясь пользователем `sftpuser` без ключа и без пароля. Проверьте имя пользователя и пароль, а если пароль ещё не задан, задайте его командой `passwd sftpuser`. Если вы входите по ключу, публичный ключ нужно положить в `/home/sftpuser/.ssh/authorized_keys`, именно в домашнюю папку, а не в папку chroot. Подробнее о ключах рассказано в статье про [SSH-ключи](https://docs.f3cloud.com/ru/vps/security/ssh-klyuchi.md).

</details>

***

## Наши ресурсы

**Telegram-канал:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Официальный сайт:** [https://f3cloud.com](https://f3cloud.com/ru)
