ฉันถือว่าโดย "ลูกค้า SFTP" คุณอ้างถึงไคลเอนต์ OpenSSH SFTP "ปัญหา" คือเมื่อคุณกดCtrl+Cมันจะหยุดการอัปโหลดและปิดไฟล์ระยะไกลอย่างสะอาดราวกับว่าการอัปโหลดเสร็จสมบูรณ์ (โปรดทราบว่ามันเป็นพฤติกรรมที่ถูกต้องและไคลเอนต์ SFTP อื่น ๆ อีกมากมายทำงานเหมือนกัน) ดังนั้นเซิร์ฟเวอร์จึงไม่มีทางที่จะบอกได้ว่าการอัพโหลดถูกขัดจังหวะ
มีการพูดอย่างเคร่งครัดเนื่องจากลูกค้า OpenSSH ส่งคำแนะนำขนาดไปยังเซิร์ฟเวอร์เมื่อสร้างไฟล์ แต่เซิร์ฟเวอร์ OpenSSH ไม่ได้ใช้หรือแม้แต่บันทึกข้อมูลนั้น แม้ว่ามันจะค่อนข้างง่ายในการปรับเปลี่ยนรหัสเพื่อบันทึกขนาดถ้าเป็นตัวเลือกสำหรับคุณ
ดูprocess_open
ใน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);
เปลี่ยนlogit
คำสั่งเป็น:
logit("open \"%s\" flags %s mode 0%o size %llu",
name, string_from_portable(pflags), mode, (unsigned long long)a->size);
โปรดทราบว่าการส่งคำใบ้ขนาดเป็นทางเลือก ในขณะที่ไคลเอนต์ SFTP บางรายจะส่ง (เช่น OpenSSH หรือ WinSCP) แต่บางอย่างจะไม่ (เช่น PSFTP, FileZilla หรือ LFTP) ในกรณีดังกล่าวคุณจะได้รับ a->size
0
หากลูกค้ายกเลิกการอัพโหลดอย่างแท้จริง (โดยไม่ต้องปิดไฟล์ระยะไกลอย่างหมดจดเช่นเมื่อsftp
ถูกฆ่า) คุณจะสามารถบอกได้จากคำนำหน้า "บังคับ" ถึงบันทึก "ปิด":
บังคับปิด "/data/README.md" ไบต์อ่าน 0 เขียน 5366