v0.1.0 · 개발 중 — 엔진은 실제 SSH 서버로 검증됨

무거운 SSH 클라이언트,
이제 그만.

luSSH는 MobaXterm을 대체하려고 만드는 SSH 클라이언트입니다. Rust + Tauri v2로 만들어서 가볍고, 빠르고, 무엇보다 끊겼을 때 끊긴 걸 알려줍니다.

Windows 10 / 11 · 무료 오픈소스 · Linux 지원 예정

< 30MB
설치 바이너리 목표
< 1.5s
콜드 스타트 목표
477
통과한 자동 테스트 실측
왜 또 SSH 클라이언트인가

기능 개수가 아니라, 세 가지 숫자로 승부합니다.

기존 도구는 기능은 많지만 무겁고, 연결이 끊겨도 끊긴 줄 모르는 좀비 세션이 남습니다. luSSH는 기능을 늘리는 대신 측정 가능한 목표를 정해두고 거기에 맞춥니다.

가볍다

UI 프레임워크를 쓰지 않습니다. 번들 크기가 곧 시작 시간이기 때문입니다. Rust 엔진 + 시스템 웹뷰라 무거운 런타임을 따로 깔지 않아도 됩니다.

빠르다

터미널 출력은 JSON이 아니라 바이너리 채널로 흐릅니다. 10MB가 쏟아져도 한 바이트도 흘리지 않고, 그 와중에도 UI는 계속 반응합니다.

에러가 적다

핵심은 여기입니다. 에러가 적다는 말의 실질은 기능이 아니라 실패했을 때의 동작입니다. 좀비 세션·무한 대기·조용한 실패를 없앱니다.

기능

매일 쓰는 네 가지만, 제대로.

포트 포워딩·X11·RDP는 MVP 범위 밖입니다. 확장 지점만 열어뒀습니다.

01 SSH 터미널

탭과 분할, 스크롤백, 검색. xterm.js 위에 WebGL 렌더러를 얹었습니다.

  • 한글 IME 조합 입력 처리
  • CJK 문자 폭 (Unicode 11)
  • 탭 · 수평/수직 분할
  • 스크롤백 검색

02 세션 프로필

서버가 늘어나도 찾는 데 시간이 안 걸리도록. 폴더 트리와 태그로 정리합니다.

  • 폴더 트리 · 태그
  • 즉시 검색
  • 빠른 연결 (Quick Connect)
  • 최근 접속 기록

03 SFTP 브라우저

로컬과 원격을 나란히 놓고 드래그로 옮깁니다. 취소하면 부분 파일까지 정리합니다.

  • 로컬 / 원격 이중 패널
  • 드래그 앤 드롭 전송
  • 진행률 · 속도 표시
  • 전송 취소 & 정리

04 자격증명 안전 저장

비밀번호를 앱이 직접 들고 있지 않습니다. OS 자격증명 저장소에 위임합니다.

  • Windows 자격증명 관리자 연동
  • SSH 키 · 패스프레이즈
  • ssh-agent / Pageant
  • known_hosts 호스트 키 검증
안정성

잘 될 때 말고, 안 될 때를 설계했습니다.

아래 항목은 전부 실제 SSH 서버(Docker 컨테이너)를 상대로 한 통합 테스트로 확인한 동작입니다.

서버가 죽었다
끊김을 감지하고 재연결을 시작합니다. 몇 번째 시도인지, 다음 시도가 언제인지 화면에 표시합니다. 조용히 멈춰 있는 좀비 탭이 남지 않습니다.
포트는 열렸는데 응답이 없다
정해진 시간 뒤 타임아웃으로 끝냅니다. TCP는 연결되지만 SSH 배너를 주지 않는 서버(tarpit)에서 무한 대기에 빠지지 않는 것을 확인했습니다.
32MB 업로드를 중간에 취소했다
남은 부분 파일을 정리합니다. 9.8MB 지점에서 취소한 뒤 원격에 반쪽 파일이 남지 않는 것을 테스트로 고정해 두었습니다.
자격증명 저장소에 접근할 수 없다
이번 실행에만 기억한다고 명시합니다. 저장에 실패했는데 저장된 것처럼 보이는 조용한 실패를 만들지 않습니다.
왜 이렇게까지 하나? Rust와 웹뷰 사이에는 컴파일러가 없습니다. 백엔드가 무엇을 반환하든 프론트의 타입 검사는 통과하고, 런타임에 가서야 죽습니다. 그래서 IPC 커맨드 33개 전부에 실제 직렬화된 JSON 예시를 담은 계약 문서를 단일 진실 공급원으로 두고, 양쪽을 거기에 맞춥니다.
성능 예산

목표를 숫자로 적어두고, 넘으면 고칩니다.

아래는 지켜야 할 예산이지 광고 문구가 아닙니다. Windows 실측이 끝나면 이 표에 실제 측정값이 함께 올라갑니다.

luSSH 성능 예산 목표치
항목목표상태
콜드 스타트 → 창 표시< 1.5s측정 대기
세션 연결 (LAN)< 800ms측정 대기
10MB 출력 처리드롭 0엔진 검증됨
유휴 메모리 (탭 1개)< 150MB측정 대기
탭 10개 메모리< 400MB측정 대기
설치 바이너리 크기< 30MB측정 대기

이미 검증된 것

Rust 254건 · 프론트 223건 테스트 통과 실제 SSH 서버 통합 테스트 18건 2MB 대량 출력 무손실 SFTP 300KB 왕복 일치 터미널 리사이즈 반영 clippy 경고 0
다운로드

Windows에서 시작하기

무료 오픈소스입니다. 계정도, 텔레메트리도 없습니다.

Windows 10 / 11

64-bit (x64) · 설치 프로그램

릴리스 페이지 열기

아직 배포용 설치 파일이 올라가지 않았습니다. Windows 첫 빌드가 끝나는 대로 Releases에 게시됩니다.

  • Windows 11은 WebView2가 기본 탑재되어 별도 설치가 필요 없습니다.
  • 서명 인증서가 아직 없어 SmartScreen 경고가 나올 수 있습니다.

소스에서 빌드

지금 바로 실행해 보고 싶다면

# 사전 준비: Rust · Node 20+ · VS Build Tools (C++)
git clone https://github.com/tbop02k/luSSH.git
cd luSSH
npm install
npm run tauri dev

첫 빌드는 의존성 컴파일로 5~15분 걸립니다. 이후에는 증분 빌드라 훨씬 빠릅니다.

  • 배포 빌드는 npm run tauri build
  • 테스트는 npm test (Rust + 프론트)

지금 상태를 솔직하게

검증됨 — 실제 SSH 서버 대상

  • 연결 수립 · 비밀번호 인증 · 인증 실패 경로
  • PTY 셸 · 대량 출력 무손실 · 리사이즈
  • SFTP 목록 / 업로드 / 다운로드 / 취소
  • 연결 끊김 감지와 재연결

미검증 — Windows 실행 필요

  • 앱 창 렌더링 (아직 한 번도 띄운 적 없음)
  • 한글 IME 입력 · CJK 문자 폭
  • Windows 자격증명 관리자 · ssh-agent
  • 성능 예산 전 항목

검증한 것과 하지 않은 것을 구분해서 적습니다. 그 구분이 흐려지면 결국 사용자가 대신 발견하게 되니까요.

기술 스택

무엇으로 만들었나

엔진Rust · russh — Tauri에 의존하지 않는 별도 크레이트
Tauri v2 — 시스템 웹뷰 사용, Electron 없음
프론트TypeScript + xterm.js — UI 프레임워크 없음
경계면IPC 커맨드 33개 · JSON 예시가 포함된 계약 문서

엔진(lussh-core)이 Tauri와 분리되어 있어, GUI가 없는 환경에서도 cargo test로 실제 SSH 서버를 상대로 검증할 수 있습니다.

자주 묻는 것

FAQ

MobaXterm / PuTTY와 뭐가 다른가요?

기능 개수로는 못 이깁니다. luSSH는 매일 쓰는 네 가지(터미널·세션·SFTP·자격증명)만 남기고, 대신 가볍고 실패 동작이 명확한 것에 집중합니다. X11이나 RDP가 필요하다면 아직 MobaXterm이 맞습니다.

Linux / macOS 버전은요?

Windows가 1순위입니다. Linux는 그다음이고, 코드는 이미 크로스 플랫폼으로 짜여 있습니다. macOS는 계획에 없지만 구조상 막혀 있지는 않습니다.

비밀번호는 어디에 저장되나요?

앱이 직접 보관하지 않고 OS 자격증명 저장소(Windows 자격증명 관리자)에 위임합니다. 저장소에 접근할 수 없으면 이번 실행에만 기억한다고 화면에 명시하고, 저장된 것처럼 보이게 하지 않습니다. 호스트 키는 known_hosts로 검증합니다.

텔레메트리나 계정 로그인이 있나요?

없습니다. 네트워크 연결은 사용자가 지정한 SSH 서버로만 나갑니다.

라이선스는요?

아직 정하지 않았습니다. 정해지면 저장소와 이 페이지에 함께 표기합니다.

버그를 찾았거나 기능을 제안하고 싶어요.

GitHub Issues에 남겨주세요. 재현 절차와 환경(Windows 버전, 접속 대상 서버 종류)이 있으면 훨씬 빠릅니다.

가벼운 SSH, 한 번 써보시겠어요?

설치 파일이 준비되는 대로 Releases에 올라옵니다. 별을 눌러두면 알림을 받을 수 있습니다.