Làm cách nào để phát hiện hoặc ghi nhật ký tải lên bị gián đoạn với máy chủ SFSS OpenSSH?


9

Tôi gặp vấn đề này khi một khách hàng của chúng tôi đã bị cắt xén dữ liệu SFTP. Tôi không chắc vấn đề là của chúng tôi hay của anh ấy. Tôi đã kích hoạt ghi nhật ký SFTP nhưng nó không cho phép tôi phát hiện nếu quá trình tải lên bị gián đoạn.

Ví dụ: nếu tôi kích hoạt ứng dụng khách sftp và nhấn ^Cvào giữa quá trình tải lên, máy chủ sẽ chỉ nói một cái gì đó giống như close "/data/README.md" bytes read 0 written 5366, không thể phân biệt được với tải lên không bị gián đoạn.

Tôi đoán một cái gì đó giống như .parttiền tố sẽ hoạt động nhưng bằng cách xem các bài đăng khác về lỗi máy chủ, tôi không nghĩ rằng nó có thể với máy chủ sftp của OpenSSH.

Vì vậy, có cách nào để tôi phát hiện nếu quá trình tải lên tệp bị gián đoạn không?

Câu trả lời:


8

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_opentrong 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 logittuyê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 sftpbị 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


1
Ồ, bạn đã làm winSCP ?? Lớn lên anh chàng. Cảm ơn câu trả lời, tôi sẽ làm điều đó.
surjikal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.