Devin.KR
로그인

리눅스 scp 명령어 사용법 - 원격 파일 복사 옵션과 실전 예제

개발자 조회 2

이 명령어를 언제 쓰는가

서버에서 로그 파일 하나를 내려받거나, 수정한 설정 파일 하나를 올릴 때 쓴다. scp는 ssh 통로 위에서 파일을 복사하는 명령이라 별도 데몬이나 포트를 열 필요가 없고, ssh 로 접속되는 서버라면 그대로 쓸 수 있다.

범위는 딱 여기까지로 잡는 편이 좋다. 파일이 수백 개거나, 전송이 끊겨 재시도해야 하거나, 바뀐 것만 보내고 싶다면 그건 rsync 영역이다. scp 는 단발성 소량 전송에 손이 가장 덜 가는 도구다.

기본 형식

scp [옵션] 원본 대상
  • 원격 경로사용자@호스트:경로 형태로 쓴다. 콜론이 원격이라는 표시다.
  • 원본과 대상 중 한쪽만 원격일 수도 있고, 양쪽 다 원격일 수도 있다.
  • 경로에 콜론을 빠뜨리면 원격 전송이 아니라 로컬 파일 복사가 된다. 오류 없이 조용히 엉뚱한 파일이 생긴다.

자주 쓰는 옵션

옵션의미예시
-P 포트접속 포트(대문자 P)scp -P 22022 a.conf deploy@10.0.1.20:/tmp/
-r디렉터리를 통째로 복사scp -r dist/ deploy@10.0.1.20:/var/www/
-i 키파일개인키 지정scp -i ~/.ssh/prod.pem a.log ec2-user@1.2.3.4:~
-p수정 시각과 권한을 보존(소문자 p)scp -p app.jar deploy@10.0.1.20:/opt/app/
-C전송 중 압축. 느린 회선에서 효과가 있다scp -C big.sql deploy@10.0.1.20:/tmp/
-3원격 → 원격 전송을 내 PC 를 거쳐 중계scp -3 a:/tmp/x b:/tmp/
-q진행률 표시 없음. 스크립트용scp -q a.conf host:/tmp/
-o 설정=값ssh 설정 항목 지정-o StrictHostKeyChecking=accept-new

실전 예제

1. 로컬 파일을 서버로 올린다. 수정한 nginx 설정을 임시 경로에 올려두고, 서버에서 확인 후 옮기는 흐름이다. 처음부터 /etc 로 바로 쏘지 않는 것이 안전하다.

scp -P 22022 nginx.conf deploy@10.0.1.20:/tmp/nginx.conf

2. 서버의 로그를 내려받는다. 장애 분석을 위해 특정 시간대 로그를 가져올 때 쓴다.

scp deploy@10.0.1.20:/var/log/nginx/error.log ./error-web01.log
error.log                          100%  2412KB   8.1MB/s   00:00

여러 대에서 받을 때는 위처럼 받는 쪽 파일명에 서버 이름을 붙인다. 안 그러면 다음 서버 파일이 앞의 것을 덮어쓴다.

3. 여러 파일을 한 번에 받는다. 와일드카드는 원격 셸이 해석하므로 따옴표로 감싸야 한다.

scp 'deploy@10.0.1.20:/var/log/nginx/access.log-2026082*' ./logs/

4. 빌드 산출물 디렉터리를 통째로 올린다. -r 은 심볼릭 링크를 실제 파일로 바꿔 복사한다는 점만 기억한다.

scp -r -P 22022 dist/ deploy@10.0.1.20:/var/www/app/

5. ssh 설정의 별칭을 그대로 쓴다. ~/.ssh/configHost prod-web 을 정의해 두었다면 포트도 키도 적을 필요가 없다. 배스천 경유(ProxyJump)도 자동으로 따라간다.

scp app.jar prod-web:/opt/app/app.jar

함정과 주의점

포트 옵션이 ssh 와 대소문자가 다르다. ssh 는 -p, scp 는 -P 다. scp 에서 소문자 -p타임스탬프 보존이라 알 수 없는 옵션이라는 오류가 나지 않는다. scp -p 22022 a.conf host:/tmp/ 를 치면 22022 는 포트가 아니라 복사할 파일 이름으로 읽히고, 접속은 기본 포트 22 로 간다. 그래서 ssh 는 되는데 scp 만 안 된다는 증상이 나온다. 포트를 바꾼 서버에서 매번 걸리는 지점이다.

대상 경로 끝에 슬래시를 붙이는 습관을 들인다. scp a.conf host:/etc/nginx 에서 /etc/nginx 디렉터리가 없으면, 오류 대신 nginx 라는 이름의 파일이 만들어진다. 오타 한 글자가 조용히 엉뚱한 파일을 남긴다. host:/etc/nginx/ 로 쓰면 디렉터리가 없을 때 명확히 실패한다.

대용량·다수 파일에는 쓰지 않는다. scp 는 중단된 지점부터 재개할 수 없어, 10GB 전송이 99% 에서 끊기면 처음부터다. 또 파일마다 왕복이 생겨 작은 파일 수천 개에서는 rsync 보다 몇 배 느리다. rsync -avzP 로 바꾸면 두 문제가 함께 해결된다.

OpenSSH 9.0 부터 내부 동작이 SFTP 로 바뀌었다. 겉보기 사용법은 같지만, 원격 와일드카드 처리 등 세부 동작이 예전과 달라 오래된 스크립트가 깨지는 경우가 있다. 급하면 scp -O 로 옛 방식을 강제할 수 있으나, 근본 해결은 rsync 나 sftp 로 옮기는 것이다.

함께 보면 좋은 명령어

  • rsync — 반복 전송, 대용량, 재개, 삭제 동기화가 필요하면 처음부터 이쪽을 쓴다.
  • ssh — scp 는 ssh 설정을 그대로 따르므로 ~/.ssh/config 를 먼저 정리하면 둘 다 편해진다.
  • tar — 파일이 많을 때 묶어서 한 덩어리로 보내면 전송이 훨씬 빠르다.