scp not a regular file

agnusdei·2025년 10월 2일

SCP 다운로드 "not a regular file" 오류 해결기

문제 상황

데이터베이스 백업 파일을 로컬로 다운로드하려고 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

원인 분석

1. 문제의 원인 파악

원격 서버의 실제 구조를 확인해보니:

$ 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 102 09:00 .
drwxr-xr-x  4 root root 4096 102 00:00 ..
drwxr-xr-x  3 root root 4096 102 00:00 backup-20251002-000000.zip
drwxr-xr-x  3 root root 4096 102 01:00 backup-20251002-010000.zip
drwxr-xr-x  3 root root 4096 102 02:00 backup-20251002-020000.zip
drwxr-xr-x  3 root root 4096 102 09:00 backup-20251002-090000.zip

문제 발견! .zip 확장자로 끝나는 이름이지만, 실제로는 디렉토리였습니다.

2. 파일 vs 디렉토리 구별법

drwxr-xr-x  # ← 'd'로 시작 = 디렉토리 (directory)
-rw-r--r--  # ← '-'로 시작 = 일반 파일 (regular file)
  • 맨 앞 글자가 d이면 디렉토리
  • 맨 앞 글자가 -이면 일반 파일
  • scp는 기본적으로 일반 파일만 복사 가능

3. 왜 이런 구조가 생겼을까?

백업 시스템이 .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 102 09:00 .
drwxr-xr-x 3 root root 4096 102 09:00 ..
drwxr-xr-x 2 root root 4096 102 09:00 data
-rw-r--r-- 1 root root 1234 102 09:00 metadata.json

디렉토리 안에 실제 백업 파일들이 들어있는 구조였습니다.

해결 방법

방법 1: 디렉토리 전체를 재귀적으로 다운로드 (추천)

-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/)
  • 디렉토리 구조가 그대로 유지됨

방법 2: 원격에서 압축 후 다운로드 (대용량 추천)

파일이 많거나 용량이 크다면 원격 서버에서 먼저 압축한 후 다운로드:

# 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 (압축 해제)

장점:

  • ✅ 네트워크 전송량 감소 (압축으로 용량 축소)
  • ✅ 전송 시간 단축
  • ✅ 단일 파일로 관리 편리
  • ✅ 전송 중 파일 손상 가능성 감소

방법 3: rsync 사용 (고급)

더 안정적이고 빠른 전송을 원한다면:

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재개 가능, 안정적문법 복잡불안정한 네트워크

문제 예방 팁

1. 파일 타입 먼저 확인하기

다운로드 전에 항상 확인:

# 파일인지 디렉토리인지 확인
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/"

2. 파일명 관례 정하기

백업 시스템 설정 시:

# 좋은 예: 디렉토리는 확장자 없이
/backup/myapp/2025/10/02/backup-20251002-090000/

# 나쁜 예: 디렉토리에 파일 확장자
/backup/myapp/2025/10/02/backup-20251002-090000.zip/

3. 자동화 스크립트 작성

#!/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 옵션으로 디렉토리 재귀 복사
확인 방법sshls -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 ./
profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글