![SSH를 통해 파일을 전송하는 코드는 어떤 프로토콜입니까?](https://linux55.com/image/160239/SSH%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%A0%84%EC%86%A1%ED%95%98%EB%8A%94%20%EC%BD%94%EB%93%9C%EB%8A%94%20%EC%96%B4%EB%96%A4%20%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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.c
scp
, 작동 방식을 간략하게 설명하겠습니다 .
원본 또는 대상이 원격 컴퓨터인 경우 연결하고 해당 컴퓨터에서 프로그램을 시작하는 scp
데 사용됩니다 . 복사 방향이 원격에서 로컬로인 경우 다음과 같이 시작됩니다 (ssh
scp
scp -f src
출처/출처), 그렇지 않으면 scp -t dst
(싱크대), 원주민은 scp
반대 자세를 취합니다.
그런 다음 두 개의 scp 프로세스가 scp 연결의 양쪽에서 실행되어 이를 표준 입력/표준 출력으로 사용하고 이를 통해 파일 데이터와 메타데이터를 전달합니다.
양쪽 끝은 다음 응답을 사용하여 메시지를 확인하거나 특정 오류 조건을 알릴 수 있습니다.
"\0"
: 좋아요"\1%s\n", err_msg
: 치명적이지 않은 오류"\2%s\n", err_msg
: 치명적 오류
전송은 다음으로 시작됩니다.scp로/받기(OK) 확인을 보냅니다 \0
.
그 다음에출처/소스cp다음 메시지가 사용됩니다:
"C%04o %lld %s\n", mode, size, filename
:파일 생성size
다음은 파일 데이터 바이트와 ack(\0
=OK) 입니다 ."D%04o 0 %.1024s\n", mode, dirname
: 디렉토리 시작까지 재귀적으로
C
,D
또는 메시지를 팔로우하세요 .T
"E\n"
: 디렉토리 끝"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