SSH·SCP·Rsync — 원격 접속과 파일 동기화 한 묶음
원격 서버 접속, 키 인증, ~/.ssh/config로 별명 만들기, 포트 포워딩, 그리고 파일 옮기는 scp/rsync까지. 실전에서 매일 쓰는 패턴 위주로 정리.
Series
리눅스 명령어 시리즈- 1man이 너무 길 때 — tldr로 리눅스 명령어 빠르게 익히기
- 2파일 검색 명령어 정리 — find, grep, fd, ripgrep
- 3리눅스 로그 보는 명령어 정리 — tail, less, journalctl, lnav
- 4리눅스 프로세스·리소스 모니터링 — top, htop, ps, df 실전 정리
- 5리눅스 권한 정리 — chmod, chown, sudo와 그 너머
- 6리눅스 네트워크 디버깅 — ss, curl, dig, tcpdump 실전 정리
- 7SSH·SCP·Rsync — 원격 접속과 파일 동기화 한 묶음
- 8리눅스 텍스트 처리 — sed, awk, cut, sort, uniq, xargs 실전 정리
공부하게 된 계기
원격 서버를 쓰는 일은 이제 모든 개발자의 일상이다. 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 — 별명과 기본값
이게 진짜 게임체인저다. 한 번 설정하면 두고두고 편하다.
# 자주 쓰는 서버에 별명 + 기본값
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 -lmacOS는 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/config에 LocalForward 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@serversftp> 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.comE. 키 분실 / 새 머신 셋업
# 새 키 생성
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가지:
- SSH 키 인증 —
ssh-keygen+ssh-copy-id ~/.ssh/config— 자주 쓰는 서버에 별명. 한 번 만들어두면 평생 편하다rsync사용법 익히기 —scp -r로 디렉토리 옮기는 습관 버리기
이 셋만 해도 원격 작업 효율이 두 배는 된다.
시리즈 정리
이번 편으로 7편.
- 1편: tldr
- 2편: 파일 검색
- 3편: 로그
- 4편: 프로세스 모니터링
- 5편: 권한
- 6편: 네트워크 디버깅
- 7편 (이 글): SSH·SCP·Rsync
다음 편: 텍스트 처리(sed/awk/cut/sort/uniq).
참고 자료
man ssh,man ssh_config,man rsync- SSH Mastery — 깊이 들어갈 때
- tmux 치트시트