OpenSSH SFTP 서버로 중단 된 업로드를 감지하거나 기록하는 방법은 무엇입니까?


9

고객이 SFTP를 사용하여 잘린 데이터를 사용하는 경우이 문제가 있습니다. 문제가 우리 쪽인지 그의 것인지 확실하지 않습니다. SFTP 로깅을 활성화했지만 업로드가 중단되었는지 감지 할 수 없습니다.

예를 들어, sftp 클라이언트 ^C를 시작하고 업로드 도중에 서버 close "/data/README.md" bytes read 0 written 5366가 중단되지 않은 업로드와 구별 할 수없는 것과 같은 것을 말합니다 .

.part접두사 와 같은 것이 작동한다고 생각하지만 서버 결함에 대한 다른 게시물을 보면 OpenSSH의 sftp 서버에서 가능하지 않다고 생각합니다.

파일 업로드가 중단되었는지 감지하는 방법이 있습니까?

답변:


8

"sftp client"는 OpenSSH SFTP client를 참조한다고 가정합니다. "문제"는을 누르면 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). 이 경우 0이 0이됩니다 a->size.


클라이언트가 실제로 업로드를 중단 한 경우 (예 : 종료시 원격 파일을 완전히 닫지 않고 sftp) "forced"접두사에서 "close"레코드로 파일 을 알릴 수 있습니다.

강제 종료 "/data/README.md"바이트 읽기 0 쓰기 5366


1
와우, 당신은 winSCP ?? 빅 업 친구. 답변 주셔서 감사합니다, 내가 할 것입니다.
surjikal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.