sy/dev
Study
12 min read

SSH·SCP·Rsync — 원격 접속과 파일 동기화 한 묶음

원격 서버 접속, 키 인증, ~/.ssh/config로 별명 만들기, 포트 포워딩, 그리고 파일 옮기는 scp/rsync까지. 실전에서 매일 쓰는 패턴 위주로 정리.

공부하게 된 계기

원격 서버를 쓰는 일은 이제 모든 개발자의 일상이다. AWS, GCP, 사내 서버, 클러스터 노드. 그런데 매번 비밀번호 치고, 긴 호스트명 외우고, 파일 옮길 때마다 어떻게 옮길지 고민한다면 — 한 번만 정리해두면 그 시간이 다 사라진다.

이 글은 세 도구를 한 번에 다룬다.

  • SSH: 원격 셸 접속 + 키 인증 + 포트 포워딩
  • SCP: 빠른 파일 복사 (한 번 갈 때)
  • Rsync: 똑똑한 동기화 (반복할 때)

1) SSH — 원격 접속 기본

ssh user@server.com
ssh -p 2222 user@server.com    # 포트 지정

처음 접속하면 호스트 키를 신뢰할지 묻는다 (yes 입력). 이때 받은 키가 ~/.ssh/known_hosts에 저장되고, 다음부터는 자동으로 검증한다.

비밀번호 인증은 그만

비밀번호 인증은:

  • 매번 입력해야 하고
  • 자동화에 쓸 수 없고
  • 무차별 대입에 취약하다

SSH 키 인증으로 바꾸는 게 첫 단계.

2) SSH 키 만들기 — ssh-keygen

ssh-keygen -t ed25519 -C "you@example.com"
  • -t ed25519: 키 알고리즘. 현대 기본값. (구식 rsa는 4096비트 이상으로 — ssh-keygen -t rsa -b 4096)
  • -C: 코멘트 (구분용)

기본 저장 위치는 ~/.ssh/id_ed25519 (개인키)와 ~/.ssh/id_ed25519.pub (공개키).

⚠️

개인키(id_ed25519)는 절대 공유 금지. GitHub, Slack, 메일 어디든 올라가면 즉시 폐기하고 새로 만들어야 한다. 공개키(.pub)만 서버에 등록한다.

공개키를 서버에 등록

# 가장 쉬운 방법
ssh-copy-id user@server.com
 
# 수동으로 (ssh-copy-id 안 될 때)
cat ~/.ssh/id_ed25519.pub | ssh user@server.com 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'

이후로는 비밀번호 없이 접속 가능.

키 파일 권한 — 자주 막히는 지점

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config

권한이 너무 풀려있으면 SSH가 키를 거부한다. (권한 글 참조.)

3) ~/.ssh/config — 별명과 기본값

이게 진짜 게임체인저다. 한 번 설정하면 두고두고 편하다.

~/.ssh/config
# 자주 쓰는 서버에 별명 + 기본값
Host prod
  HostName prod-server.example.com
  User ubuntu
  Port 22
  IdentityFile ~/.ssh/id_ed25519
 
Host staging
  HostName 10.0.0.42
  User deploy
  IdentityFile ~/.ssh/staging_key
 
# GitHub
Host github.com
  User git
  IdentityFile ~/.ssh/github_key
 
# 점프 호스트 경유 (bastion)
Host internal-db
  HostName 10.0.0.5
  User dba
  ProxyJump bastion@gateway.example.com
 
# 모든 호스트에 공통
Host *
  AddKeysToAgent yes
  UseKeychain yes        # macOS에서 keychain 사용
  ServerAliveInterval 60 # 끊김 방지

이렇게 해두면:

ssh prod                    # ssh -i ~/.ssh/id_ed25519 ubuntu@prod-server.example.com
ssh staging                 # 별명만으로
ssh internal-db             # 자동으로 bastion 경유

scp, rsync도 이 설정을 그대로 쓴다. 그래서 한 번 설정해두면 모든 도구가 자동 혜택을 받는다.

4) ssh-agent — 키 비밀번호 한 번만

키에 비밀번호(passphrase)를 걸어뒀다면 매번 물어본다. ssh-agent가 한 세션 동안 기억해준다.

# 에이전트 시작 (대부분 자동)
eval "$(ssh-agent -s)"
 
# 키 등록 (passphrase 한 번 입력)
ssh-add ~/.ssh/id_ed25519
 
# 등록된 키 확인
ssh-add -l

macOS는 keychain에 자동 저장 가능 (UseKeychain yes).

Agent forwarding — 신중하게

ssh -A user@server.com

원격에서 또 다른 SSH 연결할 때 로컬 키를 빌려준다. 편리하지만 그 서버의 root는 내 키를 쓸 수 있다. 신뢰하는 서버에서만.

5) 포트 포워딩 — SSH의 숨은 강점

방화벽 뚫고 안전하게 접속하는 가장 깔끔한 방법.

로컬 포트 → 원격 (-L)

ssh -L 5432:localhost:5432 user@db-server

해석: "내 컴퓨터 5432번 포트로 들어오는 트래픽을 → SSH 터널 통해서 → 서버 입장의 localhost:5432로 보내라."

원격 DB가 외부에 안 열려있어도 내 로컬에서 psql -h localhost -p 5432로 접속 가능.

원격 포트 → 로컬 (-R)

ssh -R 8080:localhost:3000 user@server

해석: "서버의 8080번 포트를 → 내 로컬의 3000번 포트로 보내라." 내가 로컬에서 띄운 서비스를 원격에서 접속할 수 있게 만든다.

Dynamic / SOCKS proxy (-D)

ssh -D 1080 user@server

내 컴퓨터의 1080번 포트가 SOCKS 프록시가 된다. 브라우저에서 이 프록시를 쓰면 모든 트래픽이 서버 경유. 막힌 사이트 우회나 사내 망 접속에 유용.

포트 포워딩을 자주 쓴다면 ~/.ssh/configLocalForward 5432 localhost:5432 같은 줄을 넣어두면 매번 옵션 안 줘도 된다.

6) scp — 한 번 복사

# 로컬 → 원격
scp file.txt user@server:/path/to/dest/
 
# 원격 → 로컬
scp user@server:/path/to/file.txt ./
 
# 디렉토리 (재귀)
scp -r ./mydir user@server:/path/to/dest/
 
# 포트 지정 (대문자 P 주의)
scp -P 2222 file.txt user@server:/dest/
 
# config의 별명 사용
scp file.txt prod:/var/www/

scp는 SSH 위에서 동작한다. ~/.ssh/config의 별명·키 설정 그대로 따라간다.

scp vs rsync — 언제 무엇을

상황도구
작은 파일 한두 개scp
큰 디렉토리 첫 동기화rsync
자주 갱신되는 디렉토리rsync 무조건
백업rsync

scp는 단순하고 매번 전부 복사. rsync변경된 부분만 복사.

7) rsync — 똑똑한 동기화

# 가장 흔한 형태
rsync -avz ./local/ user@server:/remote/
 
# 옵션 의미:
# -a archive (권한·시간·심볼릭 링크 보존, 재귀)
# -v verbose
# -z 압축

슬래시 주의 — 가장 헷갈리는 부분

rsync -avz ./local/  user@server:/remote/   # local 안의 내용 → /remote/ 안에
rsync -avz ./local   user@server:/remote/   # local 디렉토리 자체 → /remote/local/

소스 끝에 슬래시(/)가 있는지 없는지로 동작이 달라진다. 슬래시 = 내용물만, 슬래시 없음 = 디렉토리째.

자주 쓰는 추가 옵션

# 테스트 (실제로 옮기지 않고 무엇이 옮겨질지 출력)
rsync -avzn ./local/ user@server:/remote/
 
# 진행 상황
rsync -avz --progress ./local/ user@server:/remote/
 
# 삭제까지 동기화 (소스에 없는 파일 → 대상에서도 삭제)
rsync -avz --delete ./local/ user@server:/remote/
 
# 특정 패턴 제외
rsync -avz --exclude='node_modules' --exclude='.git' ./project/ user@server:/app/
 
# 제외 목록을 파일로
rsync -avz --exclude-from='.rsyncignore' ./project/ user@server:/app/
 
# 이어받기 (대용량 끊겼을 때)
rsync -avz --partial --progress big.iso user@server:/data/
⚠️

--delete는 위험하다. 소스 디렉토리 경로를 잘못 지정하면 대상 데이터가 삭제된다. 처음 쓸 때는 반드시 -n(dry-run)으로 먼저 확인.

자주 쓰는 시나리오

# 사진 백업 (외장디스크로)
rsync -avz --progress ~/Photos/ /Volumes/Backup/Photos/
 
# 코드 배포 (node_modules 제외)
rsync -avz --exclude='node_modules' --exclude='.next' --delete \
  ./build/ deploy@web:/var/www/app/
 
# 매일 백업 cron
0 3 * * * rsync -az --delete /important/ backup@nas:/backups/important/

8) sftp — 인터랙티브 파일 전송

sftp user@server
sftp> ls
sftp> cd /var/www
sftp> get config.json
sftp> put deploy.sh
sftp> bye

여러 파일을 인터랙티브하게 옮길 때 유용. GUI 도구(Cyberduck, Transmit)도 내부적으로 SFTP를 쓴다.

9) tmux / mosh — 끊김 견디기

본 글의 주제는 아니지만 짧게.

원격 작업 중 SSH 연결이 끊기면 모든 작업이 사라진다. 두 가지 보호망:

  • tmux: 서버에서 세션을 띄우고 거기서 작업. 끊겨도 세션은 살아있다. ssh server, tmux attach -t main.
  • mosh: SSH보다 끊김에 강한 클라이언트. WiFi 끊겼다 들어와도 그대로 이어진다.

실전 패턴 6개

A. 새 서버 받자마자 셋업

# 1) 키 등록
ssh-copy-id user@new-server
 
# 2) ~/.ssh/config에 별명
echo "
Host newserver
  HostName <ip>
  User user
  IdentityFile ~/.ssh/id_ed25519
" >> ~/.ssh/config
 
# 3) 검증
ssh newserver 'uptime'

B. 로컬 코드 → 서버로 빠르게

rsync -avz --exclude='node_modules' --exclude='.git' \
  -e "ssh -p 2222" \
  ./ user@server:/var/www/myapp/

C. 서버 DB에 로컬 GUI 도구 연결

# 한 터미널: 터널 유지
ssh -L 5432:localhost:5432 -N prod-db
 
# 다른 곳에서 localhost:5432로 접속
psql -h localhost -p 5432 -U postgres

-N은 명령 실행 없이 터널만.

D. 점프 호스트 경유

# 한 번만
ssh -J bastion@gateway.com user@internal-server
 
# 또는 config에:
# Host internal
#   ProxyJump bastion@gateway.com

E. 키 분실 / 새 머신 셋업

# 새 키 생성
ssh-keygen -t ed25519 -C "newlaptop"
 
# 옛 머신에서 .pub을 GitHub, 서버 등에 다시 등록
cat ~/.ssh/id_ed25519.pub
# → 복사 후 각 곳에 붙여넣기

F. 서버 → 서버 직접 복사

# A → B로 (둘 다 SSH 가능한 경우)
rsync -avz user@A:/path/to/data/ user@B:/path/to/data/

내 로컬을 거치지 않고 직접. 둘 다 외부에서 SSH 가능해야 함.

정리

무조건 해둘 것 3가지:

  1. SSH 키 인증 — ssh-keygen + ssh-copy-id
  2. ~/.ssh/config — 자주 쓰는 서버에 별명. 한 번 만들어두면 평생 편하다
  3. rsync 사용법 익히기 — scp -r로 디렉토리 옮기는 습관 버리기

    이 셋만 해도 원격 작업 효율이 두 배는 된다.

시리즈 정리

이번 편으로 7편.

다음 편: 텍스트 처리(sed/awk/cut/sort/uniq).

참고 자료

Comments