Presumo che per "client sftp" ti riferisca a un client SFTP OpenSSH. Il "problema" è che quando si preme Ctrl+C, interrompe il caricamento e chiude in modo pulito il file remoto, proprio come se il caricamento fosse completamente completato (si noti che si tratta di un comportamento corretto e molti altri client SFTP si comportano allo stesso modo). Quindi il server non ha assolutamente modo di dire che il caricamento è stato interrotto.
In senso stretto, poiché il client OpenSSH invia un suggerimento dimensioni al server durante la creazione del file. Ma il server OpenSSH non utilizza né registra tali informazioni. Anche se sarebbe abbastanza semplice modificare il suo codice per registrare la dimensione, se questa è un'opzione per te.
Vedi process_open
in 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);
Cambia la logit
dichiarazione in:
logit("open \"%s\" flags %s mode 0%o size %llu",
name, string_from_portable(pflags), mode, (unsigned long long)a->size);
Si noti che l'invio del suggerimento sulla dimensione è facoltativo. Mentre alcuni client SFTP lo invieranno (es. OpenSSH o WinSCP), altri no (es. PSFTP, FileZilla o LFTP). In tal caso, otterrai 0 pollici a->size
.
Se il client avesse davvero interrotto il caricamento (senza chiudere il file remoto in modo pulito, ad esempio quando sftp
è stato ucciso), si sarebbe in grado di dirlo dal prefisso "forzato" a "chiudere" il record:
chiusura forzata "/data/README.md" byte letti 0 scritti 5366