Передача файлов на VPS по SFTP и пользователь только для файлов

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

15 октября 2026 г.·3 мин чтения·sftp, ssh, filezilla, ubuntu, debian

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 — он шифрует и дедуплицирует.