A modern, terminal-based SSH connection manager with an intuitive TUI interface.
- What is sshing?
- Features
- Quick Start
- Installation
- Usage Guide
- Docker Container Management
- Rsync File Synchronization
- Keyboard Shortcuts
- Configuration
- Contributing
- License
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:
- Browse all your SSH hosts in a visual table
- Add, edit, and delete host configurations with validation
- Organize hosts with tags (prod, staging, dev, etc.)
- Search and filter hosts in real-time
- Connect to any server with a single keystroke
- Customize SSH flags and shell per connection
- Manage Docker containers on remote servers with full control over logs, stats, and deployment scripts
- Sync files with rsync using an interactive file browser
All your configuration is stored in standard SSH config format, so sshing works seamlessly with existing SSH tools and workflows.
- Instant SSH Connections - Press Space to connect to any host
- Visual Host Management - Full CRUD operations with an intuitive form editor
- Vim-Style Navigation - Navigate with
j/k, jump withg/G, page withCtrl+d/u - Real-Time Search - Filter hosts as you type with live overlay
- Tag System - Organize hosts with a global tag pool (prod, staging, dev, etc.)
- SSH Key Selector - Visual picker to select multiple keys per host
- SSH Flags & Shell Selection - Customize connection behavior per host
- Jump Host Support - Configure ProxyJump for bastion hosts
- Flexible Sorting - Sort by name, hostname, last used, user, or tags
- Usage Tracking - Automatically track when you last connected to each host
- Container Overview - View all containers with status, image, ports at a glance
- Container Actions - Start, stop, restart, pull, remove, and purge containers
- Log Viewer - View container logs with follow mode and adjustable line counts
- Stats Monitor - Real-time CPU and memory usage visualization
- Process Viewer - See running processes inside containers (docker top)
- Container Inspect - Deep dive into container configuration, ports, volumes, networks
- Environment Inspector - View and search environment variables
- Deployment Scripts - Associate and manage deployment scripts with containers
- Script Editor - Edit env vars, ports, volumes, and network settings visually
- Bidirectional Sync - Push files to remote or pull files from remote
- Interactive File Browser - Navigate local and remote filesystems visually
- Compression Toggle - Enable/disable rsync compression on the fly
- Path Completion - Type paths directly or browse to select
- SSH Config Integration - Reads from and writes to
~/.ssh/config - Extended Metadata - Stores notes, tags, flags, and timestamps in
~/.ssh/sshing.json - Proper Terminal Handling - Cleanly transitions between TUI and SSH sessions
- Input Validation - Prevents duplicate hosts and invalid configurations
- Confirmation Dialogs - Prevents accidental deletions
From 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:
- Press
nto create a new host - Fill in the form (use
j/korTabto navigate):- Host (alias):
my-server - Hostname (IP):
192.168.1.10 - User:
ubuntu - Port:
22(or leave empty for default)
- Host (alias):
- Press
Ctrl+Sto save
- Press
-
Connect to your host:
- Select the host with
j/kor arrow keys - Press
SpaceorEnterto connect
- Select the host with
That's it! You're now SSH'd into your server.
- Rust 1.70 or later
- Cargo package manager
- SSH client installed on your system
- Need rsync to use the rsync features
# 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 sshingDownload the latest release from GitHub Releases and add it to your PATH.
sshing --versionsshing uses intuitive Vim-style keybindings:
- Move Down:
jor↓ - Move Up:
kor↑ - Jump to Top:
g - Jump to Bottom:
G - Page Down:
Ctrl+d - Page Up:
Ctrl+u
The currently selected host is highlighted with a cyan bar.
- Press
nfrom the main table view - Fill in the form fields:
- Host (alias) - Unique name for this connection
- Hostname (IP) - Server IP address or domain
- User - SSH username (optional)
- Port - SSH port (default: 22)
- SSH Keys - Press
Enterto select identity files - Jump Host - ProxyJump configuration (optional)
- SSH Flags - Press
Enterto select flags like-t,-A, etc. - Shell - Press
Enterto select shell (bash, zsh, fish, etc.) - Tags - Press
Enterto assign tags - Note - Personal notes about this server
- Navigate fields with
j/k,↑/↓, orTab - Press
Ctrl+Sto save
- Select the host with
j/k - Press
eto edit - Modify fields (same navigation as creating)
- Press
Ctrl+Sto save orEscto cancel
- Select the host with
j/k - Press
dto delete - Confirm with
yorEnter(or cancel withnorEsc)
SSH flags customize how the connection is established. Common use cases:
-t- Force pseudo-terminal (needed for interactive shells likezsh)-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 debugging
To add flags to a host:
- Edit the host (
e) - Navigate to the SSH Flags field
- Press
Enterto open the flag selector - Use
j/kto navigate,SpaceorEnterto toggle flags - Press
Escto return to the editor - Press
Ctrl+Sto save
Choose which shell to execute after connecting. Useful when:
- Your server's default shell is different from your preference
- You want to always start in
zshon certain servers - You need a specific shell for scripting
To set a shell:
- Edit the host (
e) - Navigate to the Shell field
- Press
Enterto open the shell selector - Use
j/kto navigate,SpaceorEnterto select - Press
Escto return to the editor - Press
Ctrl+Sto save
Available 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.
- Edit any host (
e) - Navigate to the Tags field
- Press
Enterto open the tag editor - Press
aornto create a new tag - Type the tag name (e.g.,
production,staging,web,database) - Press
Enterto add it to the global pool - The tag is now available but not automatically assigned to the current host
- In the tag editor, use
j/kto navigate the tag list - Press
SpaceorEnterto toggle tag assignment - Selected tags show a
[✓]checkbox - Press
Escto return to the editor - Press
Ctrl+Sto save
- Press
tfrom the main table view - Select tags to filter by
- Press
Enterto apply the filter - Press
Escto clear all filters
- Press
/to enter search mode - Start typing - the table filters as you type
- Press
Enterto apply the search - Press
Escto clear the search
Search matches against:
- Host alias
- Hostname/IP
- User
- Tags
- Notes
Press s to cycle through sort options:
- Name - Sort by host alias alphabetically
- Hostname - Sort by IP/hostname
- Last Used - Most recently used first
- User - Sort by username
- Tags - Sort by first tag alphabetically (hosts without tags appear last)
sshing includes powerful Docker container management capabilities, allowing you to manage containers on any remote server directly from the TUI.
- Select a host from the main table
- Press
dto enter Docker mode - sshing will SSH to the server and fetch container information
- The container list view will appear showing all containers
Note: 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:
- Status indicator -
● Up(running),○ Down(stopped),✗ Failed(exited with error) - Container name - The name of the container
- Image - The Docker image (shortened for display)
- Ports - Port mappings
- Script - Whether a deployment script is associated (
✓ has scriptor✗ 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:
- View container logs in real-time
- Press
fto toggle follow mode (live updates) - Press
+/-to increase/decrease line count (100 → 500 → 1000 → 5000 → 50000) - Scroll with
j/k,g/G,Ctrl+d/u
- View real-time CPU and memory usage
- Visual bar graphs show resource utilization
- Auto-refreshes every few seconds
- View running processes inside the container (equivalent to
docker top) - Shows PID, user, CPU%, memory%, and command
- Navigate through processes with
j/k
- Deep inspection of container configuration
- View ports, volumes, networks, and full configuration
- Navigate sections with
j/k
- View all environment variables in the container
- Search/filter variables by typing
- Compare with deployment script variables
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.
- Reproducibility - Store your exact container configuration as a script
- Version control - Keep scripts in your project repository
- Easy redeployment - Run the script to recreate the container with the same settings
- Press
bfrom the container list to open the file browser - Navigate to find your deployment script on the remote server
- Common locations: project directories,
/opt, home directories - Press
Enterto select a script
sshing looks for scripts matching patterns like:
start*.sh,deploy*.sh,run*.sh,docker*.sh- Scripts in common project directories
Once a script is associated:
- Press
vto view the full script content - See the parsed configuration (env vars, ports, volumes, network)
Edit deployment scripts visually:
- Env Vars tab - Add, edit, or remove environment variables
- Ports tab - Manage port mappings
- Volumes tab - Configure volume mounts
- Network tab - Set network mode
Navigate tabs with Tab/Shift+Tab, edit values with Enter, save with Ctrl+S.
Press x to execute the deployment script, which will:
- Stop and remove the existing container (if running)
- Run the deployment script to create a new container
- Refresh the container list
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.
- Select a host from the main table
- Press
rto enter rsync mode - Configure source and destination paths
- Execute the sync
Note: 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:
- Source path - Where files will be copied FROM (labeled
[local]or[remote]) - Destination path - Where files will be copied TO
- Direction indicator - Shows
Local → RemoteorRemote → Local - Compression status - Whether
-zflag 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:
- Source field + pushing to remote → Local filesystem
- Source field + pulling from remote → Remote filesystem
- Dest field → Opposite of source
-
Navigate with:
j/kor arrows to move through entriesEnterto enter a directory or select a fileSpaceto select the current directory as the pathBackspaceorhto go up one directoryg/Gto jump to top/bottomEscto cancel
-
The selected path is inserted into the field
- Configure your source and destination paths
- Toggle direction with
rif needed (default: push to remote) - Enable compression with
zfor slow connections - Press
Spaceto execute
sshing will run rsync with:
-avzflags (archive, verbose, compress if enabled)- Proper SSH connection using the host's configuration
- Progress displayed in the terminal
After completion, you'll return to the rsync view with a status message.
Deploy local files to server:
- Press
ron a host - Set source:
/home/user/project/dist/ - Set dest:
/var/www/html/ - Ensure direction shows
Local → Remote - Press
Spaceto sync
Download logs from server:
- Press
ron a host - Press
rto toggle direction toRemote → Local - Press
bto browse, navigate to/var/log/myapp/ - Set local dest:
/home/user/logs/ - Press
Spaceto 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:
- Type to input text
Backspaceto delete charactersEnterto save fieldEscto 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:
- Type the tag name
Enterto add to global poolEscto 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/config - Metadata:
~/.ssh/sshing.json
If you already have an existing ~/.ssh/config file, sshing will:
- Read all existing Host entries
- Preserve any configuration you've manually added
- Allow you to edit hosts through the TUI
- Only modify hosts that you edit through sshing
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
# 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 fmtFound a bug? Have a feature request? Please open an issue with:
- A clear description of the problem or suggestion
- Steps to reproduce (for bugs)
- Your environment (OS, Rust version, terminal emulator)
MIT License - see LICENSE file for details.
Built with:
