관리 메뉴

Snow flake

[command] scp, rsync 명령어 본문

Programming/Linux

[command] scp, rsync 명령어

MAYSON 2026. 9. 15. 03:19
반응형

tar/gzip으로 압축한 파일을 다른 서버로 옮기거나, 여러 서버 간에 파일을 동기화해야 하는 상황은 인프라 작업에서 정말 자주 생깁니다. 이때 사용하는 명령어가 scp와 rsync입니다. 둘 다 파일을 다른 서버로 전송하는 명령어지만, 동작 방식과 효율성에 차이가 있습니다.

scp (Secure Copy)

scp는 Secure Copy의 약자로, SSH 프로토콜을 이용해 로컬과 원격 서버 간에 파일을 안전하게 복사하는 명령어입니다.

# 사용법
scp [옵션] [원본 경로] [사용자명@호스트:목적지 경로]

# 로컬 파일을 원격 서버로 전송
scp oracle_19c_install.tar.gz oracle@192.168.0.10:/software/

# 원격 서버 파일을 로컬로 가져오기
scp oracle@192.168.0.10:/software/oracle_19c_install.tar.gz .

# 디렉토리 전체를 전송 (-r 옵션 필수)
scp -r /home/oracle/scripts oracle@192.168.0.10:/home/oracle/

파일 하나만 옮길 때는 경로만 지정하면 되고, 디렉토리를 통째로 옮기려면 -r(recursive) 옵션을 꼭 붙여야 합니다. scp는 사용법이 단순하고 직관적이라 급하게 파일 하나 옮길 때 부담 없이 쓸 수 있습니다.

scp 주요 옵션

# -P : SSH 포트를 기본값(22)이 아닌 다른 포트로 지정
scp -P 2222 backup.tar.gz oracle@192.168.0.10:/backup/

# -i : 특정 SSH 키 파일 지정
scp -i ~/.ssh/id_rsa backup.tar.gz oracle@192.168.0.10:/backup/

# -p : 파일의 수정 시간, 권한 정보 그대로 유지
scp -p backup.tar.gz oracle@192.168.0.10:/backup/

# -v : 상세 진행 과정 출력 (문제 생겼을 때 원인 파악용)
scp -v backup.tar.gz oracle@192.168.0.10:/backup/

-P는 대문자라는 점을 주의해야 합니다. 소문자 -p는 전혀 다른 의미(파일 속성 유지)로 쓰이기 때문에 헷갈리기 쉬운 옵션입니다.

scp의 한계

scp는 매번 파일 전체를 새로 전송합니다. 예를 들어 10GB 파일 중 1MB만 바뀌었어도, scp는 10GB를 처음부터 다시 통째로 전송합니다. 파일이 크고 반복적으로 동기화해야 하는 상황에서는 이 방식이 비효율적입니다.

rsync (Remote Sync)

rsync는 Remote Sync의 약자로, 원본과 대상 파일을 비교해서 변경된 부분만 전송하는 명령어입니다. 처음 전송할 때는 scp와 비슷하게 전체를 보내지만, 이후 다시 실행하면 바뀐 부분만 골라서 전송하기 때문에 훨씬 빠르고 효율적입니다.

# 사용법
rsync [옵션] [원본 경로] [사용자명@호스트:목적지 경로]

# 로컬 디렉토리를 원격 서버로 동기화
rsync -avz /home/oracle/logs/ oracle@192.168.0.10:/backup/logs/

# 원격 서버 디렉토리를 로컬로 동기화
rsync -avz oracle@192.168.0.10:/home/oracle/logs/ /backup/logs/

rsync 주요 옵션

# --delete : 원본에는 없는데 대상에만 있는 파일을 삭제해서 완전히 동일하게 맞춤
rsync -avz --delete /home/oracle/logs/ oracle@192.168.0.10:/backup/logs/

# -n (--dry-run) : 실제 전송 없이 어떤 파일이 전송될지 미리 확인
rsync -avzn /home/oracle/logs/ oracle@192.168.0.10:/backup/logs/

# --progress : 전송 진행률 표시 (대용량 파일 전송 시 유용)
rsync -avz --progress backup.tar.gz oracle@192.168.0.10:/backup/

--delete 옵션은 강력하지만 위험할 수도 있습니다. 대상 서버에만 있던 파일이 원본에 없으면 그대로 삭제되기 때문에, 실행 전에 -n(dry-run)으로 먼저 시뮬레이션해보고 결과를 확인한 후 실제로 실행하는 습관이 안전합니다.

scp와 rsync, 언제 뭘 써야 할까

- 한 번만 파일이나 디렉토리를 옮기면 되는 경우 → scp (단순하고 빠르게 쓰기 좋음)
- 반복적으로 동기화해야 하거나, 대용량 파일 중 일부만 바뀌는 상황 → rsync (변경분만 전송해서 효율적)

디렉토리 슬래시(/) 표기에도 주의가 필요합니다. rsync에서 원본 경로 끝에 /를 붙이면 그 디렉토리 "안의 내용물"이 대상 경로에 복사되고, /를 붙이지 않으면 디렉토리 자체가 통째로 대상 경로 밑에 복사됩니다. 의도와 다른 결과가 나오는 경우가 많아, 처음 쓸 때 -n(dry-run)으로 먼저 확인해보는 것을 권장합니다.

실무에서 자주 마주치는 상황

DB 백업 파일을 원격 백업 서버에 주기적으로 동기화하는 상황을 예로 들어보겠습니다.

# 1단계: 백업 대상 디렉토리 용량 확인
du -sh /backup/oracle_db/

# 2단계: 처음 한 번은 전체 백업 전송 (scp로도 가능하지만 rsync 권장)
rsync -avz /backup/oracle_db/ backup_server:/remote_backup/oracle_db/

# 3단계: 다음날부터는 변경된 파일만 자동으로 동기화됨
rsync -avz --delete /backup/oracle_db/ backup_server:/remote_backup/oracle_db/

# 4단계: 실제 적용 전 어떤 파일이 바뀌는지 먼저 확인하고 싶을 때
rsync -avzn --delete /backup/oracle_db/ backup_server:/remote_backup/oracle_db/

매일 반복되는 백업 동기화 작업이라면 rsync가 압도적으로 효율적입니다. 전체 백업을 매번 새로 전송하는 것과, 바뀐 부분만 전송하는 것의 시간 차이가 크기 때문입니다. 반면 일회성으로 설치 파일 하나를 신규 서버에 전달하는 경우처럼 단순한 상황이라면, tar/gzip 글에서 다뤘던 것처럼 scp만으로도 충분합니다.

다만 실제 운영 환경등의 보안 등급이 높은 환경은 망분리 정책상 서버 간 SSH 접속 자체가 막혀있거나, scp/rsync 같은 원격 전송 명령어가 방화벽 정책으로 제한되는 경우가 흔합니다. 그래서 rsync가 기술적으로는 효율적이어도, 실제로는 그 환경에서 애초에 쓸 수 있는지부터 확인해야 하는 경우가 많습니다.

반응형

'Programming > Linux' 카테고리의 다른 글

[command] ln 명령어  (0) 2026.09.20
[command] awk, sed 명령어  (0) 2026.09.15
[command] tar, gzip 명령어  (1) 2026.09.13
[command] df, du 명령어  (0) 2026.09.12
[command] ps, kill 명령어  (0) 2026.09.11
Comments