데이터베이스 백업 파일을 로컬로 다운로드하려고 scp 명령어를 실행했는데, 계속 이런 오류가 발생했습니다:
$ scp -i ~/.ssh/id_rsa \
user@192.168.1.100:/backup/myapp/2025/10/02/backup-20251002-090000.zip \
./backup.zip
scp: download /backup/myapp/2025/10/02/backup-20251002-090000.zip/: not a regular file
여러 번 시도해도 같은 오류가 반복되었습니다:
# 경로를 따옴표로 감싸도 실패
$ scp -i ~/.ssh/id_rsa \
user@192.168.1.100:"/backup/myapp/2025/10/02/backup-20251002-090000.zip" \
./backup.zip
scp: download /backup/myapp/2025/10/02/backup-20251002-090000.zip/: not a regular file
# 다른 목적지 경로로 시도해도 실패
$ scp -i ~/.ssh/id_rsa \
user@192.168.1.100:"/backup/myapp/2025/10/02/backup-20251002-090000.zip" \
/c/Users/MyName/Downloads/backup.zip
scp: download /backup/myapp/2025/10/02/backup-20251002-090000.zip/: not a regular file
원격 서버의 실제 구조를 확인해보니:
$ ssh -i ~/.ssh/id_rsa user@192.168.1.100 "ls -la /backup/myapp/2025/10/02/"
total 48
drwxr-xr-x 12 root root 4096 10월 2 09:00 .
drwxr-xr-x 4 root root 4096 10월 2 00:00 ..
drwxr-xr-x 3 root root 4096 10월 2 00:00 backup-20251002-000000.zip
drwxr-xr-x 3 root root 4096 10월 2 01:00 backup-20251002-010000.zip
drwxr-xr-x 3 root root 4096 10월 2 02:00 backup-20251002-020000.zip
drwxr-xr-x 3 root root 4096 10월 2 09:00 backup-20251002-090000.zip
문제 발견! .zip 확장자로 끝나는 이름이지만, 실제로는 디렉토리였습니다.
drwxr-xr-x # ← 'd'로 시작 = 디렉토리 (directory)
-rw-r--r-- # ← '-'로 시작 = 일반 파일 (regular file)
d이면 디렉토리-이면 일반 파일scp는 기본적으로 일반 파일만 복사 가능백업 시스템이 .zip 확장자를 가진 디렉토리를 생성하도록 설정되어 있었기 때문입니다.
실제 내부 구조를 확인해보면:
$ ssh -i ~/.ssh/id_rsa user@192.168.1.100 "ls -la /backup/myapp/2025/10/02/backup-20251002-090000.zip/"
total 12
drwxr-xr-x 3 root root 4096 10월 2 09:00 .
drwxr-xr-x 3 root root 4096 10월 2 09:00 ..
drwxr-xr-x 2 root root 4096 10월 2 09:00 data
-rw-r--r-- 1 root root 1234 10월 2 09:00 metadata.json
디렉토리 안에 실제 백업 파일들이 들어있는 구조였습니다.
-r 옵션을 추가하여 디렉토리 전체를 다운로드:
scp -i ~/.ssh/id_rsa -r \
user@192.168.1.100:"/backup/myapp/2025/10/02/backup-20251002-090000.zip" \
./backup-folder/
실행 결과:
metadata.json 100% 1234 1.2MB/s 00:00
data/file1.sql 100% 5678KB 5.5MB/s 00:01
data/file2.sql 100% 3456KB 3.4MB/s 00:01
핵심 포인트:
-r 옵션: 재귀적(recursive) 복사 - 디렉토리와 하위 모든 파일/폴더 포함./backup-folder/)파일이 많거나 용량이 크다면 원격 서버에서 먼저 압축한 후 다운로드:
# 1단계: 원격 서버에서 tar.gz로 압축
ssh -i ~/.ssh/id_rsa user@192.168.1.100 \
"tar -czf /tmp/backup-090000.tar.gz -C /backup/myapp/2025/10/02/ backup-20251002-090000.zip"
# 2단계: 압축 파일 다운로드
scp -i ~/.ssh/id_rsa \
user@192.168.1.100:/tmp/backup-090000.tar.gz \
./backup-090000.tar.gz
# 3단계 (선택): 원격 서버의 임시 파일 삭제
ssh -i ~/.ssh/id_rsa user@192.168.1.100 "rm /tmp/backup-090000.tar.gz"
# 4단계: 로컬에서 압축 해제
tar -xzf backup-090000.tar.gz
tar 명령어 옵션 설명:
-c: create (새 압축 파일 생성)-z: gzip 압축 사용-f: file (파일명 지정)-C: 지정된 디렉토리로 이동 후 압축-x: extract (압축 해제)장점:
더 안정적이고 빠른 전송을 원한다면:
rsync -avz -e "ssh -i ~/.ssh/id_rsa" \
user@192.168.1.100:/backup/myapp/2025/10/02/backup-20251002-090000.zip/ \
./backup-folder/
rsync 장점:
-z 옵션)| 방법 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|
| scp -r | 간단, 직관적 | 대용량 시 느림 | 소규모 디렉토리 |
| tar + scp | 전송량 감소, 빠름 | 단계가 많음 | 대용량, 많은 파일 |
| rsync | 재개 가능, 안정적 | 문법 복잡 | 불안정한 네트워크 |
다운로드 전에 항상 확인:
# 파일인지 디렉토리인지 확인
ssh -i ~/.ssh/id_rsa user@192.168.1.100 "ls -ld /backup/path/file.zip"
# 디렉토리 내부 확인
ssh -i ~/.ssh/id_rsa user@192.168.1.100 "ls -la /backup/path/file.zip/"
백업 시스템 설정 시:
# 좋은 예: 디렉토리는 확장자 없이
/backup/myapp/2025/10/02/backup-20251002-090000/
# 나쁜 예: 디렉토리에 파일 확장자
/backup/myapp/2025/10/02/backup-20251002-090000.zip/
#!/bin/bash
REMOTE="user@192.168.1.100"
REMOTE_PATH="/backup/myapp/2025/10/02/backup-20251002-090000.zip"
LOCAL_PATH="./backup-folder"
# 파일 타입 확인
if ssh -i ~/.ssh/id_rsa $REMOTE "[ -d $REMOTE_PATH ]"; then
echo "디렉토리 발견: scp -r 사용"
scp -i ~/.ssh/id_rsa -r $REMOTE:$REMOTE_PATH $LOCAL_PATH
elif ssh -i ~/.ssh/id_rsa $REMOTE "[ -f $REMOTE_PATH ]"; then
echo "파일 발견: scp 사용"
scp -i ~/.ssh/id_rsa $REMOTE:$REMOTE_PATH $LOCAL_PATH
else
echo "오류: 경로를 찾을 수 없습니다"
exit 1
fi
| 구분 | 내용 |
|---|---|
| 오류 원인 | .zip 확장자를 가진 디렉토리를 일반 파일로 착각 |
| 오류 메시지 | not a regular file |
| 해결 핵심 | scp -r 옵션으로 디렉토리 재귀 복사 |
| 확인 방법 | ssh로 ls -la 명령어 실행하여 파일 타입 확인 |
| 추가 팁 | 대용량은 원격에서 tar 압축 후 다운로드가 효율적 |
파일명 != 파일 타입
.zip, .tar.gz 등으로 끝난다고 무조건 압축 파일이 아님ls -la로 파일 타입 확인 (d = 디렉토리, - = 파일)file 명령어 사용: ssh user@host "file /path/to/file"-r 옵션 필요이런 기본적인 확인 습관을 들이면 시간 낭비를 막을 수 있습니다! 🎯
관련 명령어 요약:
# 파일 타입 확인
ls -ld /path/to/file
# 디렉토리 재귀 복사
scp -r source destination
# 원격 압축 후 다운로드
ssh user@host "tar -czf /tmp/file.tar.gz /path"
scp user@host:/tmp/file.tar.gz ./