Jump between servers with SSH aliases and PEMs, without touching ~/.ssh/config.
Project description
Skipper 🛶
Jump through your servers, not your configs.
A minimalist CLI tool to manage and connect to SSH servers using aliases and PEM file paths — without touching your ~/.ssh/config.
🚀 Why Skipper
- Fast: Just run
skipper connect web-01and you're in. - Secure: Doesn’t store keys, only paths to your
.pemfiles. Config file uses strict600permissions. - Git-friendly: Plain JSON config, optionally versionable.
- Enterprise-ready: Supports bastion/ProxyJump, SSH flags, and PEM routing.
✨ Features
- Register hosts via alias (IP/FQDN, user, port, PEM).
- Support for bastion/jump hosts via alias or
user@host:port. - Interactive launcher (
skipper menu) with optionalfzfintegration. - Pass extra SSH flags after
--, e.g., port forwarding or compression.
🧩 Requirements
- Python 3.10+
- (Optional)
fzffor enhanced interactive menus
📦 Installation (recommended via pipx)
macOS:
brew install pipx && pipx ensurepath
pipx install .
or directly from GitHub:
pipx install git+https://github.com/RchrdMrtnz/skipper.git
Check installation:
skipper --help
Local development
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
skipper --help
🔐 Recommendation: Centralize your PEMs
Keep your .pem files in a private, secured folder:
mkdir -p ~/.pem
for f in ~/*.pem; do [ -f "$f" ] && mv -i "$f" ~/.pem/; done
chmod 600 ~/.pem/*.pem
⚙️ Basic Usage
Add a host:
skipper add --alias web-01 --hostname 54.12.34.56 --user ubuntu --pem ~/.pem/web-01.pem
List hosts:
skipper ls
Connect:
skipper connect web-01
Pass extra SSH flags:
skipper connect web-01 -- -L 5433:localhost:5432
Remove:
skipper rm web-01
🛰️ Bastion / ProxyJump
skipper add --alias bastion --hostname 3.88.77.66 --user ubuntu --pem ~/.pem/bastion.pem
skipper add --alias db-priv --hostname 10.0.2.15 --user ubuntu --pem ~/.pem/db.pem --bastion bastion
skipper connect db-priv
You can also use:
--proxy-jump "user@host:port"
🎛️ Interactive Menu
skipper menu
- If
fzfis installed, fuzzy-search menu is used. - Otherwise, a simple console selector is shown.
🧰 Commands
skipper add
skipper ls
skipper rm <alias>
skipper connect <alias> [-- <ssh flags>]
skipper menu
skipper edit
🗂️ Configuration
Default: ~/.config/skipper/hosts.json (600 perms)
Override via:
export SKIPPER_CONFIG="$PWD/infra/skipper.hosts.json"
🔒 Security
- No private key material stored — only file paths
- Enforce strict PEM permissions:
chmod 600 ~/.pem/*.pem
- If versioning config, consider encrypting
SKIPPER_CONFIG
🛣️ Roadmap
- Tags and filters
- Tunnel templates
skipper test <alias>- Import from
~/.ssh/config
🧪 Example Smoke Test
skipper add --alias test --hostname 11.11.11.11 --user ubuntu --pem ~/.pem/test.pem
skipper ls
skipper connect test
skipper connect redis-momentum -- -L 6380:localhost:6379
📄 License
GPL-3.0 — see LICENSE
🙌 Contributing
PRs welcome. Follow Typer + Pydantic style, simple tests, clear commits (feat:, fix:, docs:).
Skipper — jump through your servers, not your configs. 🛶
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skipper_ssh_cli-0.1.2.tar.gz.
File metadata
- Download URL: skipper_ssh_cli-0.1.2.tar.gz
- Upload date:
- Size: 44.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59ab39e6f8fba537bee81872d73901761bda5497bfe96c3b2c50337e04ebcdad
|
|
| MD5 |
6785a21b7b9664d0d9ffbb26a94b2033
|
|
| BLAKE2b-256 |
3098fded7e855f91fa960fde60a62eb1f4684b16098805665ac50367bfac93aa
|
File details
Details for the file skipper_ssh_cli-0.1.2-py3-none-any.whl.
File metadata
- Download URL: skipper_ssh_cli-0.1.2-py3-none-any.whl
- Upload date:
- Size: 31.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a57f3bf9137ca84969f16b635a69a26cf260ec9f270988b8074d3f1c738eecc3
|
|
| MD5 |
93ff7f5bf4ae1e3c16f0d2b0fe591e8b
|
|
| BLAKE2b-256 |
64a93e74ba49a0e58b1ac8f19dd7c0c49e4e08ce92f9c2c506c4da952d6828d4
|