Передача файлов на VPS по SFTP и пользователь только для файлов
Как копировать файлы на сервер по SFTP из терминала и FileZilla, и как создать пользователя, запертого в одной папке через ChrootDirectory. Ubuntu 24.04, Debian 12.

SFTP — это передача файлов внутри SSH. Отдельный сервер ставить не нужно: если вы заходите на сервер по SSH, SFTP уже работает на том же порту 22 с теми же пользователями и ключами. Обычный FTP для нового сервера не нужен вообще — он гоняет пароль открытым текстом.
Что нужно
- Сервер на tanaka.host с Ubuntu 24.04 или Debian 12 и доступом по SSH.
- На своём компьютере — программа
sftp. В macOS и Linux она есть, в Windows входит в компонент OpenSSH Client (работает в PowerShell).
1. SFTP из терминала
sftp root@IP-адрес-сервера
Если SSH слушает другой порт — sftp -P 2222 root@IP. Внутри сессии команды похожи на shell, только есть две стороны: локальная (l-команды) и удалённая.
| Команда | Что делает |
|---|---|
ls, cd, pwd, mkdir |
на сервере |
lls, lcd, lpwd |
на вашем компьютере |
put файл |
отправить на сервер |
get файл |
скачать с сервера |
put -r папка / get -r папка |
рекурсивно |
reput / reget |
докачать оборванную передачу |
bye |
выйти |
Пример сессии:
mkdir site-backup
cd site-backup
put report.txt
ls -l
get report.txt report-copy.txt
bye
Для одного файла быстрее scp, а для синхронизации папок — rsync по SSH:
scp ./backup.tar.gz root@IP:/root/
rsync -avz --progress ./site/ root@IP:/var/www/site/
2. FileZilla и другие графические клиенты
В FileZilla в поле «Хост» пишите адрес с префиксом sftp://, иначе программа попробует обычный FTP и получит отказ:
Хост: sftp://203.0.113.10 Имя: root Пароль: ... Порт: 22
Ключ вместо пароля: «Правка → Настройки → SFTP → Добавить файл ключа». Тот же протокол умеют WinSCP, Cyberduck, встроенная панель в Termius и MobaXterm.
3. Пользователь только для SFTP
Задача: дать заказчику или скрипту доступ к одной папке, но не к shell и не к остальному диску. Делается через группу и ChrootDirectory в sshd.
Группа и пользователь без оболочки:
groupadd sftponly
useradd -m -d /home/sftpuser -s /usr/sbin/nologin -G sftponly sftpuser
passwd sftpuser
Папка для chroot. Правило sshd: сам корень chroot и все папки над ним должны принадлежать root и не быть доступными на запись никому другому. Поэтому записываем не в корень, а во вложенную папку files:
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
Конфигурация SSH. Сначала копия на случай опечатки:
cp /etc/ssh/sshd_config /root/sshd_config.bak
nano /etc/ssh/sshd_config
В конец файла (блок Match должен быть ниже всех обычных директив):
Match Group sftponly
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp -d /files
AllowTcpForwarding no
X11Forwarding no
%u подставляет имя пользователя, -d /files сразу открывает сессию во вложенной папке. Проверяем и применяем:
sshd -t && systemctl reload ssh
На AlmaLinux/Rocky служба называется sshd, а пользователю вместо /usr/sbin/nologin ставьте /sbin/nologin.
Проверка с вашего компьютера:
sftp sftpuser@IP # пускает, видно только /files
ssh sftpuser@IP # This service allows sftp connections only
Для нескольких пользователей просто добавляйте их в sftponly и создавайте /srv/sftp/<имя>/files по той же схеме — блок Match менять не нужно.
Если вход по паролю отключён глобально, а новому пользователю нужен пароль, добавьте в тот же блок
MatchстрокуPasswordAuthentication yes. Лучше всё же выдать ему ключ — положите публичную часть в/home/sftpuser/.ssh/authorized_keys(домашняя папка снаружи chroot, sshd читает её до входа в chroot).
Частые ошибки
| Симптом | Причина | Решение |
|---|---|---|
Connection closed сразу после пароля, в журнале bad ownership or modes for chroot directory |
корень chroot принадлежит не root или доступен на запись группе | chown root:root и chmod 755 для /srv/sftp и /srv/sftp/sftpuser |
Permission denied при put |
пишете в корень chroot | перейдите в files или убедитесь, что -d /files на месте |
ssh sftpuser@IP открывает shell |
пользователь не в группе sftponly или Match стоит выше других директив |
id sftpuser, проверить порядок в конфиге |
| FileZilla: «Не удалось подключиться к серверу» | забыли sftp://, клиент идёт на порт 21 |
исправить адрес |
После reload SSH не работает |
опечатка в конфиге, sshd -t не запускали |
через консоль в кабинете tanaka.host вернуть /root/sshd_config.bak |
Журнал sshd смотреть так: journalctl -u ssh -n 50 (Debian/Ubuntu) или journalctl -u sshd -n 50 (RHEL-семейство).
Регулярную выгрузку файлов с сервера удобнее отдать не SFTP, а restic в S3 — он шифрует и дедуплицирует.