| Crates.io | sshing |
| lib.rs | sshing |
| version | 0.1.6 |
| created_at | 2025-12-31 19:55:49.079348+00 |
| updated_at | 2026-01-06 20:14:58.497734+00 |
| description | A terminal-based SSH connection manager |
| homepage | |
| repository | https://github.com/joshjetson/sshing |
| max_upload_size | |
| id | 2015210 |
| size | 401,222 |
A modern, terminal-based SSH connection manager with an intuitive TUI interface.
sshing is a powerful SSH connection manager that simplifies the way you manage and connect to remote servers. Instead of manually editing ~/.ssh/config or remembering complex SSH commands, sshing provides a beautiful terminal interface where you can:
All your configuration is stored in standard SSH config format, so sshing works seamlessly with existing SSH tools and workflows.
j/k, jump with g/G, page with Ctrl+d/u~/.ssh/config~/.ssh/sshing.jsonFrom Source:
git clone https://github.com/joshjetson/sshing.git
cd sshing
cargo build --release
sudo cp target/release/sshing /usr/local/bin/
Using Cargo:
cargo install sshing
Launch sshing:
sshing
Add your first host:
n to create a new hostj/k or Tab to navigate):
my-server192.168.1.10ubuntu22 (or leave empty for default)Ctrl+S to saveConnect to your host:
j/k or arrow keysSpace or Enter to connectThat's it! You're now SSH'd into your server.
# Clone the repository
git clone https://github.com/joshjetson/sshing.git
cd sshing
# Build the release binary
cargo build --release
# Copy to your PATH
sudo cp target/release/sshing /usr/local/bin/
# Or install to user directory
cp target/release/sshing ~/.local/bin/
cargo install sshing
Download the latest release from GitHub Releases and add it to your PATH.
sshing --version
sshing uses intuitive Vim-style keybindings:
j or ↓k or ↑gGCtrl+dCtrl+uThe currently selected host is highlighted with a cyan bar.
n from the main table viewEnter to select identity filesEnter to select flags like -t, -A, etc.Enter to select shell (bash, zsh, fish, etc.)Enter to assign tagsj/k, ↑/↓, or TabCtrl+S to savej/ke to editCtrl+S to save or Esc to cancelj/kd to deletey or Enter (or cancel with n or Esc)SSH flags customize how the connection is established. Common use cases:
-t - Force pseudo-terminal (needed for interactive shells like zsh)-A - Enable SSH agent forwarding (use your local SSH keys on remote)-X / -Y - Enable X11 forwarding (run GUI apps remotely)-C - Enable compression (faster on slow connections)-v / -vv / -vvv - Verbose mode for debuggingTo add flags to a host:
e)Enter to open the flag selectorj/k to navigate, Space or Enter to toggle flagsEsc to return to the editorCtrl+S to saveChoose which shell to execute after connecting. Useful when:
zsh on certain serversTo set a shell:
e)Enter to open the shell selectorj/k to navigate, Space or Enter to selectEsc to return to the editorCtrl+S to saveAvailable shells: bash, zsh, fish, sh, ksh, tcsh, dash
Tags help you organize hosts by environment, role, or any category you choose.
sshing maintains a global tag pool that's shared across all hosts. When you create a tag, it's saved to the pool and can be assigned to any host.
e)Enter to open the tag editora or n to create a new tagproduction, staging, web, database)Enter to add it to the global poolj/k to navigate the tag listSpace or Enter to toggle tag assignment[✓] checkboxEsc to return to the editorCtrl+S to savet from the main table viewEnter to apply the filterEsc to clear all filters/ to enter search modeEnter to apply the searchEsc to clear the searchSearch matches against:
Press s to cycle through sort options:
sshing includes powerful Docker container management capabilities, allowing you to manage containers on any remote server directly from the TUI.
d to enter Docker modeNote: Docker must be installed on the remote server. When entering Docker mode, you'll be prompted whether to use
sudofor Docker commands. Choose Yes if Docker requires root privileges on the server, or No if the server has a docker group configured for non-root access. This choice applies to all Docker commands during the session.
The container list displays:
● Up (running), ○ Down (stopped), ✗ Failed (exited with error)✓ has script or ✗ no script)Navigate with j/k or arrow keys. The title bar shows scroll position when the list exceeds screen height.
From the container list, you can perform these actions:
| Key | Action | Description |
|---|---|---|
S |
Start | Start a stopped container |
s |
Stop | Stop a running container |
r |
Restart | Restart the container |
p |
Pull | Pull the latest image for the container |
d |
Delete | Remove the container (with confirmation) |
X |
Purge | Remove container AND its image |
sshing provides several tools to inspect running containers:
l)f to toggle follow mode (live updates)+/- to increase/decrease line count (100 → 500 → 1000 → 5000 → 50000)j/k, g/G, Ctrl+d/uD)T)docker top)j/kI)j/kE)A key feature of sshing's Docker integration is the ability to associate deployment scripts with containers. These are shell scripts (typically containing docker run or docker create commands) that define how a container should be deployed.
b)b from the container list to open the file browser/opt, home directoriesEnter to select a scriptsshing looks for scripts matching patterns like:
start*.sh, deploy*.sh, run*.sh, docker*.shv)Once a script is associated:
v to view the full script contente)Edit deployment scripts visually:
Navigate tabs with Tab/Shift+Tab, edit values with Enter, save with Ctrl+S.
x)Press x to execute the deployment script, which will:
b)Press b on a container with an existing script to browse for a different script, replacing the association.
sshing includes an interactive rsync interface for synchronizing files between your local machine and remote servers.
r to enter rsync modeNote: Rsync must be installed on both your local machine and the remote server. If rsync is not available locally, the
rkey will be greyed out in the footer.
The rsync view shows:
[local] or [remote])Local → Remote or Remote → Local-z flag is enabled| Key | Action |
|---|---|
j / ↓ |
Move to next field |
k / ↑ |
Move to previous field |
i / Enter |
Edit the selected field |
r |
Toggle sync direction (push/pull) |
z |
Toggle compression |
b |
Open file browser for current field |
Space |
Execute rsync |
Esc / q |
Return to host list |
Instead of typing paths manually, press b to open an interactive file browser:
The browser opens showing the appropriate filesystem:
Navigate with:
j/k or arrows to move through entriesEnter to enter a directory or select a fileSpace to select the current directory as the pathBackspace or h to go up one directoryg/G to jump to top/bottomEsc to cancelThe selected path is inserted into the field
r if needed (default: push to remote)z for slow connectionsSpace to executesshing will run rsync with:
-avz flags (archive, verbose, compress if enabled)After completion, you'll return to the rsync view with a status message.
Deploy local files to server:
r on a host/home/user/project/dist//var/www/html/Local → RemoteSpace to syncDownload logs from server:
r on a hostr to toggle direction to Remote → Localb to browse, navigate to /var/log/myapp//home/user/logs/Space to sync| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
g |
Jump to first host |
G |
Jump to last host |
Ctrl+d |
Page down |
Ctrl+u |
Page up |
Space / Enter |
Connect to selected host |
n |
Create new host |
e |
Edit selected host |
D |
Delete selected host |
d |
Enter Docker mode |
r |
Enter Rsync mode |
/ |
Search hosts |
t |
Filter by tags |
s |
Cycle sort order |
Esc |
Clear filters/search |
? |
Show help |
q |
Quit application |
| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Navigate fields (navigation mode) |
Tab / Shift+Tab |
Navigate fields |
Enter |
Activate editing mode / Open special editors |
Esc |
Exit editing mode / Cancel |
Ctrl+S |
Save host |
When editing a field:
Backspace to delete charactersEnter to save fieldEsc to cancel changes to current field| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Navigate keys |
Space / Enter |
Toggle key selection |
Esc |
Return to editor |
| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Navigate flags |
Space / Enter |
Toggle flag selection |
Esc |
Return to editor |
| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Navigate shells |
Space / Enter |
Select/deselect shell |
Esc |
Return to editor |
| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Navigate tags (selection mode) |
Space / Enter |
Toggle tag assignment |
a / n / i |
Create new tag (enter input mode) |
Esc |
Return to editor |
When creating a new tag:
Enter to add to global poolEsc to cancel| Key | Action |
|---|---|
| Type | Filter hosts in real-time |
Backspace |
Delete character |
Enter |
Apply search |
Esc |
Cancel search |
| Key | Action |
|---|---|
y / Y / Enter |
Confirm deletion |
n / N / Esc |
Cancel |
| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Navigate containers |
g / G |
Jump to first/last container |
Ctrl+d / Ctrl+u |
Page down/up |
S |
Start container |
s |
Stop container |
r |
Restart container |
p |
Pull latest image |
d |
Delete container |
X |
Purge container and image |
l |
View logs |
D |
View stats |
T |
View processes (top) |
I |
Inspect container |
E |
View environment variables |
b |
Browse for deployment script |
n |
Create new script |
v |
View associated script |
e |
Edit associated script |
x |
Execute deployment script |
Esc |
Return to host list |
| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Scroll logs |
g / G |
Jump to top/bottom |
Ctrl+d / Ctrl+u |
Page down/up |
f |
Toggle follow mode |
+ / = |
Increase line count |
- |
Decrease line count |
Esc |
Return to container list |
| Key | Action |
|---|---|
Tab / Shift+Tab |
Switch between tabs |
j / k / ↑ / ↓ |
Navigate items |
Enter |
Edit selected item |
a / n |
Add new item |
d |
Delete selected item |
Ctrl+S |
Save script |
Esc |
Cancel / Return |
| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Navigate fields |
i / Enter |
Edit current field |
r |
Toggle sync direction |
z |
Toggle compression |
b |
Open file browser |
Space |
Execute rsync |
Esc / q |
Return to host list |
| Key | Action |
|---|---|
j / k / ↑ / ↓ |
Navigate entries |
g / G |
Jump to first/last entry |
Ctrl+d / Ctrl+u |
Page down/up |
Enter |
Enter directory / Select file |
Space |
Select current directory |
Backspace / h |
Go up one directory |
Esc |
Cancel |
sshing stores standard SSH configuration in ~/.ssh/config:
Host my-server
HostName 192.168.1.10
User ubuntu
Port 22
IdentityFile ~/.ssh/id_rsa
ProxyJump bastion
This file is compatible with the standard ssh command and other SSH tools.
Extended metadata (notes, tags, SSH flags, shell, last used) is stored in ~/.ssh/sshing.json:
{
"version": "1.0",
"global_tags": [
"prod",
"staging",
"dev",
"web",
"database"
],
"hosts": {
"my-server": {
"note": "Main production web server",
"tags": ["prod", "web"],
"ssh_flags": ["-t", "-A"],
"shell": "zsh",
"last_used": "2025-12-31T10:30:00Z"
}
}
}
~/.ssh/config~/.ssh/sshing.jsonIf you already have an existing ~/.ssh/config file, sshing will:
Contributions are welcome! Here's how you can help:
git checkout -b feature/amazing-featuregit commit -m 'Add amazing feature'git push origin feature/amazing-feature# Clone your fork
git clone https://github.com/joshjetson/sshing.git
cd sshing
# Build and run
cargo build
cargo run
# Run tests
cargo test
# Check code quality
cargo clippy
cargo fmt
Found a bug? Have a feature request? Please open an issue with:
MIT License - see LICENSE file for details.
Built with: