learn

scp로 파일 전송하기

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 22SSH 포트 지정 (소문자 -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 기반으로 바뀌었다. 사용자 입장에서 명령어는 똑같지만, 내부적으로는 더 안전하고 표준화된 경로를 탄다.

관련