Проверьте последний ответ FTP, прежде чем доверять загрузке
Ответ 150 означает, что передача началась, а не что файл сохранён. Разделите локальное чтение, разрешение на запись, соединение данных и последний ответ.
Клиент FTP может принять команду put намного раньше, чем сервер получит файл, и именно в разрыве между этими двумя событиями живёт большинство загадок загрузки. Должны завершиться четыре этапа: локальный файл прочитан, сервер принял запрос на сохранение, соединение данных перенесло байты, а передача дошла до окончательного положительного ответа. Сравнивать этапы полезнее, чем сравнивать клиентов, потому что успешный вход и появившееся имя файла оба останавливаются до финиша.
Предварительный и окончательный ответ
Для STOR ответ 125 или 150 является предварительным. Он говорит, что сервер готов попробовать и что открывается соединение данных, а не что объект существует в окончательном виде. Операция завершена только тогда, когда передача достигает положительного ответа о завершении, обычно 226 или 250, в контексте этой операции.
426 означает, что передача была прервана, а номер, напечатанный другой командой, не является результатом этой загрузки. Читайте ответ, относящийся к этому STOR, а не последний номер на экране. Если клиент завершает работу до прихода этого ответа, у вас нет никаких доказательств завершения.
Управляющее соединение и соединение данных
Аутентификация и список каталога используют управляющее соединение. Байты используют отдельное соединение данных, и его конечная точка согласуется для каждой передачи. Успешный вход доказывает управляющий путь и ничего не говорит о том, доступен ли адрес данных со стороны клиента.
Когда сервер не может открыть соединение данных, исследуйте согласованную конечную точку и разрешённый путь. Пассивный режим всё равно требует пригодных адреса данных и порта, а брандмауэр или устройство NAT между клиентом и сервером может пропускать управляющий сеанс, блокируя диапазон данных. Когда сервер вместо этого отклоняет запрос на сохранение, смотрите удалённое имя пути, права или ограничения хранилища. Ни одну из ветвей не объясняет то, что управляющее соединение прошло аутентификацию.
FTP через TLS и SFTP
FTP через TLS — это по-прежнему FTP: два соединения, ответы FTP и обновление TLS на каждом из них. SFTP — подсистема SSH с одним соединением и совершенно другим набором команд. У них общая цель и почти ничего больше, поэтому диагностика, переходящая между ними, обычно начинается со сравнения не тех журналов.
Не отключайте TLS, чтобы промежуточный помощник мог просмотреть сеанс, и не считайте сбой SFTP проблемой ответа FTP. руководство curl описывает явный TLS, пассивный режим и параметры загрузки, если нужен тест из скрипта, и служит справочником о том, что на самом деле меняет каждый флаг.
Выберите протокол, который служба действительно предлагает, прежде чем отлаживать её. Сервер, который говорит только по SFTP, никогда не выдаст ответ 226, как бы ни был настроен клиент.
Видимое имя файла и сохранённый объект
Видимое имя файла может обозначать неполный объект, особенно после прерванной передачи или клиента, завершившего работу раньше времени. Попросите владельца службы сравнить размер предполагаемого тестового файла и доверенный хеш содержимого с сохранённым объектом, когда ожидается сохранность байтов.
Двоичный режим и ASCII — ещё одно сравнение, которое меняет результат. Режим ASCII может преобразовывать переводы строк, поэтому сохранённые байты отличаются от локального файла, даже если передача прошла успешно. Оставляйте двоичный режим для проверки байт в байт и не добавляйте параметры преобразования, чтобы неудачная передача выглядела иначе.
Обычный STOR может заменить существующий файл, а право входа или просмотра каталога не даёт права создавать или заменять в нём объект. Для теста используйте ранее не использованное удалённое имя.
Что сравнить перед повторной попыткой
Не добавляйте, не возобновляйте и не повторяйте загрузку вслепую поверх неопределённого частичного файла. Договоритесь с владельцем, начинать ли заново под новым именем, использовать поддерживаемую службой процедуру восстановления или удалить неудачный тестовый объект.
Запишите результат как одно из четырёх утверждений: локальное чтение не удалось, в сохранении отказано, передача данных прервана, либо передача завершилась и сохранённые байты совпали. Такая запись — более сильный результат, чем одновременное изменение оболочки, VPN и настроек FTP до появления имени файла, и она подсказывает следующему человеку, какой этап проверять. Сохраните очищенный текст ответа вместе с этим утверждением. Тогда повторная попытка — решение, а не рефлекс.