Вопрос: Как обнаружить или зарегистрировать прерванные загрузки с помощью SFTP-сервера OpenSSH?


У меня есть эта проблема, когда нашим клиентом были SFTP-ing усеченные данные. Я не уверен, что проблема на нашем конце или его. Я включил регистрацию SFTP, но это не позволяет мне обнаружить, была ли прервана загрузка.

Например, если я запустил sftp-клиент и ударил ^C в середине загрузки сервер просто говорит что-то вроде close "/data/README.md" bytes read 0 written 5366, который неотличим от непрерывной загрузки.

Я думаю, что-то вроде .part префикс работал бы, но, смотря на другие сообщения по ошибке сервера, я не думаю, что это возможно с сервером sftp OpenSSH.

Итак, есть ли способ определить, была ли прервана загрузка файла?


9
2017-12-15 10:42


Источник




Ответы:


Я предполагаю, что с помощью «sftp client» вы обращаетесь к клиенту OpenSSH SFTP. «Проблема» в том, что когда вы нажимаете Ctrl + C,, он останавливает загрузку и полностью закрывает удаленный файл, точно так же, как если загрузка полностью завершена (обратите внимание, что это правильное поведение, и многие другие SFTP-клиенты ведут себя одинаково). Таким образом, сервер абсолютно не может сказать, что загрузка была прервана.


Ну, строго говоря, он имеет, так как клиент OpenSSH отправляет подсказку размера на сервер при создании файла. Но сервер OpenSSH не использует и не регистрирует эту информацию. Хотя было бы довольно просто изменить свой код для регистрации размера, если это вариант для вас.

Видеть process_open в sftp-server.c:

a = get_attrib();
flags = flags_from_portable(pflags);
mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ? a->perm : 0666;
logit("open \"%s\" flags %s mode 0%o",
    name, string_from_portable(pflags), mode);

Изменить logit заявление:

logit("open \"%s\" flags %s mode 0%o size %llu",
    name, string_from_portable(pflags), mode, (unsigned long long)a->size);

Обратите внимание, что отправка подсказки размера необязательна. Хотя некоторые SFTP-клиенты отправят его (например, OpenSSH или WinSCP), некоторые не будут (например, PSFTP, FileZilla или LFTP). В таком случае вы получите 0 в a->size,


Если клиент действительно прервал загрузку (без закрытия удаленного файла, например, когда sftp убит), вы могли бы сказать это из «принудительного» префикса «закрыть» запись:

принудительное закрытие "/data/README.md" байт прочитано 0 написано 5366


8
2017-12-15 11:21



Ничего себе, ты сделал winSCP ?? Большой придурок. Спасибо за ответ, я сделаю это. - surjikal