SCP - 안전한 원격 파일 전송
SCP(Secure Copy Protocol)는 SSH를 기반으로 로컬과 원격 호스트 간에 파일을 안전하게 전송하는 명령어다.
기본 문법
scp [옵션] [원본] [대상]
원본과 대상은 다음 형식을 사용한다:
[사용자@]호스트:경로
주요 옵션
| 옵션 | 설명 |
|---|---|
-i |
SSH 키 파일 지정 |
-P |
포트 번호 지정 (대문자 P) |
-r |
디렉토리 재귀 복사 |
-p |
파일 권한, 수정 시간 유지 |
-C |
압축 전송 |
-v |
상세 출력 (디버깅용) |
-q |
진행 상황 출력 안 함 |
-l |
대역폭 제한 (Kbit/s) |
로컬 → 원격 전송
단일 파일 전송
# 기본 형식
scp /path/to/local/file user@remote:/path/to/remote/
# SSH 키 사용
scp -i ~/.ssh/my-key.pem app.jar ec2-user@192.168.1.100:/home/ec2-user/
# 특정 포트 사용
scp -P 2222 file.txt user@remote:/home/user/
여러 파일 전송
# 여러 파일
scp file1.txt file2.txt user@remote:/home/user/
# 와일드카드
scp *.log user@remote:/var/logs/
디렉토리 전송
# -r 옵션으로 디렉토리 재귀 복사
scp -r /local/directory user@remote:/remote/path/
# 권한 유지하며 복사
scp -rp /local/directory user@remote:/remote/path/
원격 → 로컬 전송
# 원격 파일을 로컬로
scp user@remote:/path/to/file /local/path/
# 원격 디렉토리를 로컬로
scp -r user@remote:/path/to/dir /local/path/
# AWS EC2에서 로그 파일 가져오기
scp -i ~/.ssh/key.pem ec2-user@ec2-ip:/var/log/app.log ./logs/
원격 → 원격 전송
# 원격 호스트 간 파일 전송
scp user1@host1:/path/file user2@host2:/path/
# 같은 사용자인 경우
scp user@host1:/file user@host2:/path/
실전 예제
AWS EC2 배포
# JAR 파일 배포
scp -i ~/.ssh/webservice-key.pem \
./build/libs/app-0.0.1.jar \
ec2-user@10.0.1.100:/home/ec2-user/deploy/
# 설정 파일과 함께 배포
scp -i ~/.ssh/key.pem \
app.jar application.yml \
ec2-user@ec2-ip:/home/ec2-user/
대용량 파일 전송
# 압축 전송 (네트워크 대역폭 절약)
scp -C large-file.tar user@remote:/backup/
# 대역폭 제한 (1MB/s = 8000 Kbit/s)
scp -l 8000 huge-file.zip user@remote:/data/
백업 스크립트
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_FILE="backup-${DATE}.tar.gz"
REMOTE_HOST="user@backup-server"
REMOTE_PATH="/backups/"
# 백업 생성
tar -czf /tmp/${BACKUP_FILE} /var/www/html
# 원격 전송
scp -i ~/.ssh/backup-key.pem /tmp/${BACKUP_FILE} ${REMOTE_HOST}:${REMOTE_PATH}
# 로컬 임시 파일 삭제
rm /tmp/${BACKUP_FILE}
echo "Backup completed: ${BACKUP_FILE}"
SSH Config 활용
~/.ssh/config 파일에 호스트 설정을 저장하면 SCP 명령이 간단해진다.
# ~/.ssh/config
Host prod-server
HostName 10.0.1.100
User ec2-user
IdentityFile ~/.ssh/prod-key.pem
Port 22
Host dev-server
HostName 192.168.1.50
User ubuntu
IdentityFile ~/.ssh/dev-key.pem
# 설정 후 간단한 명령
scp app.jar prod-server:/home/ec2-user/
scp -r logs/ dev-server:/var/log/
SCP vs 대안 도구
rsync
증분 전송과 동기화에 적합하다.
# 변경된 파일만 전송
rsync -avz --progress /local/dir/ user@remote:/remote/dir/
# SSH 키 사용
rsync -avz -e "ssh -i ~/.ssh/key.pem" ./app/ user@remote:/app/
# 삭제된 파일도 동기화
rsync -avz --delete /local/ user@remote:/remote/
| 구분 | SCP | rsync |
|---|---|---|
| 증분 전송 | X | O |
| 전송 재개 | X | O |
| 동기화 | X | O |
| 단순 복사 | O | O |
sftp
대화형 파일 전송에 적합하다.
sftp user@remote
sftp> put local-file.txt
sftp> get remote-file.txt
sftp> ls
sftp> cd /path
sftp> exit
트러블슈팅
Permission denied
# 키 파일 권한 확인
chmod 400 ~/.ssh/key.pem
# 상세 로그로 문제 확인
scp -v file user@remote:/path/
Connection refused
# SSH 서비스 확인 (원격 서버에서)
sudo systemctl status sshd
# 포트 확인
netstat -tlnp | grep 22
Host key verification failed
# known_hosts에서 해당 호스트 제거
ssh-keygen -R hostname
# 또는 일시적으로 체크 비활성화 (보안 주의)
scp -o StrictHostKeyChecking=no file user@remote:/path/
보안 고려사항
1. SSH 키 파일 권한은 400 또는 600으로 설정
2. 패스워드 인증보다 키 인증 사용
3. 가능하면 루트 계정 사용 금지
4. StrictHostKeyChecking 비활성화는 신뢰할 수 있는 환경에서만
5. 중요한 파일 전송 시 무결성 확인 (체크섬)
# 전송 후 체크섬 확인
local$ sha256sum file.tar.gz
remote$ sha256sum file.tar.gz
# 두 값이 일치하는지 확인
정리
| 상황 | 명령 |
|---|---|
| 파일 업로드 | scp file user@remote:/path/ |
| 파일 다운로드 | scp user@remote:/path/file ./ |
| 디렉토리 전송 | scp -r dir user@remote:/path/ |
| SSH 키 사용 | scp -i key.pem file user@remote:/path/ |
| 다른 포트 | scp -P 2222 file user@remote:/path/ |
SCP는 단순한 파일 복사에 적합하다. 대용량 파일이나 동기화가 필요하면 rsync를 고려하자.
댓글