Eu assumo que por "cliente sftp" você se refere a um cliente OpenSSH SFTP. O "problema" é que quando você pressiona Ctrl + C , ele pára o upload e fecha de forma limpa o arquivo remoto, como se o upload tivesse terminado completamente (note que é um comportamento correto e muitos outros SFTP os clientes se comportam da mesma forma). Então o servidor não tem absolutamente nenhum jeito de dizer que o upload foi interrompido.
Bem, falando estritamente, como o cliente OpenSSH envia uma dica de tamanho para o servidor ao criar o arquivo. Mas o servidor OpenSSH não usa nem registra essas informações. Embora seja bem simples modificar seu código para registrar o tamanho, se isso for uma opção para você.
Veja process_open
em 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);
Altere a declaração logit
para:
logit("open \"%s\" flags %s mode 0%o size %llu",
name, string_from_portable(pflags), mode, (unsigned long long)a->size);
Observe que o envio da dica de tamanho é opcional. Embora alguns clientes de SFTP enviem-no (por exemplo, OpenSSH ou WinSCP), alguns não o farão (por exemplo, PSFTP, FileZilla ou LFTP). Nesse caso, você receberá 0 em a->size
.
Se o cliente realmente abortasse o upload (sem fechar o arquivo remoto corretamente, por exemplo, quando sftp
é eliminado), você seria capaz de dizer o prefixo "forçado" para "fechar" o registro:
forced close "/data/README.md" bytes read 0 written 5366