{"id":13542676,"url":"https://github.com/whme/csshw","last_synced_at":"2026-05-23T17:02:17.926Z","repository":{"id":183387076,"uuid":"405228278","full_name":"whme/csshw","owner":"whme","description":"Cluster SSH tool for Windows inspired by csshX","archived":false,"fork":false,"pushed_at":"2025-03-01T20:15:31.000Z","size":14386,"stargazers_count":10,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-01T20:41:20.030Z","etag":null,"topics":["ssh","windows"],"latest_commit_sha":null,"homepage":"https://whme.github.io/csshw/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/whme.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-09-10T22:34:01.000Z","updated_at":"2025-03-01T20:15:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"9b70b923-6e01-4003-92c6-e4c95d434ec2","html_url":"https://github.com/whme/csshw","commit_stats":null,"previous_names":["whme/csshw"],"tags_count":25,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whme%2Fcsshw","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whme%2Fcsshw/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whme%2Fcsshw/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/whme%2Fcsshw/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/whme","download_url":"https://codeload.github.com/whme/csshw/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246796929,"owners_count":20835468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ssh","windows"],"created_at":"2024-08-01T10:01:14.804Z","updated_at":"2026-05-23T17:02:17.918Z","avatar_url":"https://github.com/whme.png","language":"Rust","funding_links":[],"categories":["Rust","windows"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003ca href=\"https://github.com/whme/csshw\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/whme/csshw/refs/heads/main/res/csshw.svg\" width=\"100\" alt=\"csshW Logo\"\u003e\u003c/img\u003e\u003c/a\u003e\u003c/p\u003e\r\n\u003ch1 align=\"center\"\u003ecsshW\u003c/h3\u003e\r\n\u003cp align=\"center\"\u003e\u003ci\u003eCluster SSH tool for Windows inspired by \u003ca href=\"https://github.com/brockgr/csshx\"\u003ecsshX\u003c/a\u003e\u003c/i\u003e\u003c/p\u003e\r\n\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"./LICENSE.txt\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-Apache_2.0-blue.svg\"\u003e\u003c/a\u003e\r\n  \u003ca href=\"https://github.com/whme/csshw/releases/latest\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/whme/csshw.svg\"\u003e\u003c/a\u003e\r\n  \u003ca href=\"https://github.com/whme/csshw/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/downloads/whme/csshw/total\"\u003e\u003c/a\u003e\u003cbr\u003e\r\n  \u003ca href=\"https://github.com/whme/csshw/actions/workflows/post-submit.yml\"\u003e\u003cimg src=\"https://github.com/whme/csshw/actions/workflows/post-submit.yml/badge.svg\"\u003e\u003c/a\u003e\r\n  \u003ca href=\"https://github.com/whme/csshw/actions/workflows/deploy_github_pages.yml\"\u003e\u003cimg src=\"https://github.com/whme/csshw/actions/workflows/deploy_github_pages.yml/badge.svg\"\u003e\u003c/a\u003e\r\n  \u003c!--TODO: Add link to coverage once coverage data looks better: https://github.com/insightsengineering/coverage-action/issues/28#issuecomment-1743910648 --\u003e\r\n\u003c/p\u003e\r\n\r\n![csshw demo](https://raw.githubusercontent.com/whme/csshw/refs/heads/main/demo/csshw.gif)[^1][^2][^3]\r\n\r\n## Pre-requisite\r\n- Any SSH client (Windows 10 and Windows 11 already include a built-in SSH server and client - [docs](https://learn.microsoft.com/en-us/windows/terminal/tutorials/ssh))\r\n\r\n## Overview\r\ncsshW will launch 1 daemon and N client windows (with N being the number of hosts to SSH onto).\u003cbr\u003e\r\nKey-strokes performed while having the daemon console focussed will be sent to all clients simoultaneously and be replayed by them.\u003cbr\u003e\r\nFocussing a client will cause any key-strokes to be sent to this client only.\r\n\r\n## Download/Installation\r\ncsshW is a portable application and is not installed.\u003cbr\u003e\r\nTo download the csshW application refer to the [Releases 📦](https://github.com/whme/csshw/releases) page.\r\n\r\n## Usage\r\n\r\n\u003c!-- HELP_OUTPUT_START --\u003e\r\n```cmd\r\ncsshw.exe --help\r\nCluster SSH tool for Windows inspired by csshX\r\n\r\nUsage: csshw.exe [OPTIONS] [HOSTS]... [COMMAND]\r\n\r\nCommands:\r\n  client  Subcommand that will launch a single client window\r\n  daemon  Subcommand that will launch the daemon window\r\n  help    Print this message or the help of the given subcommand(s)\r\n\r\nArguments:\r\n  [HOSTS]...\r\n          Hosts and/or cluster tag(s) to connect to\r\n\r\n          Hosts or cluster tags might use brace expansion, but need to be properly quoted.\r\n\r\n          E.g.: `csshw.exe \"host{1..3}\" hostA`\r\n\r\n          Hosts can include a username which will take precedence over the username given via the `-u` option and over any ssh config value.\r\n\r\n          E.g.: `csshw.exe -u user3 user1@host1 userA@hostA host3`\r\n\r\n          Hosts can include a port number which will take precedence over the port given via the `-p` option.\r\n\r\n          E.g.: `csshw.exe -p 33 host1:11 host2:22 host3`\r\n\r\n          If no hosts are provided and the application is launched in a new console window (e.g. by double clicking the executable in the File Explorer), it will launch in interactive mode.\r\n\r\nOptions:\r\n  -u, --username \u003cUSERNAME\u003e\r\n          Optional username used to connect to the hosts\r\n\r\n  -p, --port \u003cPORT\u003e\r\n          Optional port used for all SSH connections\r\n\r\n  -d, --debug\r\n          Enable extensive logging\r\n\r\n  -h, --help\r\n          Print help (see a summary with '-h')\r\n\r\n  -V, --version\r\n          Print version\r\n```\r\n\u003c!-- HELP_OUTPUT_END --\u003e\r\nExample:\r\n`csshw.exe -u root hosta.dev hostb.dev hostc.dev`\r\n\r\nWe recommend using the [ssh_config](https://linux.die.net/man/5/ssh_config) for any configurations like default username etc.\r\n\r\n## Configuration\r\n\r\n`csshw-config.toml` contains all relevant configurations and is located in the same directory as the executable.\r\nIt is automatically created with default values if not present.\r\n\r\n### `clusters`\r\nAn array of clusters that can be used to alias a set of host names to a specific tag:\r\n```toml\r\nclusters = [\r\n    { name = \"dev\", hosts = [\"hosta.dev\", \"root@hostb.dev\", \"hostc.dev\"] }\r\n]\r\n```\r\nClusters may be nested, but be aware of recursive clusters which are not checked for.\r\n\r\n### `[client]`\r\nA collection containing client relevant configuration.\r\n\r\n```toml\r\n[client]\r\nssh_config_path = 'C:\\Users\\demo_user\\.ssh\\config'\r\nprogram = 'ssh'\r\narguments = ['-XY', '{{USERNAME_AT_HOST}}']\r\nusername_host_placeholder = '{{USERNAME_AT_HOST}}'\r\ndisabled_console_color = 135\r\nhighlighted_console_color = 31\r\n```\r\n\r\n| Option | Type | Default | Description |\r\n|---|---|---|---|\r\n| `ssh_config_path` | path | auto-detected | Full qualified path to your ssh config file. |\r\n| `program` | string | `'ssh'` | Executable used to establish ssh connections. |\r\n| `arguments` | list of strings | `['-XY', '{{USERNAME_AT_HOST}}']` | Additional arguments passed to `program`. |\r\n| `username_host_placeholder` | string | `'{{USERNAME_AT_HOST}}'` | Token in `arguments` replaced with `username@host`. |\r\n| \u003ca id=\"disabled_console_color\"\u003e\u003c/a\u003e`disabled_console_color` | u16 | `135` (`4+2+1+128`) | Colors used while a client is in the disabled state (input ignored). Default paints default-grey text on muted dark-grey. See [Console color encoding](#console-color-encoding). |\r\n| \u003ca id=\"highlighted_console_color\"\u003e\u003c/a\u003e`highlighted_console_color` | u16 | `31` (`4+2+1+8+16`) | Colors used while a client is the currently selected window in the control-mode `[e]nable/disable input` submenu. Default paints bright-white text on blue. See [Console color encoding](#console-color-encoding) and [Highlight overlay](#highlight-overlay). |\r\n\r\n### `[daemon]`\r\nA collection containing daemon relevant configuration.\r\n\r\n```toml\r\n[daemon]\r\nheight = 200\r\naspect_ratio_adjustment = -1.0\r\nconsole_color = 207\r\nsubmenu_edge_behavior = 'clamp'\r\n```\r\n\r\n| Option | Type | Default | Description |\r\n|---|---|---|---|\r\n| `height` | u16 | `200` | Height of the daemon console. |\r\n| `aspect_ratio_adjustment` | float | `-1.0` | Bias for vertical vs. horizontal layout of client windows. See [Aspect ratio](#aspect-ratio). |\r\n| \u003ca id=\"console_color\"\u003e\u003c/a\u003e`console_color` | u16 | `207` (`8+4+2+1+64+128`) | Daemon console colors. Default paints white text on red. See [Console color encoding](#console-color-encoding). |\r\n| `submenu_edge_behavior` | enum | `'clamp'` | What happens when an arrow / `hjkl` keystroke in the submenu would move the highlight past the edge of the client grid. See [Submenu edge behavior](#submenu-edge-behavior). |\r\n\r\n### Aspect ratio\r\n`aspect_ratio_adjustment` configures whether the available screen space should rather be used horizontally or vertically.\r\n* `\u003e 0.0` - aims for vertical rectangle shape. The larger the value, the more exaggerated the \"verticality\". Eventually the windows will all be columns.\r\n* `= 0.0` - aims for square shape.\r\n* `\u003c 0.0` - aims for horizontal rectangle shape. The smaller the value, the more exaggerated the \"horizontality\". Eventually the windows will all be rows. `-1.0` is the sweetspot for mostly preserving a 16:9 ratio.\r\n\r\n### Console color encoding\r\nConsole-color options encode background and foreground attributes as a single integer.\r\nAvailable are all standard Windows color combinations ([windows docs](https://learn.microsoft.com/en-us/windows/console/console-screen-buffers#character-attributes)):\r\n```\r\nFOREGROUND_BLUE:        1\r\nFOREGROUND_GREEN:       2\r\nFOREGROUND_RED:         4\r\nFOREGROUND_INTENSITY:   8\r\nBACKGROUND_BLUE:        16\r\nBACKGROUND_GREEN:       32\r\nBACKGROUND_RED:         64\r\nBACKGROUND_INTENSITY:   128\r\n```\r\n\r\n### Highlight overlay\r\nThe highlight wins over [`disabled_console_color`](#disabled_console_color); pressing `[d]`/`[e]`/`[t]` on the selected window briefly flashes the underlying state color (~250ms) as action feedback before the highlight color is restored.\r\n\r\n### Submenu edge behavior\r\n`submenu_edge_behavior` selects what happens when an arrow / `hjkl` keystroke in the `[e]nable/disable input` submenu would move the highlight past the edge of the client grid:\r\n* `'clamp'` (default) - the highlight stays on the current cell.\r\n* `'wrap'` - the highlight wraps to the opposite edge of the same row (Left/Right) or column (Up/Down).\r\n\r\n## Contributing\r\ncsshW uses pre-commit githooks to enforce good code style.\u003cbr\u003e\r\nInstall them via ``git config --local core.hooksPath .githooks/``.\r\n\r\n## Releases\r\nStep by step guide to create a new release:\r\n- `cargo xtask prepare-release` and follow the instructions\r\n- Create a pull request from the new maintenance branch to main OR cherry-pick the new Version change from the existing maintenance branch to main\r\n- `cargo xtask create-release-tag` and follow the instructions\r\n- Revise the automatically created Release Draft and publish it\r\n\r\n[^1]: The searchbar used to launch csshw in the demo clip is [keypirinha](https://keypirinha.com/).\r\n[^2]: The tool to show key presses in the demo clip is [carnac the magnificent](https://github.com/Code52/carnac).\r\n[^3]: The tool used to record the screen as GIF is [ScreenToGif](https://github.com/NickeManarin/ScreenToGif).\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhme%2Fcsshw","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwhme%2Fcsshw","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwhme%2Fcsshw/lists"}