Zakładam, że przez „klienta sftp” odnosisz się do klienta OpenSSH SFTP. „Problem” polega na tym, że po naciśnięciu Ctrl+Czatrzymuje przesyłanie i czysto zamyka plik zdalny, tak jakby przesyłanie zostało całkowicie zakończone (zwróć uwagę, że jest to prawidłowe zachowanie i wielu innych klientów SFTP zachowuje się tak samo). Tak więc serwer nie ma absolutnie żadnego sposobu, aby stwierdzić, że przesyłanie zostało przerwane.
Ściśle mówiąc, tak, ponieważ klient OpenSSH przesyła wskazówkę dotyczącą rozmiaru do serwera podczas tworzenia pliku. Ale serwer OpenSSH nie używa ani nawet nie rejestruje tych informacji. Chociaż zmodyfikowanie kodu w celu zarejestrowania rozmiaru byłoby dość proste, jeśli jest to opcja dla ciebie.
Zobacz process_open
w 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);
Zmień logit
instrukcję na:
logit("open \"%s\" flags %s mode 0%o size %llu",
name, string_from_portable(pflags), mode, (unsigned long long)a->size);
Pamiętaj, że przesłanie wskazówki dotyczącej rozmiaru jest opcjonalne. Chociaż niektórzy klienci SFTP go wyślą (np. OpenSSH lub WinSCP), inni nie (np. PSFTP, FileZilla lub LFTP). W takim przypadku otrzymasz 0 w a->size
.
Gdyby klient naprawdę przerwał przesyłanie (bez czystego zamknięcia zdalnego pliku, np. Kiedy sftp
został zabity), byłbyś w stanie odróżnić go od „wymuszonego” prefiksu do „zamknięcia” zapisu:
wymuszone zamknięcie bajtów „/data/README.md” odczytano 0 zapisano 5366