ssh-tool is a temporary SSH remote support helper for customer machines. It is designed to start from a safe default: on Windows it does not expose SSH to the local network by default and instead uses bore.pub as the public relay, while macOS uses Remote Login plus the same relay model when needed. The tool can authenticate with a shipped support public key or fall back to a temporary account with a random password, and it includes explicit stop/recover paths so the session can be cleaned up after use.
| Area | What this repo provides |
|---|---|
| Customer experience | A local UI for starting, stopping, and recovering a temporary support session |
| Network path | SSH access via bore.pub relay by default |
| Authentication | Support support.pub key, or a temporary user + random password when no key is provided |
| Platforms | Windows and macOS |
| Packaging | Release bundles, plus developer build scripts for ZIP, EXE, DMG, and MSI outputs |
| Platform | Main release artifact | Other shipped format(s) |
|---|---|---|
| Windows x64 | ssh-tool-win.exe |
ssh-tool-win-offline.zip, ssh-tool-win.zip |
| Windows ARM64 | ssh-tool-win-arm64.exe |
ssh-tool-win-offline.zip, ssh-tool-win.zip |
| macOS Intel / Apple Silicon | ssh-tool-mac.dmg |
ssh-tool-mac.zip |
- Current codebase version is
0.1.0. - The repo already has release packaging for Windows and macOS.
- The main supported workflows are the GUI-driven Windows/macOS bundles and the scripted ZIP flows.
- A Windows MSI build path exists for developers in
scripts/build-msi-win.sh, but the primary release artifacts in the repo are the EXE/ZIP/DMG bundles.
- Windows support depends on OpenSSH Server being installed. In locked-down or offline environments, the offline bundle or
OpenSSH-Win64.zippath is required. - macOS support depends on
sudoaccess for Remote Login and cleanup actions. - The relay model depends on
bore.pubor a locally availableborebinary. - The repo does not currently advertise an automated test suite in the docs; build scripts are the main verification path.
- If you need broader distribution formats or more environment-specific packaging, the existing MSI and offline bundle scripts are the natural next steps.
👉 Download the latest release here: Releases / Latest
Release downloads are in the Assets section of the release page. Do not use
Code -> Download ZIP; that only contains source, not the packaged.exe/.dmgartifacts.
- Download one of these:
- Normal network environment:
ssh-tool-win.exeorssh-tool-win-arm64.exe - Offline / Windows Update blocked:
ssh-tool-win-offline.zipand run the matching EXE after extracting it
- Normal network environment:
- Optionally place
support.pubnext to the EXE. This is recommended for passwordless support sessions. - Double-click the EXE and approve UAC.
- If OpenSSH is not installed, the tool will try to install it first, which can take a few minutes.
- The local page opens automatically. Click
Start Session. - Send the displayed
ssh ...command, and the password if one was generated, to the support engineer. - When finished, click
Stop (restore configuration).
Common Windows notes:
- If SmartScreen blocks the app, choose
More infoand thenRun anyway. - If OpenSSH Server installation fails, it is often because Windows Update or BITS is disabled, or because the machine cannot reach Microsoft update sources. In that case, ask IT to enable Windows Update or install
OpenSSH ServerfromSettings -> Apps -> Optional features. - For offline or policy-restricted environments, download
OpenSSH-Win64.zipfrom PowerShell/Win32-OpenSSH, place it next tossh-tool-win.exe, and name itOpenSSH-Win64.zip. The tool will unpack it toC:\ProgramData\ssh-tool\openssh\and registersshd. - You can also override the zip path with
SSH_TOOL_OPENSSH_ZIP=C:\path\OpenSSH-Win64.zip.
When Windows Update is disabled, blocked by WSUS policy, or the machine is offline, Add-WindowsCapability may fail. Use the offline package flow instead:
- Download
ssh-tool-win-offline.zipfrom Releases, or obtainOpenSSH-Win64.zipfrom a machine with internet access. - Copy the zip to the target Windows machine and keep it alongside
ssh-tool-win.exe:
ssh-tool-win.exe
OpenSSH-Win64.zip
support.pub (optional)
- Run
ssh-tool-win.exeand clickStart.
Important:
- Fully extract the offline bundle first; do not run the EXE directly from inside the zip.
- Make sure
OpenSSH-Win64.zipis in the same folder as the EXE.
Install / runtime locations:
- OpenSSH cache:
C:\ProgramData\ssh-tool\openssh\ - Session state:
C:\ProgramData\ssh-tool\active-session.json - Runtime payload extraction:
%LOCALAPPDATA%\ssh-tool-win\payload-*(SSH_TOOL_PAYLOAD_DIRcan override this)
Optional environment variables:
SSH_TOOL_OPENSSH_ZIP=C:\path\OpenSSH-Win64.zipSSH_TOOL_OPENSSH_ZIP_URL=...for a custom download URL
- Download and open
ssh-tool-mac.dmg. - Drag
SSH Tool.appintoApplications. - Double-click
SSH Tool.app.- If no session is active, it starts a 60-minute temporary session.
- If a session already exists, it performs stop/recover cleanup.
- The session page opens automatically and shows the
ssh ...command for the support engineer. - Use
Stop SessionorRecoverfrom the page when you are done.
Common macOS notes:
- If macOS warns that the app cannot be opened, right-click
SSH Tool.appand chooseOpen. - If Gatekeeper quarantine needs to be cleared manually, run:
sudo xattr -dr com.apple.quarantine "/Applications/SSH Tool.app"- The DMG and ZIP bundles include
bore, so they should not need internet access. If you seebore not found; downloading..., the bundle is incomplete or files were removed; re-download the release or install it manually withbrew install bore-cli. - Default state directory:
/var/tmp/ssh-tool/(SSH_TOOL_STATE_DIRcan override this)- State file:
/var/tmp/ssh-tool/active-session.json(SSH_TOOL_STATE_PATHcan override this)
- State file:
support.pubbehavior:- DMG: support public key is intended to be baked into the shipped bundle during release packaging
- ZIP: users can edit
support.pubdirectly in the extracted folder; leaving it empty falls back to temporary account + random password
When remote support is finished, close it in this order. Disconnecting the SSH client alone does not stop the tunnel or restore the system.
In the SSH window, run:
exitThat only disconnects the remote control session.
In the SSH Tool page, click:
Stop (restore configuration)
The tool will then:
- Delete the temporary
support_****user - Stop
sshd - Close the
boretunnel - Restore
sshd_configandauthorized_keys
If the page is stuck or the button is unavailable:
- Click
Recover (cleanup fallback) - Or run
.\ssh-tool-win.exe recoverfrom an elevated PowerShell
Manual fallback from elevated PowerShell:
Stop-Service sshd -ErrorAction SilentlyContinue
taskkill /f /im bore.exe
# Replace support_**** with the temporary username shown in the UI/logs
net user support_**** /deletePrefer the UI buttons:
Stop Sessionto stop and restore immediatelyRecoverfor fallback cleanup
If the buttons are not available:
- Open
SSH Tool.appagain; if a session exists, it will stop and restore - Or run the script version with:
./remote-support.sh stop
./remote-support.sh recoverHave the support engineer try the same ssh ... command again. If it returns Connection refused or closed, the support session has been fully shut down.
- Windows does not expose SSH to the LAN by default:
sshdis bound to127.0.0.1and only published throughbore.pub. - Public-key auth is preferred: if
support.pubis present, password login is disabled. - If no support key is present, the tool creates a temporary account with a random password.
- Sessions expire automatically and run
recoverto restore configuration and clean up the temporary user / tunnel.
Expand
- Download and extract
ssh-tool-win.zip. - Optionally place your support team's public key in
support.pub. If you leave it empty, the script switches to temporary account + random password mode. - Run PowerShell as administrator and start the session:
.\remote-support.ps1 start -Minutes 60The script will:
- Allow only public-key login if
support.pubis provided - Create a temporary account if
support.pubis empty - Bind
sshdto127.0.0.1 - Start
boreand copy the usablessh ...command to the clipboard - Automatically run
recoverat the end of the timer
Stop immediately:
.\remote-support.ps1 stopIf the session state cannot be found, use fallback cleanup:
.\remote-support.ps1 recover- Download
ssh-tool-win.exeorssh-tool-win-arm64.exe. - Optionally place
support.pubnext to the EXE. If it is missing, the tool falls back to temporary account + random password mode. - Double-click the EXE. It requests administrator privileges and opens the local UI. You can also run it from PowerShell:
.\ssh-tool-win.exe start --minutes 60Stop or recover:
.\ssh-tool-win.exe stop
.\ssh-tool-win.exe recoverThe EXE extracts its bundled remote-support.ps1 and bore.exe to %LOCALAPPDATA%\ssh-tool-win\payload-*. Override the extraction directory with SSH_TOOL_PAYLOAD_DIR if needed.
- Download and extract
ssh-tool-mac.zip. - Optionally place your support team's public key in
support.pub. Leaving it empty enables temporary account + random password mode. - Run:
chmod +x ./remote-support.sh
./remote-support.sh startNotes:
- The script prompts for
sudo, because enabling Remote Login and restoring configuration require root. - The bundle includes
borefor Apple Silicon and Intel. If it is missing, the script will try to download it automatically. You can pin the version withSSH_TOOL_BORE_VERSION, or install it manually withbrew install bore-cli.
Stop immediately:
./remote-support.sh stopIf session state is missing, run fallback cleanup:
./remote-support.sh recover- Download and open
ssh-tool-mac.dmg. - Drag
SSH Tool.apptoApplications. - Double-click
SSH Tool.app.- If no session exists, it starts a 60-minute temporary session.
- If a session exists, it stops and restores.
The app opens a local page with the ssh ... command for the support engineer and the Stop Session / Recover buttons. The first launch will prompt for sudo, since Remote Login and cleanup require root.
Run:
./scripts/build-release-zips.shThis produces:
dist/ssh-tool-win.zip- Windows script bundle withbore.exeandsupport.pubdist/ssh-tool-win.exe- Windows single-file EXE with bundled script +bore.exe+support.pubdist/ssh-tool-mac.zip- macOS script bundle withboreandsupport.pubdist/ssh-tool-mac.dmg- macOS distribution format for end users
Windows MSI packaging is available separately:
./scripts/build-msi-win.shThat script auto-detects WiX v4 or wixl/msitools and emits dist/ssh-tool-win.msi.
packages/ssh-tool-win/- Windows app, UI, scripts,bore.exe, and support key examplepackages/ssh-tool-mac/- macOS app, UI, scripts, and bundledborebinariesscripts/- release, EXE, DMG, MSI, and packaging helpersbuild/- MSI templates for Windows installer generationkeys/- support-team public keys that are baked into release bundles
If you are packaging customer builds, place one or more OpenSSH public keys in keys/support.pub. Keep the matching private key(s) on the support side only.
Then build the customer bundles:
./scripts/build-release-zips.sh