SSH를 통해 파일을 전송하는 코드는 어떤 프로토콜입니까?

SSH를 통해 파일을 전송하는 코드는 어떤 프로토콜입니까?

SSH 클라이언트를 통해 파일을 전송하기 위한 Go 코드를 읽고 있습니다.

https://github.com/tmc/scp/blob/master/scp.go#L33

그것이 하는 일 중 하나는 scp -t /remote/path그 깃발 -t의 용도가 무엇입니까? 하나 만들었 man scp는데 문서화되지 않은 것 같습니다. 로컬에서 명령을 실행했는데 고양이처럼 동작하는 것 같았습니다.

원격으로 실행되면 scp -t코드는 다음과 같이 서버에 바이트를 보냅니다.

// Some special control header? What is this?
fmt.Fprintf(w, "C%#o %d %s\n", mode, size, fileName)
// Send file bytes.
io.Copy(w, contents)
// Send termination signal?
fmt.Fprint(w, "\x00")

이 계약은 무엇입니까? 어디에도 문서화되어 있나요?

답변1

AFAIK, scp 프로토콜은 소스 코드 이외의 다른 곳에 문서화되어 있지 않습니다.scp.cscp, 작동 방식을 간략하게 설명하겠습니다 .

원본 또는 대상이 원격 컴퓨터인 경우 연결하고 해당 컴퓨터에서 프로그램을 시작하는 scp데 사용됩니다 . 복사 방향이 원격에서 로컬로인 경우 다음과 같이 시작됩니다 (sshscpscp -f src출처/출처), 그렇지 않으면 scp -t dst(싱크대), 원주민은 scp반대 자세를 취합니다.

그런 다음 두 개의 scp 프로세스가 scp 연결의 양쪽에서 실행되어 이를 표준 입력/표준 출력으로 사용하고 이를 통해 파일 데이터와 메타데이터를 전달합니다.

양쪽 끝은 다음 응답을 사용하여 메시지를 확인하거나 특정 오류 조건을 알릴 수 있습니다.

  1. "\0": 좋아요

  2. "\1%s\n", err_msg: 치명적이지 않은 오류

  3. "\2%s\n", err_msg: 치명적 오류

전송은 다음으로 시작됩니다.scp로/받기(OK) 확인을 보냅니다 \0.

그 다음에출처/소스cp다음 메시지가 사용됩니다:

  1. "C%04o %lld %s\n", mode, size, filename:파일 생성

    size다음은 파일 데이터 바이트와 ack( \0=OK) 입니다 .

  2. "D%04o 0 %.1024s\n", mode, dirname: 디렉토리 시작

    까지 재귀적으로 C, D또는 메시지를 팔로우하세요 .T

  3. "E\n": 디렉토리 끝

  4. "T%llu 0 %llu 0\n", mtime, atime: 파일 시간

    스위치를 사용하는 경우 이 메시지는 C또는 D메시지보다 먼저 전송됩니다.-p

C이러한 메시지는 파일 데이터 전송 전 확인, 파일 데이터 전송 후 확인 등 추가 처리 전에 상대방의 확인을 받아야 합니다 .

위와 메시지에서 파일/디렉토리 이름의 개행 문자와 기타 제어 문자( 및 제외) C는 이스케이프됩니다. , 하지만 그럴 것이다D\t\x7f\^J아니요목적지에 도달한 후에는 탈출할 수 없습니다. 텍스트 \^J\^M원래 이름은 그대로 유지됩니다.

치명적 오류와 치명적이지 않은 오류의 구분은 일관되지 않습니다. 어느 \1쪽이든 (치명적이지 않은) 오류가 발생하지만 그 중 일부는 치명적인 오류로 처리되어 scp오류를 보내거나 받을 때 종료되고 다른 쪽에서는 둘 다 유지됩니다. 부속. \2(치명적인) 오류나 예상치 못한 상황으로 인해 양측 모두 탈퇴할 수 있습니다 .

http와 달리 파일 데이터를 청크로 보내는 규정이 없습니다. 소스가 더 이상 메시지 이후 전송을 시작하는 일부 대형 파일을 읽을 수 없는 경우 scp오류 메시지/nak 이전에 최대 NUL 바이트를 C전송합니다 .size\1

관련 정보