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