用 scp 与 sftp 传文件
한국어 원문으로 표시합니다.
목표
scp 와 sftp 로 파일을 올리고 내리고, 타임스탬프를 보존하고, 체크섬으로 무결성을 확인합니다.
왜 중요한가
전송이 "끝났다" 는 것과 "제대로 갔다" 는 것은 다른 말입니다. 실무에서는 항상 체크섬으로 확인합니다. 그리고 scp 의 포트 옵션이 대문자 -P 라는 사실은 사소해 보이지만, ssh 는 소문자가 포트라서 실제로 자주 틀립니다. 소문자 -p 는 타임스탬프 보존이라 조용히 다른 일을 하고 넘어갑니다. sftp 배치 모드는 파트너사와의 파일 교환 자동화에서 여전히 표준적으로 쓰입니다.
이 실습에서 127.0.0.1:2222 는 다른 서버라고 생각하세요. 앞 실습에서 만든 /root/.ssh/id_labhub 키를 그대로 씁니다.
단계
/root/xfer/src디렉터리를 만들고 그 안에a.txt(1KB 이상),b.txt(1KB 이상),c.bin(10KB 이상) 세 파일을 만드세요.- 원격의
/root/xfer/dst/디렉터리를 만들고a.txt를 그리로 올리세요. /root/xfer/src디렉터리 전체를 원격의/root/xfer/tree/아래로 재귀 복사하세요. 결과적으로/root/xfer/tree/src/b.txt가 존재해야 합니다.- 원격의
/root/xfer/dst/a.txt를 로컬/root/xfer/back/으로 내려받으세요. /root/xfer/batch.txt에 sftp 배치 명령을 적고 실행하세요. 배치는/root/xfer/src/c.bin을 원격/root/xfer/dst/로 올려야 합니다. 실행 로그를/root/xfer/sftp.log로 저장하세요.b.txt를 타임스탬프를 보존한 채 원격/root/xfer/dst/로 복사하고, 원본과 사본의 mtime(초 단위)을 각각 한 줄씩/root/xfer/mtime.txt에 적으세요. 두 값이 같아야 합니다./root/xfer/src의 세 파일에 대한 sha256 매니페스트를 만들고,/root/xfer/dst와/root/xfer/tree/src에 도착한 파일들의 해시가 일치하는지 검증해 결과를/root/xfer/verify.txt로 저장하세요./root/xfer/notes.txt를 다음 3줄로 만드세요.SCP_PORT_FLAG=-P/SSH_PORT_FLAG=-p/SCP_PRESERVE_FLAG=-p
참고
scp -P 2222 -i /root/.ssh/id_labhub <원본> root@127.0.0.1:<대상>형태입니다.- 원격에서 디렉터리를 만들려면
ssh lab2 mkdir -p /root/xfer/dst처럼 명령을 원격 실행하면 됩니다. - sftp 배치 파일 예시는
cd /root/xfer/dst다음 줄에put /root/xfer/src/c.bin입니다. - 흔한 실수 1: 2번에서 소문자
-p를 써서 포트가 22 로 가는 경우. 접속 자체가 실패합니다. - 흔한 실수 2: 3번에서 대상 경로 끝의 슬래시 유무에 따라 디렉터리 깊이가 달라집니다. 요구된 최종 경로를 확인하세요.
전송할 파일 준비
/root/xfer/src 디렉터리를 만들고 그 안에 a.txt(1KB 이상), b.txt(1KB 이상), c.bin(10KB 이상) 세 파일을 만드세요.
크기가 다른 파일 세 개면 충분합니다. head 나 dd 로 만들어도 되고 base64 로 채워도 됩니다.
파일 올리기
원격의 /root/xfer/dst/ 디렉터리를 만들고 a.txt 를 그리로 올리세요.
포트 지정은 대문자 옵션입니다. 소문자는 뜻이 완전히 다르니 주의하세요.
디렉터리 통째로 올리기
/root/xfer/src 디렉터리 전체를 원격의 /root/xfer/tree/ 아래로 재귀 복사하세요. 결과적으로 /root/xfer/tree/src/b.txt 가 존재해야 합니다.
디렉터리를 보내려면 재귀 옵션이 필요합니다. 대상 경로가 없으면 미리 만들어 두세요.
내려받기
원격의 /root/xfer/dst/a.txt 를 로컬 /root/xfer/back/ 으로 내려받으세요.
원격 경로를 앞에, 로컬 경로를 뒤에 씁니다. 원격 표기는 사용자@호스트:경로 형식입니다.
sftp 배치 실행
/root/xfer/batch.txt 에 sftp 배치 명령을 적고 실행하세요. 배치는 /root/xfer/src/c.bin 을 원격 /root/xfer/dst/ 로 올려야 합니다. 실행 로그를 /root/xfer/sftp.log 로 저장하세요.
sftp 에는 명령 목록을 파일에서 읽는 옵션이 있습니다. 배치 파일에는 한 줄에 명령 하나씩 씁니다.
타임스탬프 보존
b.txt 를 타임스탬프를 보존한 채 원격 /root/xfer/dst/ 로 복사하고, 원본과 사본의 mtime(초 단위)을 각각 한 줄씩 /root/xfer/mtime.txt 에 적으세요. 두 값이 같아야 합니다.
보존 옵션은 소문자입니다. stat 으로 mtime 을 비교해 확인하세요.
무결성 검증
/root/xfer/src 의 세 파일에 대한 sha256 매니페스트를 만들고, /root/xfer/dst 와 /root/xfer/tree/src 에 도착한 파일들의 해시가 일치하는지 검증해 결과를 /root/xfer/verify.txt 로 저장하세요.
sha256sum 으로 매니페스트를 만들고 -c 로 검사합니다. 원본과 사본이 같은 이름을 가지도록 경로를 맞추면 편합니다.
옵션 정리 노트
/root/xfer/notes.txt 를 다음 3줄로 만드세요.
SCP_PORT_FLAG=-P / SSH_PORT_FLAG=-p / SCP_PRESERVE_FLAG=-p
scp 와 ssh 에서 포트 옵션의 대소문자가 다르다는 점이 핵심입니다. 값은 정확한 문자로 적으세요.