Wie erkenne oder protokolliere ich unterbrochene Uploads mit dem OpenSSH SFTP-Server?

9

Ich habe dieses Problem, wenn ein Kunde von uns abgeschnittene SFTP-Daten verwendet hat. Ich bin mir nicht sicher, ob das Problem bei uns oder bei ihm liegt. Ich habe die SFTP-Protokollierung aktiviert, kann jedoch nicht erkennen, ob ein Upload unterbrochen wurde.

Wenn ich zum Beispiel den SFTP-Client starte und ^Cmitten im Upload drücke, sagt der Server nur so etwas wie close "/data/README.md" bytes read 0 written 5366, was von einem ununterbrochenen Upload nicht zu unterscheiden ist.

Ich denke, so etwas wie ein .partPräfix würde funktionieren, aber wenn man sich andere Beiträge zum Serverfehler ansieht, denke ich nicht, dass dies mit dem SFTP-Server von OpenSSH möglich ist.

Gibt es eine Möglichkeit für mich zu erkennen, ob ein Datei-Upload unterbrochen wurde?

surjikal
quelle

Antworten:

8

Ich gehe davon aus, dass Sie mit "sftp client" auf einen OpenSSH SFTP-Client verweisen. Das "Problem" besteht darin, dass beim Drücken Ctrl+Cder Upload gestoppt und die Remote-Datei sauber geschlossen wird, als ob der Upload vollständig abgeschlossen wäre (beachten Sie, dass es sich um ein korrektes Verhalten handelt und sich viele andere SFTP-Clients gleich verhalten). Der Server kann also absolut nicht feststellen, dass der Upload unterbrochen wurde.


Genau genommen hat dies der Fall, da der OpenSSH-Client beim Erstellen der Datei einen Größenhinweis an den Server sendet. Der OpenSSH-Server verwendet diese Informationen jedoch nicht und protokolliert sie nicht einmal. Obwohl es ziemlich einfach wäre, den Code zu ändern, um die Größe zu protokollieren, wenn dies eine Option für Sie ist.

Siehe 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);

Ändern Sie die logitAnweisung in:

logit("open \"%s\" flags %s mode 0%o size %llu",
    name, string_from_portable(pflags), mode, (unsigned long long)a->size);

Beachten Sie, dass das Senden des Größenhinweises optional ist. Einige SFTP-Clients senden es (z. B. OpenSSH oder WinSCP), andere nicht (z. B. PSFTP, FileZilla oder LFTP). In einem solchen Fall erhalten Sie 0 in a->size.


Hätte der Client den Upload wirklich abgebrochen (ohne die Remote-Datei sauber zu schließen, z. B. wenn sie beendet sftpwird), könnten Sie sie vom "erzwungenen" Präfix zum "Schließen" des Datensatzes unterscheiden:

erzwungenes Schließen "/data/README.md" Bytes gelesen 0 geschrieben 5366

Martin Prikryl
quelle
1
Wow, du hast winSCP gemacht? Big Ups, Alter. Danke für die Antwort, das mache ich.
Surjikal