可以使用我的另一个工具:MiniSSHD ,他兼容性更强,其他更新将在 MiniSSHD 上维护。
一个小型、可见的 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。第一次编译依赖下载会花一些时间。
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首次启动会:
- 在
%LOCALAPPDATA%\WinSSHD创建配置目录; - 要求设置 SSH 登录名、自定义监听端口、SFTP/SCP 文件根目录和密码;
- 文件根目录默认为启动账户的
%USERPROFILE%;远程/映射到该目录; - 密码不限制长度,但不能为空;
- 创建 Ed25519 主机密钥;
- 默认监听地址为
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 -p 2222 admin@192.168.1.20执行一条命令:
ssh -p 2222 admin@192.168.1.20 "whoami & hostname"首次连接时请核对客户端显示的 SHA256 主机指纹是否与服务端启动界面一致。
启动时可以临时指定文件根目录:
.\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 扩展选项。
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 过滤设置、shellssh_host_ed25519_key:SSH 主机私钥,务必保护authorized_keys:允许登录的客户端公钥
如果用 --data-dir 把数据放到共享目录,请自行设置严格 NTFS ACL,尤其是主机私钥。
- 只在你拥有或获准管理的机器上使用。
- 建议绑定管理网卡,并通过局域网/VPN 访问;不要直接映射到公网。
- 程序按要求不强制密码长度;如果启用密码认证,请自行设置强密码。优先使用公钥。
- 远程用户拥有与服务端进程相同的权限,所以应使用专门的低权限 Windows 账户运行。
- 及时更新 libssh/vcpkg 后重新构建。
- 本程序没有 Windows OpenSSH 的完整审计、账户隔离、SFTP、组策略和长期生产验证。
项目自身源代码采用 MIT。libssh 采用 LGPL-2.1-only,OpenSSL 采用 Apache-2.0。静态分发二进制时,需要履行相应许可证义务(尤其是 LGPL 对重新链接能力/对应材料的要求);详见 THIRD_PARTY_NOTICES.md。