0.8.4 — 2026-05-21
Release Notes
Hotfix for a load-bearing inject_include bug present since v0.4.0.
Affects both macOS and Windows. No behavior change for users whose
~/.ssh/config was empty when sshc first ran setup.
Fixed
-
Includedirective appended bysshc -m'sicould end up
nested inside the user's lastHoststanza, making sshc-managed
hosts silently invisible tossh <alias>. OpenSSH terminates a
Hostblock only on the nextHost/Matchdirective or EOF —
blank lines and comments don't end a stanza — so anInclude
line appended to a config that ends with aHostblock became a
conditional Include scoped to that last alias.ssh -vvshowed
Reading configuration data .../sshc.conf(parse time), but
Applying options for <sshc-alias>never fired for any sshc host.Fix:
inject_includenow emits three lines instead of two, with
Match allbetween the comment header and theInclude:# Added by sshc; do not remove. Match all Include ~/.ssh/config.d/sshc.confMatchis a stanza header in its own right, so the preceding
Hostblock is closed;Match allmatches every connection
unconditionally, so theInclude(which now belongs to this
block) fires for every alias. Restores the "append-only,
unconditional include" semantics the user expects.Users on existing v0.7.x / v0.8.0–v0.8.3 installs whose
~/.ssh/configends with aHoststanza should either re-run
sshc -m→iafter deleting the existing Include line, or
manually add aMatch allline directly above the sshc-managed
Include block in~/.ssh/config. New installs onto an empty
~/.ssh/configsee no change in behavior.
Internal
- New regression tests:
test_inject_emits_match_all_terminator_before_include—
assertsMatch allis the line immediately beforeInclude
afterinject_includeruns over a config that ends with a
Hoststanza.test_inject_idempotent_with_terminator— confirms calling
inject twice still yields exactly oneIncludeline and one
Match allline.
is_include_presentis unchanged; it scans for anyInclude
directive line-by-line regardless of position, so the new
three-line block is detected as already-present on the second
invocation.
Install sshc 0.8.4
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/hang-in/sshc/releases/download/v0.8.4/sshc-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/hang-in/sshc/releases/download/v0.8.4/sshc-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install hang-in/tap/sshcDownload sshc 0.8.4
| File | Platform | Checksum |
|---|---|---|
| sshc-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| sshc-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| sshc-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| sshc-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| sshc-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |