SSH 키 만들기
SSH 키는 서버에 등록하는 공개 키와 내 컴퓨터에만 두는 개인 키 한 쌍이에요. macOS, Linux, Windows PowerShell 모두 같은 명령을 써요. Windows에서 ssh를 찾을 수 없다고 나오면 설정의 선택적 기능에서 ‘OpenSSH 클라이언트’를 추가하세요.
ssh-keygen -t ed25519 -C "you@example.com"저장 위치는 Enter로 기본값(~/.ssh/id_ed25519)을 쓰세요. 이어서 묻는 패스프레이즈(키 비밀번호)를 정해 두면 노트북을 잃어버려도 키를 바로 쓸 수 없어요.
이미 id_ed25519가 있다면 덮어쓰지 마세요. 그 키로 접속하던 서버에 못 들어가게 돼요. 새 키는 -f ~/.ssh/id_ed25519_gpu처럼 다른 이름으로 만드세요.
공개 키 확인하고 복사하기
cat ~/.ssh/id_ed25519.pubtype $env:USERPROFILE\.ssh\id_ed25519.pubssh-ed25519 AAAA...로 시작하는 한 줄 전체가 공개 키예요.
Shelf 콘솔에 공개 키 등록하기
공개 키를 콘솔(my.shelf.kr)의 설정 화면에 한 번 저장해 두면, 서버를 만들 때마다 골라 쓸 수 있어요.
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK7v3q9yQf2Lx8N5mT1rWc4p...설정을 열어요
왼쪽 메뉴에서 설정을 누르면 가운데에 SSH 키 설정 영역이 보여요.
설정 추가를 눌러요
공개 키를 입력하는 창이 열려요. 키가 없다면 옆의 SSH 키 생성(3)으로 콘솔에서 바로 만들 수도 있어요.
이름을 붙여요
설정 이름에
내 노트북 키처럼 어느 컴퓨터의 키인지 적어요.공개 키를 붙여 넣어요
SSH 공개 키에 복사한 한 줄을 그대로 붙여 넣어요. 콘솔이 형식을 검사하지 않으니
ssh-ed25519나ssh-rsa로 시작하는지 직접 확인하세요.기본값으로 정해요
기본값으로 설정을 켜 두면 서버를 만들 때 이 키가 미리 선택돼요. 사용자 데이터는 비워 둬도 돼요.
설정 생성을 눌러요
목록에 키가 생기고, 기본으로 정한 키에는 기본 표시가 붙어요.
콘솔에서 키 만들기
SSH 키 생성을 누르면 브라우저 안에서 Ed25519 키쌍을 만들어요. 개인 키는 Shelf에 저장되지 않으니 창을 닫기 전에 꼭 내려받으세요.
개인 키를 내려받아요
설정 이름을 적고 키쌍 생성, 개인 키 다운로드를 차례로 눌러요.
id_ed25519_<설정 이름>파일이 내려받아지는데, 설정 이름을 영문으로 적어야 파일 이름이 밑줄로 바뀌지 않아요.공개 키를 저장해요
개인 키를 내려받아야 공개 키 저장을 누를 수 있어요. 저장하면 SSH 키 설정 목록에 키가 추가돼요.
mv ~/Downloads/id_ed25519_my-laptop ~/.ssh/
chmod 600 ~/.ssh/id_ed25519_my-laptop
# 패스프레이즈 추가 (선택)
ssh-keygen -p -f ~/.ssh/id_ed25519_my-laptopWindows에서는 내려받은 파일을 C:\Users\<사용자>\.ssh\ 폴더로 옮겨요. 기본 이름이 아니라서 접속할 때 -i로 지정하거나, 아래 config의 IdentityFile에 적어 두세요.
서버를 만들 때 키 고르기
- GPU 플랜
- 스토리지
- 3접속 설정
- 4검토
ubuntu3인증 방식을 SSH 키로 바꿔요
접속 설정 단계에서 SSH 키를 눌러요. 처음에는 비밀번호가 선택돼 있는데, GPU 서버 대기열에 등록할 때는 비밀번호를 쓸 수 없어요.
저장된 키를 확인해요
저장된 설정에서 키를 골라요. 기본 키는 미리 선택돼 있어요. 여기서 공개 키를 직접 붙여 넣으면 이번 서버에만 쓰이고 저장되지 않아요.
로그인 사용자명을 기억해요
로그인 사용자명은 템플릿마다 달라요. 접속 명령의
<user>자리에 이 이름을 써요.
접속하고 ~/.ssh/config로 줄이기
서버 상세 화면 개요 탭의 서버 접속에서 주소와 포트를 확인해요. SSH 포트는 22번이 아니라 서버마다 따로 정해져 있어요.
ssh -p 22017 ubuntu@203.0.113.241sftp -P 22017 ubuntu@203.0.113.24ssh -p <port> <user>@<host> 형태의 명령이 복사돼요. SFTP 줄은 파일 전송 프로그램에 쓰는 주소예요.ssh -i ~/.ssh/id_ed25519 -p <port> <user>@<host>기본 이름이 아닌 키를 쓴다면 복사한 명령에 -i로 키 파일을 더해요. 처음 접속할 때 서버 지문(fingerprint)을 확인하라고 물으면 yes를 입력하세요.
~/.ssh/config에 별칭을 만들어 두면 옵션을 매번 입력하지 않아도 돼요. Windows에서는 C:\Users\<사용자>\.ssh\config 파일이고, 메모장으로 만들었다면 .txt가 붙지 않았는지 확인하세요.
Host gpu-server
HostName <host>
User <user>
Port <port>
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 60이제 ssh gpu-server로 접속돼요. scp, rsync, VS Code도 이 별칭을 그대로 써요. IdentitiesOnly yes는 키가 많을 때 나는 Too many authentication failures를 막고, ServerAliveInterval 60은 입력이 없어도 연결이 끊기지 않게 해요.
scp와 rsync로 파일 옮기기
# 내 컴퓨터에서 서버로
scp ./train.py gpu-server:~/
scp -r ./dataset gpu-server:~/
# 서버에서 내 컴퓨터로
scp gpu-server:~/outputs/model.pt ./별칭 없이 쓸 때 scp의 포트 옵션은 ssh와 달리 대문자 -P예요.
파일이 많거나 크면 rsync가 나아요. 바뀐 파일만 보내고 끊긴 전송을 이어서 해요. 양쪽에 rsync가 있어야 하고, Windows에서는 WSL에서 쓰는 게 편해요.
rsync -avP ./dataset/ gpu-server:~/dataset/
# 별칭 없이 포트를 지정할 때
rsync -avP -e "ssh -p <port>" ./dataset/ <user>@<host>:~/dataset/원본 경로 끝의 /에 주의하세요. ./dataset/은 폴더 안의 내용을, ./dataset은 폴더 자체를 보내서 서버에 ~/dataset/dataset이 생길 수 있어요.
접속이 끊겨도 작업이 계속되게: tmux
노트북을 덮거나 와이파이가 바뀌어 접속이 끊기면 SSH로 실행한 학습도 함께 멈출 수 있어요. 오래 걸리는 작업은 tmux 안에서 실행하세요.
sudo apt install -y tmux # Ubuntu에 없을 때
tmux new -s train # train이라는 세션 만들기
python train.py # 세션 안에서 작업 실행Ctrl+b를 누른 뒤 d를 누르면 작업을 둔 채 세션에서 빠져나와요. 다시 접속해서 아래 명령으로 세션에 돌아가요.
tmux ls
tmux attach -t train포트 포워딩으로 서버의 웹 화면 열기
TensorBoard처럼 웹 화면을 띄우는 도구는 서버의 localhost에만 열어 두고 SSH 터널로 가져오는 게 안전해요. -L 내포트:localhost:서버포트 형태로 써요.
ssh -N -L 6006:localhost:6006 gpu-server-N은 셸 없이 터널만 연다는 뜻이에요. 이 터미널을 열어 둔 채로 http://localhost:6006을 열면 서버의 TensorBoard가 보여요. 자주 쓴다면 config의 Host 블록에 LocalForward 6006 localhost:6006을 넣어 두세요. JupyterLab은 원격 서버에서 JupyterLab 쓰기를 보세요.
VS Code Remote-SSH로 접속하기
확장을 설치해요
VS Code 확장 탭에서 Microsoft의 ‘Remote - SSH’를 설치해요.
호스트를 골라요
명령 팔레트(F1)에서 ‘Remote-SSH: Connect to Host...’를 실행하고 config의 별칭
gpu-server를 골라요.첫 접속은 조금 기다려요
VS Code가 서버의
~/.vscode-server에 필요한 구성 요소를 설치해요. 다음부터는 바로 열려요.폴더를 열고 원격 확장을 설치해요
File > Open Folder로 서버의 프로젝트 폴더를 열어요. Python, Jupyter 같은 확장은 원격 쪽에도 설치해야 서버의 파이썬 환경을 써요.
VS Code 터미널에서 띄운 웹 서버 포트는 대부분 자동으로 포워딩되고, 아래쪽 패널의 포트(Ports) 탭에 보여요. 자세한 설정은 VS Code 공식 문서에 있어요.
자주 만나는 오류와 해결법
Permission denied (publickey)
서버가 내 키를 받아들이지 않았다는 뜻이에요.
- 사용자명이 콘솔의 로그인 사용자명과 같은지 확인해요.
- 등록한 공개 키가 지금 쓰는 개인 키의 짝인지 확인해요.
ssh-keygen -y -f ~/.ssh/id_ed25519로 개인 키에서 공개 키를 다시 뽑아 비교할 수 있어요. -i옵션이나 config의IdentityFile이 올바른 키 파일을 가리키는지 확인해요.- 공개 키를 서버에 직접 넣었다면
~/.ssh는700,authorized_keys는600권한이어야 해요. 너무 열려 있으면 서버가 키를 무시해요.
ssh -v gpu-server-v를 붙이면 어떤 키를 시도했고 어디서 거절됐는지 보여 줘요.WARNING: UNPROTECTED PRIVATE KEY FILE!
개인 키 파일 권한이 너무 열려 있어서 SSH가 키를 쓰지 않은 거예요. chmod 600 ~/.ssh/id_ed25519로 고치세요. WSL에서 Windows 쪽 경로(/mnt/c/...)의 키는 권한이 바뀌지 않을 수 있으니, WSL의 ~/.ssh로 복사한 뒤 chmod하세요.
REMOTE HOST IDENTIFICATION HAS CHANGED
서버 지문이 known_hosts에 저장된 값과 다르다는 경고예요. 서버를 새로 만들어 같은 주소와 포트를 받았다면 예상할 수 있는 일이에요. 그런 일이 없었다면 연결이 가로채졌을 수도 있으니 접속하지 말고 서버 관리자에게 먼저 확인하세요. 원인이 분명할 때만 저장된 키를 지워요.
ssh-keygen -R <host>
ssh-keygen -R "[<host>]:<port>"[주소]:포트 형태로 저장돼서 두 번째 줄을 써요.Connection timed out, Connection refused
Connection timed out: 서버까지 닿지 못했어요. 주소와 포트, 서버가 켜져 있는지 확인하세요. 회사나 학교 네트워크가 포트를 막기도 해서, 휴대폰 핫스폿에서 시도해 보면 원인을 가를 수 있어요.Connection refused: 서버에는 닿았지만 그 포트에서 SSH가 응답하지 않아요. 포트 번호와 SSH 서비스 상태를 확인하세요.
작업을 마칠 때
서버를 중지만 하면 GPU가 할당된 채로 요금이 계속 나가요. 삭제해야 멈추고, 이때 기본 로컬 디스크도 지워지니 남길 데이터는 영구 볼륨에 두거나 내려받아 두세요.
자주 묻는 질문
RSA 키와 ed25519 키 중 무엇을 써야 하나요?
새로 만든다면 ed25519를 쓰세요. 아주 오래된 시스템이 ed25519를 지원하지 않을 때만 ssh-keygen -t rsa -b 4096으로 RSA 키를 만드세요.
여러 컴퓨터에서 같은 서버에 접속하려면 개인 키를 복사해야 하나요?
아니요. 컴퓨터마다 키를 따로 만들어 각각 등록하세요. 한 컴퓨터를 잃어버리면 그 공개 키만 지우면 돼요.
패스프레이즈를 매번 입력하기 번거로워요.
ssh-add ~/.ssh/id_ed25519로 ssh-agent에 키를 등록하면 다시 묻지 않아요. Windows에서는 ssh-agent 서비스가 꺼져 있을 수 있어서 먼저 서비스를 켜야 해요.
VS Code로는 접속이 안 되는데 원인을 어떻게 찾나요?
먼저 터미널에서 ssh gpu-server처럼 같은 별칭으로 접속되는지 확인하세요. 터미널에서는 되는데 VS Code만 실패한다면 출력(Output) 패널의 Remote - SSH 로그에 원인이 나와 있어요.
