Come rilevare o registrare i caricamenti interrotti con il server SFTP OpenSSH?


9

Ho questo problema quando un nostro cliente ha inviato dati troncati SFTP. Non sono sicuro che il problema sia da parte nostra o sua. Ho abilitato la registrazione SFTP ma non mi consente di rilevare se un caricamento è stato interrotto.

Ad esempio, se accendo il client sftp e premo ^Cnel mezzo del caricamento, il server dice semplicemente qualcosa del genere close "/data/README.md" bytes read 0 written 5366, che è indistinguibile da un caricamento ininterrotto.

Immagino che qualcosa come un .partprefisso funzionerebbe, ma guardando altri post in errore del server, non penso che sia possibile con il server sftp di OpenSSH.

Quindi, c'è un modo per me di rilevare se un caricamento di file è stato interrotto?

Risposte:


8

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_openin 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 logitdichiarazione 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


1
Wow, hai fatto winSCP ?? Ragazzi grandi. Grazie per la risposta, lo farò.
Surjikal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.