LabHub

SSH 와 파일 전송 · scp, rsync, sftp 로 파일 옮기기 · 이론

scp 와 rsync 와 sftp, 언제 무엇을

LabHub 에서 이어서 보기

한 줄 요약

세 도구 모두 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 ./              # 내려받기

주의할 점 두 가지.

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/

옵션의 정확한 의미를 알아야 한다.

그리고 후행 슬래시 규칙. 이게 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=50Mionice -c 3 nice -n 19 조합으로 우선순위를 낮춘다. 백업이 운영을 방해하지 않으면 오히려 주기를 줄일 여유가 생긴다.

다음 실습에서 할 것

두 실습을 이어서 한다. 먼저 scp 와 sftp 로 파일을 왕복시키고 체크섬으로 무결성을 확인한다. 그다음 rsync 로 후행 슬래시 차이·--delete 가드·--link-dest 세대 백업을 직접 만든다.