scp 명령어: 사용법과 옵션, 폴더 복사와 포트 지정

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8OpenSSH 9.9p1받는 쪽 Debian 12 · OpenSSH 9.2p1root 계정2026-10-28 확인

SSH로 접속하는 서버와 파일을 주고받을 때 쓰는 복사 도구가 scp입니다. scp 명령어로 파일을 보낼 때는 cp처럼 원본을 앞에, 받을 곳을 뒤에 적습니다. AlmaLinux 9 서버에서 Debian 12 서버로 파일과 폴더를 보내고 받아 온 결과, 전송은 SFTP 프로토콜로 이루어졌고 20MB 파일 하나가 1초 안에 도착했습니다.

아래 출력은 모두 보내는 쪽 root 계정에서 OpenSSH 9.9의 scp로 실행한 결과 그대로입니다. 서버 주소와 계정 이름만 예시 값으로 바꿨습니다.

1️⃣ scp 사용법과 원격 경로

원격 서버 쪽 경로 앞에는 [계정@서버 주소:]를 붙입니다. 콜론이 없는 경로는 명령을 실행한 서버 안의 경로로 인식하므로, 콜론이 붙은 쪽에 따라 보내기와 받기가 정해집니다.

🧭 scp 복사 방향과 원격 경로
설명 다이어그램
↔️ 복사 방향
$ scp report.txt user@203.0.113.10:~/scp-test/user@203.0.113.10:~/scp-test/report.txt ./downloads/-3 user@203.0.113.10:~/scp-test/report.txt user@198.51.100.20:~/scp-test/
원본💻 명령을 실행한 서버report.txt
➜
대상🖥️ 원격 서버203.0.113.10:~/scp-test/
원본🖥️ 원격 서버203.0.113.10:~/scp-test/report.txt
➜
대상💻 명령을 실행한 서버./downloads/
원본🖥️ 원격 서버 A203.0.113.10:~/scp-test/report.txt
➜
중계💻 명령을 실행한 서버-3
➜
대상🖥️ 원격 서버 B198.51.100.20:~/scp-test/
🧩 원격 경로 꼴
user 접속할 계정, 203.0.113.10 서버 주소 또는 도메인, :~/scp-test/ 콜론 뒤는 그 서버의 경로(물결표는 홈 폴더)
로컬 파일을 앞에, 원격 경로를 뒤에 적으면 보내기입니다. 콜론 뒤 경로가 슬래시로 끝나면 그 폴더 안에 같은 이름으로 저장합니다.
원격 경로를 앞에 적으면 받기입니다. 받은 파일은 뒤에 적은 로컬 경로에 남습니다.
원본과 대상이 모두 원격 서버면, OpenSSH 8.7부터는 데이터가 명령을 실행한 서버를 거쳐 갑니다. -3을 붙였을 때와 같은 방식입니다.

지금 폴더의 report.txt를 원격 서버 홈 아래 scp-test 폴더로 보냅니다.

scp report.txt user@203.0.113.10:~/scp-test/
report.txt                                    100%   14     5.1KB/s   00:00

전송이 끝나면 파일 이름과 진행률, 크기, 속도, 소요 시간이 한 줄로 나옵니다. 이 진행 표시는 터미널에서 실행할 때만 나타납니다. 그래서 출력을 파일로 넘겨 실행하면 파일에는 아무것도 남지 않습니다.

받아 올 때는 원격 경로를 앞에, 저장할 로컬 경로를 뒤에 적습니다.

scp user@203.0.113.10:~/scp-test/report.txt ./downloads/
report.txt                                    100%   14     2.7KB/s   00:00

대상 경로를 폴더가 아닌 파일 이름으로 끝내면 그 이름으로 저장됩니다. 아래 명령으로 보낸 뒤 받는 쪽 폴더에는 report.txt가 report-1028.txt라는 이름으로 남아 있었습니다.

scp report.txt user@203.0.113.10:~/scp-test/report-1028.txt
report.txt                                    100%   14     4.6KB/s   00:00

🔲 scp 명령어 시뮬레이터

아래 시뮬레이터에서 보내기와 받기, 폴더 복사 명령을 직접 입력해 옵션별 출력을 확인할 수 있습니다.

scp 명령어 시뮬레이터OpenSSH 9.9
[root@server work]#
브라우저 안에서만 동작하며, 왼쪽 목록에서 원격 쪽 파일을 확인하고 ↑↓ 로 앞에서 쓴 명령을 다시 불러옵니다.

2️⃣ scp 명령어 옵션

옵션은 scp 바로 뒤, 원본 앞에 적습니다. 포트를 지정하는 -P는 대문자이고 소문자 -p는 시각과 권한을 유지하는 옵션이라, 대소문자를 바꿔 입력하면 다른 동작이 실행됩니다.

-l은 전송 속도의 상한을 Kbit/s 단위로 지정합니다. 옵션 없이 20MB 파일을 보냈을 때는 1초 안에 전송이 끝났습니다.

scp backup.tar.gz user@203.0.113.10:~/scp-test/
backup.tar.gz                                 100%   20MB  53.6MB/s   00:00

-l 8000은 초당 약 1,000KB에 해당합니다. 같은 파일을 -l 8000으로 보내 보니 진행 표시의 속도가 996.5KB/s로 나왔고, 전송에는 20초가 소요되었습니다.

scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gz
backup.tar.gz                                 100%   20MB 996.5KB/s   00:20

-C는 SSH 연결에서 데이터를 gzip과 같은 방식으로 압축합니다. 같은 문장이 반복되는 19MB 로그 파일을 세 번씩 보낸 결과, 이 서버 둘 사이에서는 -C를 붙인 쪽이 조금 느렸습니다.

명령파일실행 시간진행 표시 속도
scp backup.tar.gz20MB0.68초53.6MB/s
scp -l 8000 backup.tar.gz20MB20.82초996.5KB/s
scp access.log(3회)19MB0.79~0.89초—
scp -C access.log(3회)19MB0.84~0.97초—

실행 시간은 명령을 시작해 접속하고 전송을 마칠 때까지의 시간입니다. ssh 매뉴얼도 압축은 느린 회선에서 효과가 있고, 빠른 네트워크에서는 전송을 늦춘다고 설명합니다.

-v는 접속부터 전송까지의 과정을 debug1 줄로 출력하므로, 접속이 안 되거나 인증에서 멈출 때 원인을 찾는 데 사용합니다. 출력이 길어 grep으로 인증과 전송 줄만 골랐습니다.

scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'
Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 seconds

[Sending subsystem: sftp] 줄은 scp가 SFTP 프로토콜로 파일을 보냈다는 뜻입니다. OpenSSH 9.0부터 scp는 SFTP를 기본으로 사용합니다. -O를 붙이면 옛 SCP 프로토콜로 전송하고, 같은 자리에 [Sending command: scp -v -t]가 나옵니다.

scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'
Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds

📌 주요 옵션: 이 글에서 실행한 결과

옵션하는 일이 글에서 본 결과
-PSSH 접속 포트를 지정포트 22는 report.txt 전송 완료, 열리지 않은 포트 2222는 [Connection timed out]으로 끝남
-i공개 키 인증에 사용할 개인 키 파일을 지정~/.ssh/id_ed25519를 지정해 report.txt 전송 완료
-r폴더 안의 파일과 하위 폴더까지 복사받는 쪽에 css와 images 폴더가 원본 구조 그대로 남음, 빼면 [not a regular file] 오류로 전송되지 않음
-p원본의 수정 시각과 접근 시각, 권한을 유지수정 시각은 유지, 이 글의 받는 쪽에서 권한 600은 -O -p로 보낸 파일만 유지
-CSSH 연결에서 데이터를 압축이 글의 서버 둘 사이 19MB 로그는 붙인 쪽이 조금 느림
-l전송 속도의 상한을 Kbit/s 단위로 지정-l 8000에 20MB가 996.5KB/s, 20.82초
-v접속부터 전송까지의 과정을 debug1 줄로 출력[Sending subsystem: sftp] 줄로 SFTP 전송을 확인
-3원격 서버 두 대 사이의 데이터를 명령을 실행한 서버를 거쳐 전송(OpenSSH 8.7부터 기본 방식)같은 서버의 두 폴더를 원본과 대상으로 두고 report.txt 전송 완료
-O옛 SCP 프로토콜로 전송-v 출력에 [Sending command: scp -v -t]가 나옴, 공백 경로는 역슬래시가 더 필요
-ossh_config 형식의 옵션을 ssh에 전달ConnectTimeout=10으로 기다리는 시간을 10초로 두고 [Connection timed out] 확인

📎 그 밖의 옵션: 공식 매뉴얼 기준

옵션하는 일
-q진행 표시와 ssh의 경고, 진단 메시지를 끔
-J점프 호스트에 먼저 연결한 뒤 그곳에서 최종 대상까지 TCP 포워딩을 설정(ProxyJump 설정의 단축 지정, 여러 홉은 쉼표로 구분)
-Fssh의 사용자별 설정 파일을 다른 파일로 지정(ssh에 그대로 전달)
-4IPv4 주소만 사용하도록 강제
-6IPv6 주소만 사용하도록 강제

3️⃣ scp 폴더 복사와 시각 유지

폴더를 옵션 없이 지정하면 scp는 일반 파일이 아니라는 오류를 출력하고 전송을 진행하지 않습니다.

scp site-files user@203.0.113.10:~/scp-test/
scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/

-r을 붙이면 폴더 안의 파일과 하위 폴더까지 복사합니다.

scp -r site-files user@203.0.113.10:~/scp-test/
logo.png                                      100%   48KB   4.7MB/s   00:00
style.css                                     100%   15     5.0KB/s   00:00
index.html                                    100%   15     5.2KB/s   00:00

출력에는 파일 이름만 나옵니다. 받는 쪽 find 출력에는 site-files 아래 css와 images 폴더가 원본 구조 그대로 들어 있었습니다.

ssh user@203.0.113.10 'cd ~/scp-test && find site-files'
site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css

-r은 폴더 안의 심볼릭 링크를 따라가 원본 파일을 복사하므로, 링크를 링크 그대로 옮겨야 하는 폴더에는 rsync -a가 맞습니다.

-p는 원본의 수정 시각과 접근 시각, 권한을 유지합니다. 원본 report.txt는 수정 시각을 2026년 10월 1일 00:00(UTC), 권한을 600으로 맞춘 뒤 보냈습니다. 받는 쪽 서버 시간대가 UTC라 보내는 쪽 ls도 TZ=UTC로 출력했습니다.

TZ=UTC ls -l report.txt
-rw------- 1 root root 14 Oct  1 00:00 report.txt
scp -p report.txt user@203.0.113.10:~/scp-test/report-p.txt
report.txt                                    100%   14     4.7KB/s   00:00
scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txt
report.txt                                    100%   14     4.2KB/s   00:00
ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'
-rw------- 1 user user 14 Oct  1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct  1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txt

-p로 보낸 report-p.txt와 -O -p로 보낸 report-Op.txt는 원본 시각이 유지되었고, 옵션 없이 보낸 report.txt는 보낸 시각으로 저장되었습니다. 받는 쪽 서버에서는 SFTP로 보낸 파일의 권한이 -p를 붙여도 664로 저장되었고, 옛 SCP 프로토콜(-O)로 보낸 파일만 600이 유지되었습니다.

그래서 권한까지 원본과 같아야 하는 파일은 보낸 뒤 받는 쪽에서 ls -l로 권한을 확인합니다.

4️⃣ scp 포트와 키 파일 지정

기본 포트 22와 기본 키로 접속되지 않는 서버는 보내기 전에 포트와 키를 직접 지정합니다. -P는 SSH 접속 포트를, -i는 공개 키 인증에 사용할 개인 키 파일을 지정합니다.

아래는 포트 22와 키 파일을 직접 지정한 예입니다. 포트를 바꾼 서버라면 22 대신 그 번호를 적습니다.

scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/
report.txt                                    100%   14     5.3KB/s   00:00

-i 없이 실행하면 ssh와 같이 ~/.ssh 아래 기본 이름의 키(id_rsa, id_ecdsa, id_ed25519 등)를 차례로 사용합니다.

같은 서버에 자주 보낸다면 ~/.ssh/config에 별칭을 적어 두고, scp에서는 별칭만 입력합니다.

Host myserver
    HostName 203.0.113.10
    User user
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Host 줄의 이름이 별칭이 되고, 그 아래 네 줄이 서버 주소와 계정, 포트, 키 파일을 대신합니다. 별칭만 적은 명령도 주소와 키를 모두 적었을 때와 같은 한 줄 결과로 끝났습니다.

scp report.txt myserver:~/scp-test/
report.txt                                    100%   14     4.2KB/s   00:00

-P와 -i, 별칭은 모두 ssh 접속 설정을 그대로 사용하므로, 키를 만들어 서버에 등록하는 과정도 SSH 명령어로 접속할 때와 같습니다.

5️⃣ scp 서버 간 복사

원본과 대상이 모두 원격 서버여도 scp 한 줄로 복사할 수 있습니다. OpenSSH 8.7부터는 데이터가 명령을 실행한 서버를 거쳐 전송되고, 이 방식이 -3입니다. 공식 릴리스 노트는 원본 서버에 대상 서버의 인증 정보를 두지 않아도 된다는 점을 기본 방식으로 바꾼 이유로 듭니다.

아래 실측은 원본과 대상을 같은 서버의 두 폴더로 두고 실행했습니다. 대상 서버가 다르면 뒤쪽 계정과 주소만 바꿉니다.

scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/
report.txt                                    100%   14     2.5KB/s   00:00

지점 두 곳 사이의 서류를 본사가 받아 다시 부치는 것과 같습니다.

원본 서버가 대상 서버로 직접 보내던 예전 방식은 -R로 지정합니다. 이 방식은 원본 서버에서 대상 서버로 비밀번호 없이 접속할 수 있어야 합니다. OpenSSH 10.6부터는 -R을 쓰면 지원 중단 예정 경고가 나오며, 이후 버전에서는 이 옵션을 무시하고 -3 방식으로 복사할 예정입니다.

6️⃣ scp와 rsync 비교

파일 몇 개를 한 번 보내는 일은 scp로 충분하고, 같은 폴더를 반복해서 맞추거나 끊긴 전송을 이어야 하는 일은 rsync 명령어가 맞습니다. scp는 실행할 때마다 지정한 파일 전체를 다시 보내고, rsync는 원본과 대상을 비교해 바뀐 파일만 전송합니다.

항목scprsync
전송 범위실행할 때마다 지정한 파일 전체원본과 비교해 바뀐 파일만
받다 만 파일 보존(--partial)❌✅
원본에 없는 파일 지우기(--delete)❌✅
심볼릭 링크따라가 원본 파일 복사-a로 링크 그대로
받는 쪽에 필요한 것SSH 접속과 SFTP 서버양쪽 모두 rsync 설치

7️⃣ scp 명령어 오류 메시지와 해결

scp가 실패하면 원인이 출력 첫 줄에 그대로 나옵니다. 없는 파일, 쓰기 권한, 틀린 포트로 오류를 직접 낸 세 경우 모두 첫 줄에 원인이 나왔고, 종료 코드도 모두 0이 아니었습니다.

🔲 No such file or directory

원격 쪽에 없는 파일을 받으려 하면 경로와 함께 [No such file or directory]가 출력됩니다.

scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/
scp: ~/scp-test/nofile.txt: No such file or directory

보낼 때 대상 폴더가 없어도 같은 오류가 납니다. scp는 없는 폴더를 만들지 않으므로, ssh로 mkdir -p를 먼저 실행해 폴더를 만듭니다.

scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/
scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/

🔲 Permission denied

받는 쪽 폴더에 쓰기 권한이 없으면 [dest open] 뒤에 [Permission denied]가 이어집니다. 아래는 권한을 555로 둔 readonly 폴더로 보낸 결과입니다.

scp report.txt user@203.0.113.10:~/scp-test/readonly/
scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/

[Permission denied] 앞에 [계정@서버 주소:]가 붙고 괄호 안에 publickey 같은 인증 방식이 들어 있으면, 접속 인증 단계에서 거절된 경우입니다. 이 문구는 ssh 프로그램이 인증에 실패했을 때 내는 형식이므로, -i로 지정한 키 파일과 서버에 등록한 공개 키부터 확인합니다.

🔲 Connection timed out

포트 번호가 틀렸거나 방화벽이 그 포트를 막아 응답이 오지 않으면 접속을 기다리다 [Connection timed out]으로 끝납니다. 아래는 기다리는 시간을 10초로 두고 열리지 않은 포트 2222로 보낸 결과입니다.

scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/
ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closed

이 오류가 나면 -P에 적은 번호가 서버의 SSH 포트와 같은지부터 확인합니다.

🔲 경로의 공백과 물결표(~)

SFTP로 전송하는 지금의 scp는 공백이 든 원격 경로를 작은따옴표로 한 번만 감싸면 됩니다.

scp report.txt 'user@203.0.113.10:~/scp-test/my files/'
report.txt                                    100%   14     4.7KB/s   00:00

같은 명령에 -O를 붙여 옛 SCP 프로토콜로 보내 보니 [ambiguous target]으로 실패했습니다. 옛 SCP 프로토콜에서는 원격 셸이 경로를 한 번 더 해석하기 때문입니다.

scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'
scp: ambiguous target

이때는 공백 앞에 역슬래시를 넣어 원격 셸에서도 한 낱말로 읽히게 합니다.

scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'
report.txt                                    100%   14     4.5KB/s   00:00

콜론 뒤 경로를 슬래시나 물결표 없이 시작하면 원격 계정의 홈 폴더 기준으로 처리됩니다.

scp report.txt user@203.0.113.10:scp-test/report-rel.txt
report.txt                                    100%   14     5.6KB/s   00:00

공식 매뉴얼은 오래된 SFTP 서버가 물결표로 시작하는 경로를 홈 폴더로 바꾸지 못할 때 -O를 사용하라고 설명합니다. 이때는 위처럼 물결표 없이 홈 기준 경로로 적어도 같은 자리에 저장됩니다.

🔢 FAQ & 추천 콘텐츠

같은 이름의 파일이 있으면 확인을 묻지 않고 새 파일로 덮어쓰게 됩니다. 같은 report.txt를 같은 폴더로 여러 번 보냈을 때도 확인 물음 없이 매번 전송되었습니다. 그래서 남겨야 하는 파일은 대상 경로 끝에 다른 이름을 적어 보냅니다.

원격 경로에 *를 넣고 작은따옴표로 감싸면 원격 서버에서 이름이 맞는 파일을 모두 받아 옵니다. 원격 서버의 report-*.txt를 받은 결과 이름이 맞는 파일 여섯 개가 차례로 전송되었습니다. 따옴표는 명령을 실행한 서버의 셸이 *를 먼저 해석하지 않게 하는 용도입니다.

-B를 붙이면 비밀번호나 암호 문구를 묻지 않는 배치 모드로 실행됩니다. 공식 매뉴얼 기준으로 이 모드에서는 비밀번호를 입력할 수 없으므로, 크론 같은 자동 작업에는 키 인증을 먼저 설정합니다.

🧭 네트워크 명령어 추천 콘텐츠 글 13 · 참조 2
🗂️ 네트워크 명령어
📄 ip 명령어 📄 netstat · ifconfig 명령어 📄 nmtui 명령어
📄 SSH 명령어 📄 rsync 명령어 📄 wget 명령어 📄 rz · sz 명령어 📄 scp 명령어
📄 host 명령어 📄 nslookup 명령어
📄 iptables 명령어 📄 firewall-cmd 명령어 📄 certbot 명령어

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

인간임을 증명하세요: 4   +   5   =