/ PRODUCT · OPEN SOURCE · RUST
deploy@web:~$ uptime
12:01 up 3 days, load 0.08
deploy@web:~$ systemctl is-active nginx
active
deploy@web:~$ █
postgres@db1:~$ psql
psql (16.2)
postgres=# select count(*) from orders;
count
-------
18422
postgres=#
ssh running in its own terminal.
/ WHY
Which IP was staging? Which port does the backup box use, and does
it go through the bastion? The answers end up spread across your
shell history, a ~/.ssh/config
with no notes and a dozen open tabs.
sshh keeps your connections in a list you can search, with a name,
tags and notes for each one, and opens their sessions next to each
other in a single window. It doesn't reimplement SSH: it always runs
your system ssh, so your
config, agent, ProxyJump,
ControlMaster,
known_hosts and FIDO keys
keep working as they do today.
/ JUST LIKE SSH
sshh takes exactly the same
arguments as ssh. The first
time you connect somewhere new, a short form offers to save it,
prefilled with what ssh itself would use. From then on, the alias
is enough.
$ sshh -p 2222 deploy@web.example.com
Enter save and connect · Esc just connect
# next time
$ sshh web
$ sshh web uptime
$ sshh -L 8080:localhost:80 web
01
Your flags win
With a saved alias, sshh only fills in host, user, port, key or jump host when you didn't pass them yourself. Anything it doesn't understand goes to ssh unchanged.
02
Never in the way
If something of its own fails, sshh warns and runs ssh with your original arguments. The form only appears in interactive terminals, so scripts are untouched.
03
Safe as an alias
Add alias ssh=sshh to your
shell and keep typing what you always typed. With
sshh ssh-config sync, scp,
rsync and git know your aliases too.
/ SESSIONS
Run sshh with no arguments
and you get a lazygit-style layout: the connection list with its
details, and as many terminal columns as fit on screen — each one a
live session you can switch between without closing it.
FIND
Fuzzy search
Over alias, name, user, host, description and tags. Filter with
#prod or combine
#prod #db.
SPLIT
Columns & panes
Up to nine columns, and panes stacked inside them like tmux splits. Rearrange them, or take one full screen.
REAL SSH
A real terminal
Each session is ssh in its own pseudo terminal: passwords, host key prompts, vim, htop, the mouse and 5000 lines of history.
FILES
sftp next door
Press s to open sftp for the same server in the next column, while its ssh session keeps running.
/ KEYBOARD
They follow vim, less, lazygit and fzf. While a session has focus, every key goes to it — only the Alt shortcuts stay with sshh. And everything also works with the mouse.
/ DETAILS
No secrets
sshh never stores passwords. Keep using your keys and your agent as usual.
Imports your config
sshh import-ssh-config
turns your Host blocks
into connections, following Includes.
Try it with --dry-run.
Scriptable
ls,
add,
rm,
history and JSON
export / import to share connections with your team.
Your theme
It only uses your terminal's 16-color palette, so it looks like the rest of your setup.
/ INSTALL
$ curl -fsSL https://raw.githubusercontent.com/ewiggin/sshh/main/install.sh | sh
On Linux x86_64 and aarch64 it downloads the static binary, checks
its SHA-256 and installs it with its man page in
~/.local/bin. On other
systems it builds from source. Run it again to update. sshh is
built by MEPS — if you need something similar for your team,
get in touch.