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

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

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

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

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



답변

“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