Tôi giả sử rằng bằng "sftp client", bạn đề cập đến một máy khách SFTP OpenSSH. "Vấn đề" là khi bạn nhấn Ctrl+C, nó dừng tải lên và đóng sạch tệp từ xa, giống như khi quá trình tải lên hoàn tất (lưu ý rằng đó là một hành vi đúng và nhiều máy khách SFTP khác hoạt động tương tự). Vì vậy, máy chủ hoàn toàn không có cách nào để nói rằng quá trình tải lên bị gián đoạn.
Nói đúng ra, vì ứng dụng khách OpenSSH gửi gợi ý kích thước đến máy chủ khi tạo tệp. Nhưng máy chủ OpenSSH không sử dụng và thậm chí không đăng nhập thông tin đó. Mặc dù sẽ khá đơn giản để sửa đổi mã của nó để ghi kích thước, nếu đó là một tùy chọn cho bạn.
Xem process_open
trong 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);
Thay đổi logit
tuyên bố thành:
logit("open \"%s\" flags %s mode 0%o size %llu",
name, string_from_portable(pflags), mode, (unsigned long long)a->size);
Lưu ý rằng gửi gợi ý kích thước là tùy chọn. Mặc dù một số khách hàng SFTP sẽ gửi nó (ví dụ OpenSSH hoặc WinSCP), một số khách hàng sẽ không (ví dụ: PSFTP, FileZilla hoặc LFTP). Trong trường hợp như vậy, bạn sẽ nhận được 0 in a->size
.
Nếu khách hàng thực sự hủy bỏ việc tải lên (mà không đóng tệp từ xa một cách sạch sẽ, ví dụ như khi sftp
bị giết), bạn sẽ có thể nói với nó từ tiền tố "bắt buộc" thành bản ghi "đóng":
buộc đóng "/data/README.md" byte đọc 0 được viết 5366