
essh v0.3.2
TUI를 갖춘 향상된 SSH 클라이언트 — 연결, 키, 세션 관리
███████╗███████╗███████╗██╗ ██╗
██╔════╝██╔════╝██╔════╝██║ ██║
█████╗ ███████╗███████╗███████║
██╔══╝ ╚════██║╚════██║██╔══██║
███████╗███████║███████║██║ ██║
╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝
Enhanced SSH for people with fleets
순수 Rust로 작성된 SSH 클라이언트로, 조밀한 Netwatch 스타일의 TUI를 제공합니다. 여러 세션, 실시간 호스트 메트릭, 플릿 전체의 차이(Divergence) — 터미널을 떠나지 않고 모두 확인할 수 있습니다.

설치
cargo install essh
또는 macOS, Linux용 arm64 또는 x86_64 바이너리를 Releases에서 받을 수 있습니다.
소스에서 빌드:
git clone https://github.com/matthart1983/essh && cd essh
cargo build --release # ./target/release/essh
시작하기
essh # launcher: type to search, Enter to connect
essh connect deploy@web-01 # straight to a host
essh workspace open prod # restore a saved set of sessions
essh run web -- uptime # fan a command across a tagged group
호스트는 ~/.ssh/config에서 가져옵니다. IdentityFile, ProxyJump,
Match도 포함되므로 시작하기 전에 따로 가져올 것이 없습니다.
키
자주 쓰는 모든 동작은 한 번의 키 입력으로 실행됩니다. 셸은 모든 Ctrl
조합을 그대로 유지하므로 Ctrl+D는 여전히 EOF를 의미하고 Ctrl+C는 여전히
인터럽트를 의미합니다.
F1 도움말 | F2 모니터 | F3 파일 | F4 포트 포워딩 |
F5 미니 모니터 | F6 분리 | F7/F8 이전/다음 세션 | F9 새 세션 |
F10 명령 메뉴 |
그 외의 동작은 Ctrl+A를 누른 뒤 떼고 해당 키를 누르면 됩니다. s 분할,
w 닫기, t 테마, 1–9 세션 이동, [/] 크기 조정입니다. 세션 하단의
스트립(strip)에 지금 적용되는 키 목록이 표시되므로 외울 것이 없습니다. 접두
키는 [session] 아래의 prefix_key로 변경할 수 있습니다.
Option/Alt 조합도 터미널이 Meta 키로 전송하면 함께 작동하며, 기능 키는
설정이 필요 없고 두 플랫폼에서 동일하게 동작합니다.
기능
| 다중 세션 | 하나의 창에서 탭과 분할을 지원하며, 세션별 스크롤백과 재연결 기능을 제공합니다. |
| 실시간 호스트 모니터 | CPU, 메모리, 디스크, 네트워크 및 상위 프로세스를 백그라운드에서 수집해 두므로 열면 바로 최신 상태로 표시됩니다. 에이전트 없이 일반 SSH exec 채널만 사용합니다. |
| 차이(Divergence) | 각 호스트를 동료(peer) 집합과 비교하여 어느 호스트가 어떤 측면에서, 왜 다른지 알려줍니다. |
| 파일 전송 | SFTP를 통한 로컬/원격 양쪽 창 브라우저. |
| 포트 포워딩 | 세션을 끊지 않고 포워드를 추가, 확인, 제거할 수 있습니다. |
| 감사 및 재생 | 구조화된 JSON 감사 로그. 세션은 재생용으로 asciicast에 기록됩니다. |
차이(Divergence)
웹 서버가 40대 있는데 39대는 정상이고, 한 대만 커널이 다르거나 직접 편집한
nginx.conf를 사용하고 있습니다. 초록색 점들이 늘어선 컬럼으로는 구조적으로
그런 차이를 보여줄 수 없습니다.
ESSH는 태그를 기준으로 호스트를 동료(peer) 집합으로 묶고, 각 호스트에서 동일한 사실(facts)을 수집한 다음, 그룹의 합의(consensus)를 기준으로 각 호스트를 평가합니다.
100.0% of 16 facet-checks agree
0 facets diverge across 0 hosts.
2 hosts have never been probed, so their facets are unknown rather than in agreement.
Fleet 화면은 이상치(outlier)와 그 판단의 근거가 된 측면(facets)을 구체적으로 제시하므로, 결과는 막연한 주장이 아니라 직접 확인할 수 있는 판정입니다. 수집할 수 없는 사실은 '수집되지 않음'으로 보고되며, 결코 합의로 간주되지 않습니다.
설정
상태는 ~/.essh/에 저장됩니다: config.toml, cache.db, audit.log,
sessions/, recordings/, known_cas/.
essh config init # write a default config
essh config edit # open it in $EDITOR
essh config resolve web-01 # show how ssh_config resolves a host
호스트 키는 검증되어 캐시되며, TOFU 정책(strict, prompt, auto)을
설정할 수 있습니다. 암호화 방식과 KEX 알고리즘도 제한할 수 있습니다.
전체 설정과 아키텍처 참조: SPEC.md.
CLI
essh hosts list | add | remove | import | health
essh keys list | add | remove
essh workspace list | open | save | show | remove
essh session list | replay <id>
essh diag <session-id> # diagnostics for a past session
essh why <host> # explain why a host will not connect
essh audit tail --lines 20
essh bench # published performance numbers
개발
cargo test
cargo clippy --all-targets --all-features -- -D warnings
cargo fmt --check
CI는 모든 푸시에서 세 가지를 모두 실행합니다.
tests/tui_harness.rs는 PTY에서 실제 바이너리를 구동하고, 마감 시간(deadline)
안에 파싱된 터미널 화면을 기준으로 검증합니다. TUI에서 중요한 실패는 잘못된
프레임이 아니라 프레임 자체가 표시되지 않는 것이기 때문입니다. SSH가 필요한
테스트는 접근 가능한 호스트가 없으면 스스로 건너뜁니다.
기여
Fork하고 브랜치를 만든 뒤 변경하고, 위 세 가지 검사를 실행한 다음 PR을 열어주세요.
라이선스
MIT. LICENSE를 참조하세요.