Skip to main content

ssh-connection-manager: a TUI for hosts in ~/.ssh/config

When ~/.ssh/config holds dozens of stands, bastions, and jump hosts, memorizing aliases stops being fun. ssh-connection-manager is a TUI on top of ordinary OpenSSH: a host list, a filter, a connect via the system ssh, and a way to append a new block to the config.

The CLI command is ssh-connect. Repository: gitlab.com/unsorted-projects/ssh-connection-manager.

Why not another SSH client

The client already exists: the system ssh. What is missing is navigation over the config file.

The tool:

  • reads ~/.ssh/config or another file (-c);
  • lists concrete Host entries, not wildcards such as Host *;
  • follows Include (up to 16 levels);
  • on Enter suspends the TUI and runs ssh -F <config> <alias>;
  • after the session ends, shows the list again.

It is Python 3.11+ and Textual. There is no custom SSH stack: keys, ProxyJump, and the agent stay with OpenSSH.

What the table shows

Column names keep the alias and the address apart:

FieldMeaning
HostNamealias from the Host directive
ConnectPointaddress from HostName in the config (IP or DNS)
Useruser, if set
Portport, or 22 by default

The details line shows IdentityFile and ProxyJump when present. If a host has no User (and none comes from Host *), the TUI asks for a username before connecting.

The filter (/) matches alias and ConnectPoint.

Keys

KeyAction
Enterconnect
aadd a host to the config
/filter
qquit

Adding a host appends a block; existing sections are not rewritten. If the file does not exist yet, it is created with mode 0600. Wildcard characters are rejected in the alias: only explicit names appear in the list.

Example of what gets written:

Host prod
    HostName 10.0.0.5
    User deploy
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Install

On Debian/Ubuntu do not install into the system Python (externally-managed-environment). Use a venv or pipx.

git clone git@gitlab.com:unsorted-projects/ssh-connection-manager.git
cd ssh-connection-manager
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

Then ssh-connect is available in the activated venv. To run it from any directory:

mkdir -p ~/.local/bin
ln -sf "$(pwd)/.venv/bin/ssh-connect" ~/.local/bin/ssh-connect

Or pipx install -e . — pipx isolates the environment and puts the binary in ~/.local/bin.

An interactive TTY is required: without a terminal, Textual cannot hand the screen over to ssh.

ssh-connect
ssh-connect -c /path/to/other/config
Note

The tool does not rewrite other config blocks and ignores Match. Only named Host entries without *?[ appear in the list.

Why this fits the job

One config file stays the source of truth. The TUI does not duplicate inventory in YAML and does not store passwords: only what already lives in OpenSSH. For a Lead DevOps that is the usual loop: bastion, prod, jump — pick a row and you are in the session.