scp로 파일 전송하기
scp(secure copy)는 SSH 위에서 동작하는 파일 복사 도구다. 로컬 ↔ 원격, 원격 ↔ 원격 사이의 파일/디렉터리를 SSH 채널로 암호화해서 옮긴다. 즉, SSH로 접속할 수 있는 서버라면 별도 데몬 없이 바로 쓸 수 있다 — 파일 전송 전용 포트를 따로 열거나 FTP 서버를 띄울 필요가 없다는 뜻이다. 인증·암호화·신원 확인 모두 SSH 인프라를 그대로 재활용한다.
기본 문법
scp [options] SOURCE DESTINATION
원격 경로는 user@host:path 형식이다. path가 비어 있으면 그 사용자의 홈 디렉터리 기준이다.
로컬 → 원격:
scp file.txt user@server:/home/user/
원격 → 로컬:
scp user@server:/home/user/file.txt ./
원격 → 원격 (양쪽 다 SSH로 접근 가능할 때):
scp user1@host1:/path/file user2@host2:/path/
자주 쓰는 옵션
| 옵션 | 의미 |
|---|---|
-r | 디렉터리 재귀 복사 |
-P 22 | SSH 포트 지정 (소문자 -p는 ssh와 달리 "권한·타임스탬프 보존"이라 헷갈리지 말 것) |
-i key.pem | 특정 SSH 키 파일 사용 |
-p | 원본 파일의 권한·timestamp 유지 |
-C | 전송 중 압축 (느린 네트워크에서 효과) |
-q | 진행률 출력 끄기 |
디렉터리 통째로 보내기:
scp -r ./project user@server:/home/user/
비표준 SSH 포트 + 키 파일:
scp -P 2222 -i ~/.ssh/id_ed25519 file.txt user@server:/path/
Windows에서 쓰기
Windows 10 1809 이상이라면 OpenSSH 클라이언트가 기본 탑재되어 있다. PowerShell이나 cmd에서 scp 명령어를 그대로 칠 수 있다.
scp C:\Users\me\file.txt user@server:/home/user/
경로 구분자가 헷갈릴 수 있는데, 로컬(Windows) 쪽은 백슬래시, 원격(Linux) 쪽은 슬래시로 쓴다. 공백이 들어간 경로는 따옴표로 감싼다:
scp "C:\My Folder\file.txt" user@server:/home/user/
설치되어 있지 않다면 설정 → 앱 → 선택적 기능 → OpenSSH 클라이언트 추가.
주의: scp의 한계
scp는 단순하고 어디서나 되지만 약점이 분명하다:
- 재개 불가. 전송 도중 끊기면 처음부터 다시. 큰 파일에서 치명적.
- 변경분만 보내기 같은 똑똑한 짓 못 함. 디렉터리를 두 번 복사하면 그냥 전부 다시 전송한다.
- 진행률 표시도 단순한 편.
그래서 실무 권장 흐름은 대략 이렇다:
| 상황 | 도구 |
|---|---|
| 작은 파일 한두 개 | scp |
| 큰 파일, 디렉터리, 동기화, 재개 필요 | rsync over SSH |
| 대화형으로 둘러보며 받기 | sftp |
rsync는 변경된 부분만 보내고 끊겨도 이어받을 수 있다. 한 번 익혀두면 scp를 거의 안 쓰게 된다:
rsync -avzP ./project/ user@server:/home/user/project/
동작 원리 한 줄
scp는 클라이언트가 SSH로 원격에 접속한 뒤, 원격에서 scp 바이너리를 실행해 두 프로세스가 stdin/stdout으로 파일 데이터를 주고받는 구조다. 그래서 양쪽 모두에 scp가 설치돼 있어야 한다 (대부분의 Linux 배포판은 openssh-clients에 포함되어 기본 설치).
참고로 OpenSSH 9.0부터는 scp의 내부 프로토콜이 SFTP 기반으로 바뀌었다. 사용자 입장에서 명령어는 똑같지만, 내부적으로는 더 안전하고 표준화된 경로를 탄다.
관련
- ssh — scp가 올라타는 기반 프로토콜
- rsync — 더 똑똑한 대안
- ssh-key-authentication — 매번 비밀번호 입력 안 하려면