Bagaimana cara mendeteksi atau mencatat unggahan yang terputus dengan server OpenSSH SFTP?

9

Saya memiliki masalah ini di mana pelanggan kami adalah data terpotong SFTP. Saya tidak yakin apakah masalahnya ada di pihak kita. Saya telah mengaktifkan pencatatan SFTP tetapi tidak memungkinkan saya mendeteksi jika unggahan telah terganggu.

Misalnya, jika saya menjalankan klien sftp, dan menekan ^Cdi tengah unggahan, server hanya mengatakan sesuatu seperti close "/data/README.md" bytes read 0 written 5366, yang tidak dapat dibedakan dari unggahan yang tidak terputus.

Saya kira sesuatu seperti .partawalan akan bekerja tetapi dengan melihat posting lain tentang kesalahan server, saya tidak berpikir itu mungkin dengan server sftp OpenSSH.

Jadi, apakah ada cara bagi saya untuk mendeteksi jika unggahan file telah terputus?

surjikal
sumber

Jawaban:

8

Saya berasumsi bahwa dengan "sftp client" Anda merujuk ke klien SFTP OpenSSH. "Masalahnya" adalah ketika Anda menekan Ctrl+C, itu menghentikan pengunggahan dan dengan bersih menutup file jarak jauh, sama seperti jika pengunggahan selesai sepenuhnya (perhatikan bahwa itu adalah perilaku yang benar dan banyak klien SFTP lainnya berperilaku sama). Jadi server sama sekali tidak memiliki cara untuk mengatakan bahwa unggahan itu terputus.


Yah itu benar-benar telah, karena klien OpenSSH mengirimkan petunjuk ukuran ke server saat membuat file. Tetapi server OpenSSH tidak menggunakan atau bahkan mencatat informasi itu. Meskipun akan sangat sederhana untuk memodifikasi kodenya untuk mencatat ukuran, jika itu pilihan bagi Anda.

Lihat process_opendi 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);

Ubah logitpernyataan menjadi:

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

Perhatikan bahwa pengiriman ukuran petunjuk adalah opsional. Sementara beberapa klien SFTP akan mengirimkannya (misalnya OpenSSH atau WinSCP), beberapa tidak akan (misalnya PSFTP, FileZilla, atau LFTP). Dalam kasus seperti itu, Anda akan mendapatkan 0 in a->size.


Seandainya klien benar-benar membatalkan pengunggahan (tanpa menutup file jarak jauh dengan bersih, misalnya ketika sftpterbunuh), Anda akan dapat mengetahuinya dari awalan "terpaksa" untuk merekam "tutup":

paksa ditutup "/ data /README.md" byte baca 0 ditulis 5366

Martin Prikryl
sumber
1
Wow, Anda membuat winSCP ?? Bung besar dude. Terima kasih atas jawabannya, saya akan melakukannya.
surjikal