Як виявити або зареєструвати перервані завантаження із сервером OpenSSH SFTP?


9

У мене є ця проблема, коли у нашого замовника були усічені дані SFTP. Я не впевнений, чи проблема в нашому кінці чи в його. Я ввімкнув протокол SFTP, але він не дозволяє мені виявити, чи було завантаження перервано.

Наприклад, якщо я запускаю sftp-клієнт і потрапляю ^Cпосеред завантаження, сервер просто говорить щось подібне close "/data/README.md" bytes read 0 written 5366, що не відрізняється від безперебійного завантаження.

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

Отже, чи є спосіб я визначити, чи було перервано завантаження файлу?

Відповіді:


8

Я припускаю, що під "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


1
Вау, ви зробили winSCP ?? Чувак великий зліт. Дякую за відповідь, я це зроблю.
суржикаль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.