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