
SSH позволяет передавать файлы по зашифрованному соединению и проверять сервер по его ключу. Для разовой передачи удобен scp, для интерактивной работы и управляемого пакетного обмена — SFTP. Это разные интерфейсы к одной инфраструктуре доступа; открывать дополнительный FTP-сервис для такого обмена не требуется.
Материал рассчитан на OpenSSH в Linux, macOS и Windows. В примерах files.example.net, jump.example.net, пользователь ops и порт 2222 — учебные значения. Перед выполнением замените их своими, проверьте права и подготовьте каталог назначения. Команды не создают рабочую инфраструктуру автоматически.

1. Проверьте клиент, доступ и свободное место
Начните с версии клиента и обычного подключения. Для Linux/macOS используйте терминал; для Windows — PowerShell с установленным клиентом OpenSSH.
ssh -V
ssh -p 2222 ops@files.example.net
На сервере проверьте каталог назначения, владельца, свободное место и квоту. Пользователь должен иметь ровно нужные права. Наличие SSH-входа не гарантирует доступ к любому файлу и не гарантирует включённую SFTP-подсистему.
Руководство scp описывает передачу локальных и удалённых файлов. В современных OpenSSH, начиная с 9.0, scp по умолчанию использует SFTP; изменение описано в release notes OpenSSH 9.0. Старый SCP-протокол выбирается отдельно; не считайте его стандартным решением ошибки нового сервера.
2. Проверьте ключ сервера до передачи данных
Получите fingerprint ключа сервера через доверенную консоль, администратора или согласованный реестр инфраструктуры. Для собственного сервера fingerprint публичного ключа можно прочитать локально на нём:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Сравните его с предложенным клиентом ключом при первом подключении. Путь относится к типичной установке OpenSSH; фактический тип ключа может отличаться. Получение ключа через ssh-keyscan само по себе не подтверждает его подлинность: сбор и доверенная проверка — разные этапы.
После доверенной регистрации используйте StrictHostKeyChecking yes. Если ключ внезапно изменился, выясните причину: переустановка, миграция, неверный адрес или возможная подмена. Не устраняйте предупреждение безусловным удалением всей базы known_hosts.
3. Задайте повторяемое подключение в SSH config
Пример пользовательского ~/.ssh/config сокращает команды и фиксирует параметры подключения. Приватный ключ создают и передают серверу штатным способом; пример не содержит ключа или пароля.
Host office-files
HostName files.example.net
User ops
Port 2222
IdentityFile ~/.ssh/id_ed25519_office
IdentitiesOnly yes
StrictHostKeyChecking yes
ForwardAgent no
ConnectTimeout 10
Проверьте права приватного ключа и файла конфигурации. В Unix приватный ключ не должен читаться другими пользователями; в Windows проверяют ACL. Назначение опций описано в ssh_config.
Теперь ssh office-files, scp ... office-files:... и sftp office-files используют одну конфигурацию. Для задания без человека после подготовки ключа добавляют BatchMode yes; отсутствие интерактивного запроса не отменяет контроль результата и журналирование.
4. Как отправить файл и скачать его обратно
Создайте на сервере каталог incoming в домашнем каталоге нужного пользователя. Затем передайте локальный файл в подготовленный путь:
ssh office-files 'mkdir -p /home/ops/incoming'
scp ./report.csv office-files:/home/ops/incoming/report.csv
scp office-files:/home/ops/incoming/report.csv ./report-downloaded.csv
Повторная передача на существующее имя способна перезаписать файл. Для важных данных используйте новое имя или отдельный каталог запуска, а не существующий рабочий файл приложения. Строка после двоеточия — путь на сервере; путь без ведущего / обычно относится к его домашнему каталогу.
Без config нестандартный порт задают scp -P 2222: буква P заглавная. Маленькая -p относится к сохранению времён и режима доступа. Пути с пробелами заключайте в кавычки. Для сложных имён избегайте догадок о двойном shell-экранировании: удобнее интерактивный SFTP и проверка списка файлов.
5. Как передать каталог и что не сохраняет scp
Для рекурсивной передачи используйте выбранный каталог, предварительно оценив его объём и содержимое:
scp -r ./release-test office-files:/home/ops/incoming/
Различайте копирование файлов и полноценную резервную копию. Обычный scp не создаёт согласованный снимок активно изменяющейся базы и не обещает сохранить все ACL, расширенные атрибуты и владельцев. Рекурсивный scp следует по символическим ссылкам: дерево может захватить больше данных, чем ожидалось.
Для файлов приложения сформируйте согласованный архив с нужными метаданными или используйте подходящий инструмент синхронизации. Отдельная инструкция о rsync объясняет повторную передачу и сравнение дерева. Не запускайте копирование каталога базы как замену её штатного backup.
6. Как пользоваться SFTP и возобновлять передачу
SFTP предоставляет интерактивные команды для удалённого и локального каталогов. Пример сеанса после подключения:
sftp office-files
pwd
lpwd
ls -l
lcd ./exports
cd /home/ops/incoming
put report.csv report.csv.part
get result.csv ./result-downloaded.csv
bye
Эти строки выполняют внутри клиента SFTP, а не целиком в обычной оболочке. lcd меняет локальный каталог, cd — удалённый. Сначала убедитесь, что локальный exports и удалённый incoming существуют.
Продолжение поддерживают reget/reput либо соответствующий режим клиента. Оно допустимо только для того же неизменившегося файла: если уже переданная часть отличается, результат может быть повреждён. Это ограничение прямо отмечено в руководстве SFTP. После продолжения сравните контрольные суммы; размер сам по себе недостаточен.
7. Как организовать пакетную передачу без пароля в сценарии
Сохраните команды в локальный transfer.sftp, предварительно выбрав уникальные имена для конкретного запуска. Каталог назначения должен существовать, а ключ и known_hosts — быть подготовлены.
put ./report.csv /home/ops/incoming/report-20261010.csv.part
rename /home/ops/incoming/report-20261010.csv.part /home/ops/incoming/report-20261010.csv
Запуск:
sftp -b ./transfer.sftp office-files
Имя с датой — пример: повторный запуск в тот же день не гарантирует уникальность. Для промышленного обмена используйте ID задания и заранее определите поведение при существующем конечном файле. Batch-режим останавливается при ошибках стандартных операций; не добавляйте префикс подавления ошибки к обязательным шагам.
Передача в .part отделяет незавершённый файл от имени, которое читает потребитель. Переименование внутри одного файлового пространства помогает сделать публикацию файла отдельным шагом, но не заменяет проверку содержимого, согласованность приложения и ограничения конкретного SFTP-сервера.
8. Как проверить байты и принять файл
На Linux сравните SHA-256 локального и удалённого файла. Для неизменяющегося тестового файла пример выглядит так:
sha256sum ./report.csv
ssh office-files 'sha256sum /home/ops/incoming/report.csv'
На macOS используйте shasum -a 256, в PowerShell — Get-FileHash -Algorithm SHA256 -LiteralPath '.\report.csv'. Сверяйте хеш и размер именно выбранного файла. Если сервер выдаёт только SFTP и не разрешает shell, скачайте контрольную копию либо используйте согласованный серверный manifest.
Для CSV дополнительно проверьте кодировку, заголовки и число строк; для архива — целостность и ожидаемое дерево. Передача с кодом завершения 0 не означает успешный импорт приложением. Приёмка завершается проверкой потребителя и регистрацией ID задания.
9. Как передавать через jump host и искать неисправность
Добавьте отдельный host для шлюза и ProxyJump в целевой блок. На обоих узлах проверьте ключи; передача через шлюз не требует включать forwarding вашего агента.
Host office-jump
HostName jump.example.net
User ops
StrictHostKeyChecking yes
ForwardAgent no
Host office-files
ProxyJump office-jump
Второй блок дополняет уже показанные параметры office-files. Сначала проверьте ssh office-files, затем SFTP. Диагностические ssh -v или scp -v показывают выбор ключа и этап отказа; журнал может содержать внутренние адреса и имена, поэтому передавайте только нужный фрагмент.
Permission denied может означать отказ аутентификации или прав на файл: различайте момент появления ошибки. Subsystem request failed требует проверки SFTP-подсистемы администратором сервера. Ошибка host key не исправляется отключением проверки, а нехватка места — повторными запусками.
10. Как завершить передачу и вернуться к прежнему состоянию
Сохраните источник, получателя, ID запуска, сумму, время и результат проверки приложения. Если файл должен заменить рабочий, отдельно выполните утверждённую процедуру: резервная копия прежней версии, корректные права, переключение и проверка сервиса.
При ошибке удаляйте только подтверждённый временный объект конкретного задания после проверки пути. Не очищайте каталог incoming целиком. Если заменён рабочий файл, возвращайте именно сохранённую версию; повторная загрузка старых байтов не гарантирует возврата состояния базы или внешней интеграции.
Ограниченная учётная запись, проверенный ключ сервера, промежуточное имя и контроль содержимого превращают разовую команду копирования в воспроизводимую административную операцию.
