Передача файлов через SSH — один из самых надёжных способов обмена данными между удалёнными серверами или локальными машинами. В отличие от FTP или HTTP, протокол SSH (Secure Shell) шифрует весь трафик, защищая информацию от перехвата. Но как правильно организовать перенос файлов, если вы никогда этого не делали? Какие инструменты выбрать — консольные утилиты вроде scp и rsync или графические клиенты типа WinSCP?

В этой статье мы разберём все актуальные методы: от базовых команд для Linux/macOS до настроек для Windows, а также типичные ошибки, которые могут прервать передачу. Вы узнаете, как копировать файлы между серверами без потери данных, синхронизировать папки с минимальной нагрузкой на сеть и даже автоматизировать резервное копирование. Особое внимание уделим проблеме обрыва соединения при передаче больших файлов (>10 ГБ) и способам её решения через настройку тайм-аутов SSH.

1. Базовые команды для переноса файлов: scp и sftp

Начнём с классики — утилиты scp (Secure Copy Protocol), которая входит в стандартный набор инструментов OpenSSH. Её синтаксис прост, но требует понимания структуры команды. Например, чтобы скопировать файл report.txt с локальной машины на удалённый сервер, используйте:

scp /путь/к/report.txt пользователь@сервер:/путь/на/сервере/

Обратите внимание на ключевые элементы команды:

  • 🔹 Локальный путь — откуда копируем (может быть относительным или абсолютным).
  • 🔹 Учётные данные — имя пользователя и адрес сервера (или IP).
  • 🔹 Удалённый путь — куда сохраняем (обязательно с двоеточием перед путём!).

Для обратного копирования (с сервера на локальную машину) просто поменяйте местами пути:

scp пользователь@сервер:/путь/на/сервере/report.txt /локальный/путь/

Альтернатива scp — интерактивный протокол sftp, который работает как FTP, но через SSH. Он удобен для навигации по файловой системе удалённого сервера:

sftp пользователь@сервер

put локальный_файл.txt # Загрузить на сервер

get удалённый_файл.txt # Скачать с сервера

exit

⚠️ Внимание: При использовании scp для рекурсивного копирования папок (scp -r) проверьте свободное место на целевом диске. Команда не предупреждает о переполнении, а прерванная передача может оставить неполные файлы.
📊 Какой протокол вы чаще используете для передачи файлов?
  • SSH (scp/sftp)
  • FTP
  • HTTP/HTTPS
  • Облачные сервисы (Google Drive, Dropbox)
  • Другой

2. Продвинутая синхронизация с rsync: почему это лучше scp

Если вам нужно не просто скопировать файлы, а синхронизировать папки с учётом изменений, rsync станет идеальным решением. Эта утилита передаёт только различия между файлами, экономя трафик и время. Базовая команда для синхронизации локальной папки с удалённым сервером:

rsync -avz -e ssh /локальная/папка/ пользователь@сервер:/удалённая/папка/

Расшифруем ключи:

  • 🔹 -a — архивный режим (сохраняет права доступа, владельца, временные метки).
  • 🔹 -v — подробный вывод (verbose) для отслеживания процесса.
  • 🔹 -z — сжатие данных при передаче.
  • 🔹 -e ssh — использование SSH в качестве транспорта.

Преимущества rsync перед scp:

  • 🔹 Возобновление прерванной передачи (с ключом --partial).
  • 🔹 Исключение ненужных файлов (например, --exclude "*.tmp").
  • 🔹 Контроль пропускной способности (--bwlimit=1000 для ограничения до 1000 КБ/с).

Пример синхронизации с исключением временных файлов и ограничением скорости:

rsync -avz --exclude "*.tmp" --bwlimit=5000 -e ssh /backup/ user@192.168.1.100:/remote/backup/

Проверьте свободное место на целевом диске|Убедитесь, что SSH-ключи добавлены в agent|Запустите тестовую синхронизацию с ключом --dry-run|Настройте исключения для ненужных файлов|Ограничьте скорость передачи, если сеть перегружена

-->

3. Перенос файлов в Windows: WinSCP, PuTTY и WSL

Пользователям Windows доступно несколько способов работы с SSH:

  • 🔹 WinSCP — графический клиент с поддержкой SCP и SFTP.
  • 🔹 PuTTY + pscp — консольные утилиты для командной строки.
  • 🔹 WSL (Windows Subsystem for Linux) — полноценный Linux-терминал внутри Windows.

Для начала работы с WinSCP:

  1. Скачайте и установите программу с официального сайта.
  2. Введите данные подключения: хост, имя пользователя, пароль (или путь к ключу SSH).
  3. Выберите протокол SFTP или SCP.
  4. Перетаскивайте файлы между локальной и удалённой панелями.

Если предпочитаете командную строку, используйте pscp (входит в пакет PuTTY):

pscp C:\путь\к\файлу.txt пользователь@сервер:/путь/на/сервере/

Для WSL (например, Ubuntu в Windows) все команды scp/rsync работают так же, как в нативном Linux. Убедитесь, что SSH-сервер запущен на целевой машине:

sudo service ssh start  # Для Ubuntu/Debian
⚠️ Внимание: В Windows 10/11 встроенный SSH-клиент может конфликтовать с PuTTY. Если команды scp не работают, проверьте переменную окружения PATH или используйте полные пути к утилитам (например, C:\Program Files\PuTTY\pscp.exe).

4. Типичные ошибки и их решения

Даже опытные администраторы сталкиваются с проблемами при передаче файлов по SSH. Рассмотрим самые распространённые:

Ошибка Причина Решение
Permission denied (publickey) SSH-ключ не добавлен в authorized_keys или неправильные права на файлы. Проверьте права: chmod 600 ~/.ssh/authorized_keys и chmod 700 ~/.ssh.
Connection timed out Файрвол блокирует порт 22 или сервер не отвечает. Проверьте порт: telnet сервер 22 или nc -zv сервер 22.
scp: ambiguous target Несколько файлов с одинаковыми именами в целевой папке. Укажите полный путь или переименуйте файлы.
rsync: failed to set times on Недостаточно прав для изменения временных меток. Используйте sudo или ключ --no-times.

Ещё одна частая проблема — обрыв соединения при передаче больших файлов. Это происходит из-за тайм-аута SSH-сессии. Решение:

  • 🔹 На сервере отредактируйте /etc/ssh/sshd_config, добавив:
    ClientAliveInterval 60
    

    ClientAliveCountMax 3

  • 🔹 Перезапустите SSH-сервер: sudo systemctl restart sshd.
Как ускорить передачу файлов по SSH?

Используйте сжатие в rsync (-z) или включайте его глобально в /etc/ssh/ssh_config с параметром Compression yes. Также поможет увеличение размера буфера TCP: на сервере добавьте в /etc/sysctl.conf строку net.core.rmem_max=16777216 и примените изменения командой sysctl -p.

5. Автоматизация переноса: cron и SSH-ключи без пароля

Для регулярного резервного копирования или синхронизации файлов настройте автоматические задачи с помощью cron и SSH-ключей без пароля. Это исключит необходимость вводить credentials при каждом подключении.

Шаги для настройки:

  1. Сгенерируйте ключ на локальной машине (если ещё нет):
    ssh-keygen -t ed25519 -C "backup-key"
  2. Скопируйте публичный ключ на сервер:
    ssh-copy-id пользователь@сервер
  3. Проверьте подключение без пароля:
    ssh пользователь@сервер
  4. Добавьте задачу в cron (например, ежедневное резервное копирование в 2:00):
    0 2 * * * rsync -avz --delete /данные/ пользователь@сервер:/backup/данные/

Для Windows аналогичную автоматизацию можно настроить через Планировщик заданий (Task Scheduler), запуская скрипт с pscp или rsync из WSL.

⚠️ Внимание: Ключи без пароля удобны, но повышают риск компрометации. Ограничьте их использование конкретными командами в ~/.ssh/authorized_keys с префиксом command="rsync --server --sender -vlogDtprze.iLsfxCIve . /backup/".
0 2 * * * rsync -avz /данные/ пользователь@сервер:/backup/ 2>&1 | logger -t backup_rsync

Просматривайте логи командой journalctl -t backup_rsync или в /var/log/syslog.

-->

6. Альтернативные инструменты: rclone, lftp и облачные бэкапы

Если SSH по какой-то причине не подходит, рассмотрите альтернативы:

  • 🔹 rclone — утилита для синхронизации с облачными хранилищами (Google Drive, S3, Dropbox) и SFTP. Пример:
    rclone copy /локальная/папка remote:sftp:/удаленная/папка/ --sftp-host сервер --sftp-user пользователь
  • 🔹 lftp — продвинутый FTP-клиент с поддержкой SFTP и возможностью возобновления закачки:
    lftp -e "set sftp:connect-program 'ssh -a -x -T'; mirror -R /локальная/папка /удаленная/папка" -u пользователь,пароль sftp://сервер
  • 🔹 Облачные сервисы (например, AWS S3 или Backblaze B2) — для географически распределённых бэкапов.

Сравнение инструментов:

Инструмент Протокол Возобновление Сжатие Шифрование
scp SSH ❌ Нет ❌ Нет ✅ Да
rsync SSH ✅ Да (--partial) ✅ Да (-z) ✅ Да
WinSCP SFTP/SCP ✅ Да ❌ Нет ✅ Да
rclone SFTP/Облака ✅ Да ✅ Да ✅ Да
💡

Для передачи файлов >100 ГБ оптимально использовать rsync с ключами --partial --progress -P — это позволит возобновлять передачу и отслеживать прогресс в реальном времени.

FAQ: Частые вопросы о переносе файлов по SSH

Можно ли передавать файлы между двумя удалёнными серверами без локальной машины?

Да, используйте команду rsync с опцией -e ssh и указанием обоих серверов:

rsync -avz -e ssh пользователь1@сервер1:/путь/ пользователь2@сервер2:/путь/

Убедитесь, что между серверами настроен обмен SSH-ключами.

Как передать файлы с сохранением прав доступа и владельца?

Используйте rsync с ключом -a (архивный режим) и --chmod/--chown при необходимости:

rsync -av --chmod=Du=rwx,Dg=rx,Do=rx,Fug=rw,Fo=r --chown=пользователь:группа /источник/ цель/
Почему scp медленно передаёт файлы по сравнению с rsync?

scp копирует файлы целиком, тогда как rsync передаёт только изменения (дельта-копирование) и поддерживает сжатие (-z). Кроме того, rsync оптимизирует использование буферов.

Как защитить передаваемые данные от перехвата в локальной сети?

SSH уже шифрует трафик, но для дополнительной защиты:

  • 🔹 Используйте нестандартный порт SSH (измените в /etc/ssh/sshd_config).
  • 🔹 Настройте fail2ban для блокировки брутфорс-атак.
  • 🔹 Отключите авторизацию по паролю (PasswordAuthentication no).

Можно ли передавать файлы по SSH на Android-устройство?

Да, если на Android установлен SSH-сервер (например, Termux + openssh). Подключайтесь к нему так же, как к обычному Linux-серверу. Для передачи файлов используйте scp или SFTP-клиенты (например, Solid Explorer).