
SSH 호스트를 위한 빠른 터미널 UI: 두 번의 키 입력으로 퍼지 검색 및 연결, 듀얼 패널 SFTP 파일 전송, 백그라운드 포트 포워딩을 지원합니다. 자체 호스트 데이터베이스를 유지하며 ssh 명령을 생성합니다 — ~/.ssh/config는 절대 수정하지 않습니다.
SSH 호스트를 퍼지 검색하고 두 번의 키 입력으로 연결하세요.
sshelf는 자체 호스트 목록을 유지하고, ssh 명령을 구성한 다음, 비켜섭니다. 터미널을 실제 OpenSSH에 넘겨주며 ~/.ssh/config는 절대 건드리지 않습니다.

macOS 및 Linux, x86_64 및 arm64. 사전 빌드된 패키지는 Rust 툴체인이 필요 없습니다. 런타임에 sshelf는 OpenSSH 8.4+ 를 요구하며, 이는 비밀번호 자동 공급이 가능한 버전입니다.
Homebrew (macOS 또는 Linux):
brew install max-rh/tap/sshelf
셸 설치 프로그램 (사전 빌드 바이너리, 플랫폼 자동 감지):
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/max-rh/sshelf/releases/latest/download/sshelf-installer.sh | sh
Debian/Ubuntu: 최신 릴리스에서 .deb 파일을 받은 후
sudo apt install ./sshelf_*_amd64.deb (또는 *_arm64.deb)를 실행하세요.
Fedora / RHEL / Rocky / openSUSE: 최신 릴리스에서 .rpm (정적 빌드, 모든 RPM 배포판에서 동작) 파일을 받은 후
sudo dnf install ./sshelf-*.x86_64.rpm (또는 .aarch64.rpm)를 실행하세요.
Gentoo: 커뮤니티 유지 오버레이 (비공식, @masterwolf-git님 감사).
eselect repository enable masterwolf && emerge --sync && emerge --ask app-admin/sshelf를 실행하세요.
Cargo (crates.io에서; Rust 1.88+ 필요):
cargo install sshelf.
셸 탭 완성 기능은 모든 패키지에 포함되어 있습니다. 설치 후 새 셸을 여세요. Linux에서 비밀번호는 순수 Rust Secret Service 백엔드를 사용합니다 (libdbus/OpenSSL 빌드 의존성 없음).
전체 세부 사항 및 완성 설정: 설치 가이드.
저는 수십 대의 머신(홈랩, 일부 VPS, 배스천 뒤의 몇 대)을 운영하면서 ssh -J bastion -i ~/.ssh/some-key -p 2222 user@host를 기억에서 입력하거나 셸 히스토리를 뒤져 찾곤 했습니다. 제가 시도한 모든 SSH 관리자는 ~/.ssh/config를 소유하거나, 계정을 만들어 누군가의 서버를 통해 호스트를 동기화하길 원했습니다. 저는 둘 다 원하지 않았습니다. 자체 목록을 유지하고, 명령을 구성하고, 비켜서는 런처가 필요했습니다. 그리고 키를 사용할 수 없는 소수의 호스트를 위한 비밀번호를 파일에 절대 넣지 않고 보관할 장소도 필요했습니다. 그래서 만들었습니다.
입력하여 필터링하세요. Enter로 연결합니다. 가장 많이 사용하는 호스트는 자동으로 상단에 표시되며(frecency: 사용 횟수, 최근 사용 여부에 따라 감쇠), tag:prod / site:homelab으로 목록을 더 좁힐 수 있습니다. Ctrl-y는 실행 대신 구성된 명령을 복사합니다. 셸에서 sshelf prod-web은 이름으로 연결하고 sshelf -는 마지막 호스트에 다시 연결하며, 둘 다 TUI를 열지 않습니다.

ssh로 exec() 실행sshelf는 호스트 레코드에서 argv를 구성하고, 자체 UI를 내린 다음, OpenSSH로 자기 자신을 대체합니다. 세션과 사용자 사이에 래퍼가 없습니다: 실제 TTY, 여러분의 ssh, 설정 없는 플래그. 세션이 끝나면 메뉴가 아닌 셸로 돌아갑니다. 실행하는 명령은 Ctrl-y가 보여주는 것과 정확히 동일합니다.
명령 구성 방법.
Ctrl-t는 단일 인증 연결을 통해 왼쪽에 로컬 파일, 오른쪽에 호스트 파일을 엽니다. Space로 표시, Ctrl-a로 필터에 표시된 모든 항목 표시, Ctrl-s로 전체 세트를 양방향 전송, F7로 디렉터리 생성. 대상에 이미 있는 이름은 건너뛰며 절대 덮어쓰지 않습니다.

Ctrl-f는 sshelf를 종료한 후에도, 터미널을 닫은 후에도 계속 실행되는 Local, Remote 또는 SOCKS 터널을 엽니다. F4는 모든 호스트의 모든 터널을 나열하고 선택한 터널을 중지합니다. 터널은 pid로 추적되고 실제 실행 중인 프로세스와 대조되므로, 종료된 후 목록에 남아 있지 않습니다. 데몬도, 슈퍼바이저도 없습니다.

tmux = "window" 또는 "pane"을 설정하면 Enter가 sshelf를 대체하는 대신 새 tmux 창(호스트 이름으로 명명) 또는 새 창에서 호스트를 엽니다. 세션을 종료해도 선택기는 계속 실행 중인 상태로 남아 있습니다.

F3는 사이트를 관리합니다: 사이트는 호스트를 그룹화하고 공유 배스천, 사용자, 포트, 키를 보유할 수 있으며, 연결 시 구성원이 이를 상속받아 호스트가 설정하지 않은 필드만 채웁니다. 태그는 필터링할 수 있는 자유 형식 레이블입니다. 둘 다 목록에 표시되며, 상속된 배스천은 sshelf가 구성하는 명령에도 표시됩니다.

sshpass 없는 비밀번호키를 사용할 수 없는 호스트를 위해 sshelf는 비밀번호를 OS 키링(또는 헤드리스 박스의 age 암호화 볼트)에 저장하고, ssh가 요청할 때 SSH_ASKPASS를 통해 공급합니다. 실제 비밀번호 또는 패스프레이즈 프롬프트 형태의 요청에만 응답하므로, 서버가 유사한 텍스트로 비밀번호를 피싱할 수 없습니다. 비밀번호는 파일에, ps에, 명령줄에 절대 존재하지 않습니다. 인증 코드도 필요한 호스트는 연결 시작 전에 프롬프트가 표시됩니다. 비밀번호, 키 & 2FA
· 보안.

sshelf export는 자체 ssh_config 조각 하나를 작성하고 ~/.ssh/config에 직접 붙여넣을 단일 Include 줄을 제공합니다. 이후 일반 ssh, scp, rsync, git 및 SSH 구성을 읽는 모든 것(VS Code Remote-SSH, JetBrains Gateway)이 배스천을 포함해 sshelf 호스트를 이름으로 해석합니다. 파일은 호스트가 변경될 때마다 새로 고쳐집니다. sshelf는 여전히 ~/.ssh 아래에 아무것도 쓰지 않습니다.

sshelf import는 ~/.ssh/config를 엄격히 읽기 전용으로 읽고, 모델링할 수 있는 호스트를 복사합니다. sshelf import --tailscale은 여러분의 tailscale CLI를 실행하여 MagicDNS 이름, 사이트로서의 tailnet, ACL 태그를 태그로 사용해 tailnet을 검색 가능한 호스트로 변환합니다. 둘 다 추가 전용이므로 재실행해도 항상 안전하며, 요청하지 않으면 실행되지 않습니다.
sshelf doctor문제가 있을 때 사용하는 단일 명령. OpenSSH 버전, 비밀 백엔드가 실제로 열리는지, hosts.toml이 파싱되는지, 존재하지 않는 사이트를 가리키는 호스트, 누락된 에이전트 소켓, 드리프트된 내보내기를 확인합니다. 각각에 대한 해결책을 제시합니다. 읽기 전용이며, 실패 시 종료 코드 1을 반환하고, 호스트에 절대 접촉하지 않습니다.

2026년 9월 각 프로젝트의 자체 README(Termius의 경우 사이트)에서 수집. "명시되지 않음"은 프로젝트 자체 문서에 언급이 없음을 의미합니다.
sshelf에는 대시보드, 컨테이너 관리, 팀 공유, Windows 빌드가 없습니다. 처음 세 가지는 선택이며, PRIVACY.md가 이유를 설명합니다: 각각은 sshelf가 여러분의 무언가를 보유하거나 자체적으로 무언가와 통신해야 함을 의미하기 때문입니다.
~/.ssh/config를 절대 편집하지 않으며, ~/.ssh 아래에 아무것도 쓰지 않습니다.hosts.toml에 비밀번호 없음. 이 파일은 커밋하고 공유해도 안전합니다.PRIVACY.md는 읽고, 쓰고, 실행하고, 전송하는 내용을 설명합니다.
SECURITY.md는 저장된 비밀번호에 대한 위협 모델입니다.
sshelf # TUI 실행 (Ctrl-a로 첫 호스트 추가)
sshelf import --dry-run # ~/.ssh/config에서 읽기 전용 가져오기 미리보기
sshelf import # ...실행
sshelf import --tailscale # ...또는 전체 Tailscale tailnet 가져오기
sshelf prod-web # 저장된 호스트에 바로 연결 (TUI 건너뜀)
sshelf - # 가장 최근 사용 호스트에 다시 연결
sshelf list tag:prod --json # 스크립트 가능한 목록 (필드 + ssh 명령)
sshelf print-command db # 실행 대신 ssh 명령 출력
sshelf export # 일반 ssh/scp/VS Code가 호스트를 인식하도록 Include 파일
sshelf doctor # 문제가 있나요? 설정을 확인하고 해결책을 안내받기
TUI에서: 입력하여 필터링(tag:NAME / site:NAME 추가)하고 Enter로 연결.
F1은 모든 키를 표시합니다.
**사용자 가이드**가 모든 것을 다룹니다:
빠른 시작 ·
CLI 참조 ·
구성 ·
FAQ ·
sshelf doctor.
기능별 페이지로 파일 전송,
포트 포워딩,
사이트 & 태그,
비밀번호 & 2FA, 그리고
SSH 구성 내보내기가 있습니다.
아키텍처 및 설계 결정은 docs/에 있으며, 머신용
llms.txt도 있습니다.
질문하거나, 기능을 제안하거나, 만든 것을
GitHub Discussions에서 보여주세요. 기여를 환영합니다.
CONTRIBUTING.md부터 시작하세요.
sshelf가 유용하다면 Bitcoin 팁을 감사히 받겠습니다 (완전 선택 사항):
Bitcoin: bc1qcdeyhpwq76u97dhymx876n49uq85z4y3ccrpje
MIT 또는 Apache-2.0 중 선택하여 이중 라이선스 (Rust 생태계 표준).
| sshelf | purple | omnyssh | Voltius | Termius |
|---|
| 실행 환경 | 터미널 (TUI) | 터미널 (TUI) | 터미널 (TUI) + 데스크톱 앱 | 데스크톱 앱 (Tauri) | 데스크톱 + 모바일 앱 |
~/.ssh/config 편집 | 절대 안 함 | 예, 제자리에서 | 아니요, 시작 시 읽기만 | 해당 없음 (자체 저장소) | 해당 없음 (자체 저장소) |
| 계정 필요 | 아니요 | 아니요 | 아니요 | 실시간 동기화용 | 예 |
| 다른 서비스용 토큰 보유 | 아니요 | 예, 클라우드 제공자당 하나 | 아니요 | 예, 동기화용 | 명시되지 않음 |
| 자체 네트워크 호출 | 없음 | 클라우드 제공자 동기화 | 호스트 메트릭 폴링 | 동기화, 업데이트, 호스트 메트릭 | 동기화 |
| 비밀번호 관리 | OS 키링 / age 볼트 | 키링 + 비밀번호 관리자 | 명시되지 않음 | 자체 E2EE 볼트 | 자체 암호화 볼트 |
| 연결 | ssh로 exec() | ssh 명령 실행 | 내장 터미널 | 내장 터미널 | 내장 터미널 |
| 포트 포워딩 | 예, 종료 후에도 유지 | 예, 실시간 모니터링 | 명시되지 않음 | 예 | 예 |
| 파일 전송 | 이중 창 SFTP | 분할 창 | 이중 패널 SFTP | 이중 창, 드래그 & 드롭 | SFTP |
| 컨테이너 / 메트릭 대시보드 | 아니요 | 예 | 예 | 예 | 명시되지 않음 |
| 팀 공유 | 아니요 | 아니요 | 아니요 | 유료 요금제 | 유료 요금제 |
| 플랫폼 | macOS, Linux | macOS, Linux | macOS, Linux, Windows, Termux | Windows, macOS, Linux | macOS, Windows, Linux, iOS, Android |
| 라이선스 | MIT / Apache-2.0 | MIT | Apache-2.0 | AGPL-3.0 | 독점 |