Skip to content
This repository was archived by the owner on Sep 17, 2026. It is now read-only.

Repository files navigation

此工具已被永久归档

可以使用我的另一个工具:MiniSSHD ,他兼容性更强,其他更新将在 MiniSSHD 上维护。

WinSSHD

一个小型、可见的 Windows SSH 服务端:使用标准 SSH 客户端登录后获得 PowerShell/cmd 终端,也支持 ssh host command 形式的远程命令执行。

协议层使用 libssh,交互终端使用 Windows ConPTY;没有自己实现密码学。

适合自有设备、实验室、家庭/办公局域网或 VPN 内管理。它是可审计的示例/轻量工具,不建议直接暴露到公网。正式生产环境优先使用微软维护的 Windows OpenSSH Server。

已实现

  • 标准 SSHv2 客户端连接
  • Ed25519 主机密钥(首次运行自动生成)
  • 密码认证:PBKDF2-HMAC-SHA256、本地仅保存盐和哈希;不限制密码长度(不可为空)
  • OpenSSH 公钥认证:authorized_keys
  • 交互式 PowerShell/cmd + ConPTY 窗口大小同步
  • 非交互命令:ssh user@host "whoami"
  • Windows 原生 SFTP v3:上传、下载、目录、重命名、删除、属性与断点偏移读写
  • 现代 OpenSSH scp 兼容(通过 SFTP 协议;不支持 scp -O 旧版协议)
  • SFTP/SCP 虚拟根目录与 ..、盘符、NTFS 重解析点越界防护
  • 首次运行可设置监听端口,也可用 --port 覆盖
  • 最多 5 次密码尝试、45 秒认证超时、最多 16 个并发连接
  • 子进程 Job Object 清理,服务端退出时不会故意留下远程 shell
  • 默认过滤 ConPTY 输出中的 ANSI/VT 控制序列,避免客户端显示原始转义字符
  • CLI 前台运行;按 Ctrl+C 立即终止会话子进程并强制退出服务端,不再等待 3 秒

有意未实现

  • 旧版 SCP/RCP wire protocol(scp -O);普通新版 scp 已通过 SFTP 支持
  • SFTP 符号链接/目录联接,避免绕过文件根目录
  • 端口转发、X11、SSH Agent 转发
  • 自动开机启动、隐藏运行或其他持久化
  • 多个 channel 复用同一 SSH 连接
  • Windows 用户模拟

权限模型:远程 shell 使用启动 WinSSHD.exe 的 Windows 账户及其权限。SSH 登录名只是本程序的认证名,不是 Windows 用户映射。除非确实需要远程管理员权限,否则不要以管理员身份启动。

系统要求

  • Windows 10 1809 / Windows Server 2019 或更新版本
  • 64 位
  • 编译时需要:
    • Visual Studio 2022 或 2026,勾选“使用 C++ 的桌面开发”
    • CMake
    • Git
    • PowerShell 5+

编译

在项目目录打开 PowerShell:

Set-ExecutionPolicy -Scope Process Bypass
.\build-release.ps1

脚本会在项目内克隆 vcpkg、编译 libssh,并生成:

release\WinSSHD.exe

使用附带的 x64-windows-static-crt triplet 时,运行产物不需要旁边放 libssh DLL。第一次编译依赖下载会花一些时间。

在 Linux 上使用 MinGW-w64 交叉编译

Debian/Ubuntu 安装工具链:

sudo apt update
sudo apt install -y git cmake ninja-build g++-mingw-w64-x86-64-posix

运行交叉编译脚本:

chmod +x build-mingw-cross.sh
./build-mingw-cross.sh

输出文件:

release-mingw/WinSSHD.exe

脚本使用 vcpkg 的 x64-mingw-static triplet,为 Windows x64 交叉编译 libssh 和 OpenSSL,并静态链接 libstdc++、libgcc 与 winpthreads。最终 EXE 不依赖 MinGW 运行时 DLL。首次构建 OpenSSL/libssh 可能需要数分钟。

如使用自定义工具链或希望把缓存放到其他位置,可以设置:

VCPKG_ROOT=/opt/vcpkg \
MINGW_ROOT=/usr \
BUILD_DIR=/tmp/winsshd-build \
RELEASE_DIR="$PWD/release-mingw" \
./build-mingw-cross.sh

首次运行

.\release\WinSSHD.exe

首次启动会:

  1. %LOCALAPPDATA%\WinSSHD 创建配置目录;
  2. 要求设置 SSH 登录名、自定义监听端口、SFTP/SCP 文件根目录和密码;
  3. 文件根目录默认为启动账户的 %USERPROFILE%;远程 / 映射到该目录;
  4. 密码不限制长度,但不能为空;
  5. 创建 Ed25519 主机密钥;
  6. 默认监听地址为 0.0.0.0,默认端口为 2222

不会自动修改 Windows 防火墙。若只在本机测试,可改为:

.\release\WinSSHD.exe --bind 127.0.0.1

允许专用网络上的 2222/TCP(以管理员 PowerShell 执行):

New-NetFirewallRule -DisplayName "WinSSHD 2222" `
  -Direction Inbound -Action Allow -Protocol TCP -LocalPort 2222 -Profile Private

删除该规则:

Remove-NetFirewallRule -DisplayName "WinSSHD 2222"

用标准 SSH 客户端连接

交互终端:

ssh -p 2222 admin@192.168.1.20

执行一条命令:

ssh -p 2222 admin@192.168.1.20 "whoami & hostname"

首次连接时请核对客户端显示的 SHA256 主机指纹是否与服务端启动界面一致。

SFTP 与 SCP

启动时可以临时指定文件根目录:

.\WinSSHD.exe --file-root "D:\RemoteFiles"

SFTP 连接:

sftp -P 2222 admin@192.168.1.20

上传和下载:

sftp> put local.zip /uploads/local.zip
sftp> get /reports/result.txt result.txt

新版 OpenSSH 的 scp 默认使用 SFTP,因此可以直接使用:

scp -P 2222 .\local.zip admin@192.168.1.20:/local.zip
scp -P 2222 admin@192.168.1.20:/result.txt .\result.txt
scp -P 2222 -r .\folder admin@192.168.1.20:/folder

不要添加 -O:该参数会强制使用本项目未实现的旧版 SCP/RCP wire protocol。

SFTP 的远程 / 是配置的文件根目录,不是 Windows 系统盘根目录。服务端拒绝 .. 越界、Windows 盘符路径和文件根目录内的 NTFS 重解析点/目录联接。

公钥认证

客户端生成密钥(已有密钥可跳过):

ssh-keygen -t ed25519

在服务端本机添加 .pub 公钥:

.\WinSSHD.exe --add-key "$env:USERPROFILE\.ssh\id_ed25519.pub"

也可以手工把标准的 ssh-ed25519 AAAA... 注释 一行写入:

%LOCALAPPDATA%\WinSSHD\authorized_keys

当前解析器只接受普通的“密钥类型 + Base64 + 可选注释”格式,不解析行首 command=... 等 OpenSSH 扩展选项。

CLI

WinSSHD.exe [options]

--bind <address>       本次运行的监听地址
--port <1-65535>       本次运行的监听端口
--strip-ansi           过滤 ANSI/VT 序列(默认)
--keep-ansi            保留 ANSI/VT 序列,适合完整终端模拟器
--shell powershell     使用 Windows PowerShell(默认,禁用 PSReadLine)
--shell cmd            使用 cmd.exe
--shell "<命令行>"     自定义交互 shell,例如 pwsh.exe -NoLogo
--data-dir <path>      指定配置和密钥目录
--file-root <path>     指定 SFTP/SCP 虚拟根目录
--reset-password       重设 SSH 密码后退出
--add-key <file.pub>   添加公钥后退出
--help                 显示帮助

--bind--port--file-root--strip-ansi--keep-ansi--shell 只覆盖本次运行,不改写 config.ini

默认会过滤 ConPTY 生成的 ANSI/VT 控制序列,适合会把 ESC[... 原样显示出来的客户端。过滤后高级行编辑和颜色会被关闭;如果使用 Windows Terminal、PuTTY 等完整终端模拟器并希望保留颜色、光标控制,可加 --keep-ansi

数据文件

默认目录:%LOCALAPPDATA%\WinSSHD

  • config.ini:用户名、PBKDF2 盐/哈希、监听配置、SFTP/SCP 文件根目录、ANSI 过滤设置、shell
  • ssh_host_ed25519_key:SSH 主机私钥,务必保护
  • authorized_keys:允许登录的客户端公钥

如果用 --data-dir 把数据放到共享目录,请自行设置严格 NTFS ACL,尤其是主机私钥。

安全提示

  1. 只在你拥有或获准管理的机器上使用。
  2. 建议绑定管理网卡,并通过局域网/VPN 访问;不要直接映射到公网。
  3. 程序按要求不强制密码长度;如果启用密码认证,请自行设置强密码。优先使用公钥。
  4. 远程用户拥有与服务端进程相同的权限,所以应使用专门的低权限 Windows 账户运行。
  5. 及时更新 libssh/vcpkg 后重新构建。
  6. 本程序没有 Windows OpenSSH 的完整审计、账户隔离、SFTP、组策略和长期生产验证。

第三方许可

项目自身源代码采用 MIT。libssh 采用 LGPL-2.1-only,OpenSSL 采用 Apache-2.0。静态分发二进制时,需要履行相应许可证义务(尤其是 LGPL 对重新链接能力/对应材料的要求);详见 THIRD_PARTY_NOTICES.md

About

A small Windows SSH shell/exec server using libssh and ConPTY

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages