SSH 와 파일 전송 · scp, rsync, sftp 로 파일 옮기기 · 이론
scp 와 rsync 와 sftp, 언제 무엇을
한 줄 요약
세 도구 모두 SSH 채널 위에서 돈다. 차이는 한 번에 다 보내느냐(scp), 차이만 보내느냐(rsync), 대화하듯 주고받느냐(sftp) 다.
왜 이게 필요했나
파일 하나 옮기는 데 도구가 셋이나 있는 이유가 있다. 100MB 파일 하나를 처음 보낼 때와, 10GB 디렉터리를 매일 동기화할 때와, 서버에서 파일 목록을 보며 골라 받을 때는 필요한 성질이 다르다.
어떻게 동작하나
scp — 단순 복사
scp -P 2222 -i ~/.ssh/id_ed25519 ./app.tar.gz root@127.0.0.1:/tmp/scp -r ./dist root@host:/srv/app/scp -p ./config.yaml root@host:/etc/app/ # mtime/권한 보존scp root@host:/var/log/app.log ./ # 내려받기주의할 점 두 가지.
- 포트 옵션은 대문자
-P다. 소문자-p는 "타임스탬프 보존" 이라 뜻이 완전히 다르다. ssh 는 소문자-p가 포트라서 헷갈리기 딱 좋다. - 최근 OpenSSH 의
scp는 내부적으로 SFTP 프로토콜을 쓴다. 그래서 과거에 통하던 일부 경로 확장(원격 셸이 글롭을 처리하던 동작)이 달라졌다. 옛 동작이 필요하면-O로 레거시 프로토콜을 강제할 수 있다.
scp 는 재개가 안 된다. 90% 에서 끊기면 처음부터 다시다. 그래서 큰 전송에는 부적합하다.
rsync — 차이만 보내기
rsync -aHAX --numeric-ids --delete --dry-run /srv/data/ backup@host:/backup/data/rsync -avz -e 'ssh -p 2222 -i ~/.ssh/id_labhub' ./dist/ root@127.0.0.1:/srv/app/옵션의 정확한 의미를 알아야 한다.
-a(archive)는-rlptgoD와 같다. 재귀·심링크·권한·시각·그룹·소유자·특수 파일.-a에 포함되지 않는 것이 있다. ACL(-A), 확장 속성(-X), 하드 링크(-H) 는 따로 지정해야 한다. 이걸 모르면 복원 후 권한이 미묘하게 달라진다.--numeric-ids는 이름 대신 숫자 UID/GID 를 쓴다. 다른 시스템으로 복원할 때 소유자가 엉뚱하게 매핑되는 것을 막는다.-n(--dry-run)과-i(--itemize-changes)는 항상 함께 쓰는 습관을 들이면 좋다.
그리고 후행 슬래시 규칙. 이게 rsync 에서 가장 많이 틀리는 지점이다.
rsync -a /srv/data /backup/ # /backup/data/... 가 만들어진다rsync -a /srv/data/ /backup/ # /backup/... 에 내용이 바로 들어간다원본 경로 끝의 슬래시는 "이 디렉터리의 내용을 복사한다", 없으면 "이 디렉터리 자체를 복사한다" 는 뜻이다.
--delete 는 파괴적이다. 원본이 비어 있거나 마운트가 풀린 상태에서 실행되면 대상 데이터를 전부 지운다. 실무에서 실제로 자주 나는 사고다. 스크립트에는 반드시 가드를 넣는다.
set -euo pipefail[ "$(ls -A "$SRC" | wc -l)" -gt 0 ] || { echo "source empty, abort" >&2; exit 1; }rsync -aHAX --numeric-ids --delete "$SRC/" "$DST"세대 백업은 하드 링크로 값싸게 만든다.
rsync -aHAX --delete --link-dest=/backup/daily.1 /srv/data/ /backup/daily.0/--link-dest 는 바뀌지 않은 파일을 복사하는 대신 지정 디렉터리의 파일에 하드 링크를 건다. 각 세대가 전체 스냅샷처럼 보이지만 디스크는 변경분만 차지한다.
sftp — 대화형/배치
sftp -P 2222 -i ~/.ssh/id_labhub root@127.0.0.1sftp -b /root/batch.txt -P 2222 root@127.0.0.1배치 파일에 cd, put, get, ls, mkdir 를 적어 두면 비대화형으로 실행된다. 파트너사와 파일을 주고받는 자동화에서 여전히 많이 쓰인다. ChrootDirectory + ForceCommand internal-sftp 조합으로 셸 없는 전송 전용 계정을 만들 수 있는 것도 sftp 의 강점이다.
현장에서 만나는 모습
세대 백업을 하드 링크를 모르는 도구로 복사해 용량이 3배가 되는 사고. --link-dest 로 아낀 공간이 복사 한 번에 날아간다. -H 는 -a 에 포함되지 않으므로 반드시 따로 지정해야 한다.
대역폭을 다 먹어 서비스를 방해하는 백업. --bwlimit=50M 과 ionice -c 3 nice -n 19 조합으로 우선순위를 낮춘다. 백업이 운영을 방해하지 않으면 오히려 주기를 줄일 여유가 생긴다.
다음 실습에서 할 것
두 실습을 이어서 한다. 먼저 scp 와 sftp 로 파일을 왕복시키고 체크섬으로 무결성을 확인한다. 그다음 rsync 로 후행 슬래시 차이·--delete 가드·--link-dest 세대 백업을 직접 만든다.