别再远程桌面点点点:让 AI Agent 用 SSH 直接接管 Windows
先说结论
让 AI Agent 从 Linux 或 macOS 管理 Windows,并不一定要走远程桌面、VNC、商业远控软件,也不一定要额外装一套奇怪的 Agent Runtime。对大多数个人工作站、实验机、开发机和内网服务器来说,最简单、最干净、最容易被自动化工具理解的方案,就是在 Windows 上启用系统自带的 OpenSSH Server,然后从 Linux/macOS 直接执行:
ssh <user>@<windows-host>。真正需要做好的只有三件事:第一,Win10 / Win11 正确安装并启动 OpenSSH Server;第二,在 Linux/macOS 生成 SSH key,把公钥放到 Windows 对应位置;第三,如果登录用户属于 Windows 管理员组,要把公钥写入
C:\ProgramData\ssh\administrators_authorized_keys,并用icacls收紧权限。完成以后,AI Agent 就可以像操作 Linux 一样,用 SSH 在 Windows 上执行 PowerShell、复制脚本、读取日志、安装工具和做自动化运维。
本文所有命令、截图和主机信息都使用通用占位符,不包含真实内网地址、真实用户名、真实机器名、密钥、Token 或私人路径。你只需要把 <user>、<windows-host>、<windows-ip> 这类占位符替换成自己的环境值即可。
图 1:Windows 负责提供 OpenSSH Server,Linux/macOS/Agent 只需要标准 SSH 客户端。
1. 为什么是 SSH,而不是远程桌面
很多人一想到远程控制 Windows,第一反应就是远程桌面。远程桌面当然好用,尤其是需要看图形界面、调试桌面软件、处理一次性设置时。但 AI Agent 的工作方式并不是“看着屏幕点鼠标”,而是读文件、跑命令、改配置、执行脚本、收集日志、验证结果。对这种场景来说,SSH 往往比远程桌面更适合。
SSH 有几个非常实际的优点。第一,它是命令行协议。Agent 不需要理解窗口位置、按钮颜色、缩放比例和输入法状态,只要执行命令并读取 stdout/stderr 即可。你让 Agent 检查服务,它可以执行 Get-Service;你让它看日志,它可以执行 Get-EventLog 或 Get-WinEvent;你让它安装工具,它可以跑 winget、choco、scoop 或 PowerShell 脚本。
第二,它天然适合免密和自动化。Linux/macOS 上生成一对密钥,私钥留在客户端,公钥放到 Windows。以后 Agent 登录 Windows 时不需要你输入密码,也不需要保存 Windows 密码。只要私钥权限保管得当,自动化体验会比密码登录稳定很多。
第三,它跨平台。Linux、macOS、Windows、NAS、CI Runner、容器、开发机,几乎都能跑 SSH 客户端。Agent 不需要为 Windows 单独学习一套远控软件,只要会 ssh、scp、sftp,就能进入 Windows 执行 PowerShell。
第四,它更容易审计。你可以限制能登录的用户,控制防火墙端口,查看 Windows 事件日志,必要时还可以通过 sshd_config 进一步限制用户或组。和一些黑盒远控工具相比,OpenSSH 的行为边界更清楚。
当然,SSH 不是万能的。它不替代图形界面,不适合需要人工确认的桌面弹窗,也不能绕过 Windows 权限模型。你用普通用户登录,就只能做普通用户能做的事;你用管理员用户登录,也应该清楚这是高权限入口。本文的目标不是鼓励把 Windows 裸奔到公网,而是把 Windows 变成一个标准、可自动化、可审计的 SSH 目标。
2. 先确认 Windows 版本和网络边界
Windows 10 从 1809 之后已经把 OpenSSH 作为可选功能提供,Windows 11 也同样支持。你不需要去下载来路不明的第三方 sshd,也不需要安装 Cygwin 或 WSL 才能让 Windows 接收 SSH 登录。最推荐的方式是使用 Windows 自带的 OpenSSH Server 可选功能。
正式动手前,先确认三件事。第一,Windows 机器处在你信任的网络边界内。家庭网络、实验室网络、VPN 内部、受控办公室网络都可以;不要直接把 22 端口暴露到公网。第二,你能以管理员身份打开 PowerShell。安装可选功能、启动服务、改防火墙和配置管理员组公钥都需要管理员权限。第三,你知道要登录哪个本地用户。建议先用本地 Windows 用户或域用户验证,不要把在线账号登录当作默认路径;Windows OpenSSH 的身份验证方式应以 password 和 publickey 为准。
后文所有示例都用下面这些占位符:
<windows-host> Windows 主机名或可解析的名称
<windows-ip> Windows 主机 IP 地址
<user> 普通 Windows 用户
<admin-user> 属于本机 Administrators 组的 Windows 用户
Agent 最终会执行的命令非常简单:
ssh <user>@<windows-host>
# 或者
ssh <user>@<windows-ip>
但在这条命令能稳定工作之前,Windows 端需要先把服务和密钥配置好。
3. Win11 图形界面启用 OpenSSH Server
Windows 11 的入口在“可选功能”里。不同小版本的按钮名字可能略有差异,例如有的界面叫 “View features”,有的翻译成“查看功能”,但路径基本一致。
图 2:Windows 11 通过 Settings 的 Optional features 安装 OpenSSH Server。
完整步骤如下:
- 打开 Settings。
- 进入 System。
- 打开 Optional features。
- 点击 View features。
- 在搜索框输入
OpenSSH Server。 - 勾选 OpenSSH Server。
- 点击 Next,再点击 Install。
- 等待安装完成。
安装完成不代表服务已经启动。接下来按 Win + R,输入:
services.msc
在服务列表中找到 OpenSSH SSH Server,双击打开属性,把 Startup type 改成 Automatic,然后点击 Start 启动服务。
图 3:安装组件后,还要确认 sshd 服务已经启动并设为自动启动。
Windows 安装 OpenSSH Server 时通常会自动创建入站防火墙规则,规则名是 OpenSSH-Server-In-TCP,允许 TCP 22 端口。如果你安装后仍然连不上,优先检查服务状态、防火墙规则和当前网络配置文件,不要一上来怀疑 SSH 客户端。
4. Win10 图形界面启用 OpenSSH Server
Windows 10 的入口和 Windows 11 类似,但界面文字更常见的是 “Add a feature”。如果你的 Windows 10 版本太老,建议先更新到受支持版本;OpenSSH 作为可选功能的路径从 Windows 10 1809 之后才比较稳定。
图 4:Windows 10 通过 Apps 的 Optional features 添加 OpenSSH Server。
完整步骤如下:
- 打开 Settings。
- 进入 Apps。
- 打开 Optional features。
- 点击 Add a feature。
- 搜索
OpenSSH Server。 - 选中 OpenSSH Server 并点击 Install。
- 等待安装完成。
- 打开
services.msc。 - 找到 OpenSSH SSH Server。
- 设置为 Automatic,并点击 Start。
如果你同时看到了 OpenSSH Client,它是客户端组件,作用是让这台 Windows 去连别的机器;本文真正需要的是 OpenSSH Server,作用是让 Linux/macOS/Agent 连接到这台 Windows。两者可以都装,但不要搞反。
5. PowerShell 一次性安装和启用
如果你更习惯命令行,或者希望把步骤交给人工脚本执行,可以直接用管理员 PowerShell。右键开始菜单,选择 Windows PowerShell (Admin) 或 Terminal (Admin),然后执行:
图 5:管理员 PowerShell 可以完成安装、启动、自动启动和防火墙确认。
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name 'OpenSSH-Server-In-TCP'
如果防火墙规则不存在,可以创建:
New-NetFirewallRule `
-Name 'OpenSSH-Server-In-TCP' `
-DisplayName 'OpenSSH Server (sshd)' `
-Enabled True `
-Direction Inbound `
-Protocol TCP `
-Action Allow `
-LocalPort 22
然后在 Linux 或 macOS 上先做一次密码登录测试:
ssh <user>@<windows-host>
第一次连接时,客户端会提示确认主机指纹。确认你连的是自己的 Windows 主机后输入 yes,再输入 Windows 用户密码。如果能进入 Windows 命令行,说明网络、服务、账号和防火墙的基本链路已经通了。
6. Linux/macOS 生成 SSH key
接下来做免密登录。Linux 和 macOS 默认都有 OpenSSH 客户端,直接生成 Ed25519 密钥即可:
ssh-keygen -t ed25519 -C "agent-client"
一路回车会生成:
~/.ssh/id_ed25519 私钥,留在 Linux/macOS,不要复制给别人
~/.ssh/id_ed25519.pub 公钥,可以放到 Windows
如果你已经有默认密钥,也可以为 Windows 单独生成一把,便于权限隔离:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_windows -C "agent-windows"
之后连接时显式指定:
ssh -i ~/.ssh/id_ed25519_windows <user>@<windows-host>
这里的安全边界很重要:私钥永远留在 Agent 所在的 Linux/macOS 客户端,Windows 只保存公钥。 如果你要把这个能力交给 AI Agent,应该让 Agent 使用受控目录里的私钥,并确保私钥文件权限足够严格:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_windows
图 6:客户端保留私钥,Windows 只保存公钥。
7. 普通 Windows 用户配置 authorized_keys
如果 Windows 登录用户不是本机 Administrators 组成员,公钥放在该用户自己的 home 目录即可。先用密码登录 Windows:
ssh <user>@<windows-host>
进入 Windows 后执行 PowerShell:
New-Item -ItemType Directory -Force $env:USERPROFILE\.ssh
notepad $env:USERPROFILE\.ssh\authorized_keys
把 Linux/macOS 上的公钥内容复制进去。公钥可以这样查看:
cat ~/.ssh/id_ed25519.pub
保存后退出,再从 Linux/macOS 测试:
ssh -i ~/.ssh/id_ed25519 <user>@<windows-host> hostname
如果能直接返回 Windows 主机名,不再提示输入密码,普通用户免密登录就成功了。
为了更适合 Agent 使用,也可以写一个 SSH 配置别名:
Host winbox
HostName <windows-host>
User <user>
IdentityFile ~/.ssh/id_ed25519_windows
IdentitiesOnly yes
之后 Agent 只需要执行:
ssh winbox hostname
8. 管理员用户组的关键差异:administrators_authorized_keys
这里是很多人最容易踩坑的地方:如果你登录的 Windows 用户属于本机 Administrators 组,OpenSSH 默认不会读取该用户目录下的 .ssh\authorized_keys,而是读取:
C:\ProgramData\ssh\administrators_authorized_keys
这是 Windows OpenSSH 的安全设计。管理员组公钥集中放在 ProgramData 下,并要求 ACL 权限正确。否则你会遇到一种很迷惑的现象:密码登录正常,公钥也写进去了,但免密就是不生效。
图 7:管理员组用户的公钥文件位置和普通用户不同,ACL 也必须正确。
以管理员身份打开 PowerShell,执行:
New-Item -ItemType Directory -Force C:\ProgramData\ssh
notepad C:\ProgramData\ssh\administrators_authorized_keys
把 Linux/macOS 里的公钥粘贴进去。然后修正权限:
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
最后重启服务:
Restart-Service sshd
回到 Linux/macOS 测试:
ssh -i ~/.ssh/id_ed25519_windows <admin-user>@<windows-host> whoami
如果成功返回用户身份,并且没有要求输入密码,管理员组免密登录就完成了。
如果仍然失败,按顺序检查:公钥是否一整行粘贴完整,没有换行断裂;登录用户是否真的属于 Administrators 组;是否把公钥放错到了普通用户的 authorized_keys;administrators_authorized_keys 的 ACL 是否只保留了 Administrators 和 SYSTEM 的有效权限;修改文件后是否重启了 sshd 服务;客户端是否指定了正确私钥。
9. 让 AI Agent 通过 SSH 操作 Windows
到这里,Windows 已经变成一个标准 SSH 目标。Agent 的使用方式就很自然了。
图 8:Agent 不需要远程桌面,只要能执行 ssh 和 scp,就能自动化 Windows。
常用命令如下:
ssh winbox hostname
ssh winbox whoami
ssh winbox powershell -NoProfile -Command "Get-Service sshd"
ssh winbox powershell -NoProfile -Command "Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, OsBuildNumber"
复制脚本到 Windows:
scp ./check-windows.ps1 winbox:~/Desktop/check-windows.ps1
执行脚本:
ssh winbox powershell -ExecutionPolicy Bypass -File ~/Desktop/check-windows.ps1
如果你让 Agent 做 Windows 维护,可以这样描述任务:
请通过 SSH 连接 Host winbox,只执行只读检查:确认 Windows 版本、OpenSSH Server 服务状态、防火墙规则、磁盘剩余空间和最近 24 小时系统错误日志。不要修改系统配置,不要读取用户私人文件,不要输出任何密钥或隐私信息。最后给出命令证据和风险列表。
如果要让 Agent 修改配置,也要明确边界:
请通过 SSH 连接 Host winbox,修复 OpenSSH Server 无法自动启动的问题。允许修改 sshd 服务启动类型和 OpenSSH 防火墙规则;不要修改用户数据、不要安装第三方远控软件、不要开放公网端口。修复后用 ssh 命令验证连接,并给出改动清单。
好的 Agent 提示词不是“帮我接管 Windows”,而是告诉它:连接哪个 SSH Host、允许做什么、不允许做什么、验证什么、怎么汇报证据。
10. 安全建议:能免密,不等于应该无边界
免密登录很方便,但它本质上是把“谁拿到私钥,谁就能登录 Windows”的信任关系建立起来。因此建议至少做到这些:
- 不要把 Windows 22 端口直接暴露到公网。如果必须公网访问,至少使用 VPN、零信任隧道、堡垒机或来源 IP 限制。
- 给 Agent 单独准备密钥,不要复用你的个人主力 SSH 私钥。
- Agent 能用普通用户完成的任务,就不要默认给管理员用户。
- Windows 管理员组免密登录必须使用
administrators_authorized_keys,并严格设置 ACL。 - 不要在文章、脚本、日志、截图里写真实主机名、真实 IP、真实用户名和私钥内容。
- 重要 Windows 机器启用前先做备份或快照。
- 如果只是临时维护,任务完成后可以移除对应公钥或禁用
sshd服务。
还可以在 Windows 上查看 sshd 服务状态:
Get-Service sshd
Get-NetFirewallRule -Name 'OpenSSH-Server-In-TCP'
在客户端增加连接调试:
ssh -vvv winbox hostname
-vvv 会输出详细握手过程,适合排查“到底有没有使用正确私钥”“服务端为什么拒绝公钥”“是否退回到密码认证”等问题。调试完成后不要把完整日志公开贴出,因为里面可能包含本机路径、用户名、主机指纹等环境信息。
11. 常见问题
问题一:能密码登录,但不能免密。
先判断用户是不是管理员组成员。普通用户看 %USERPROFILE%\.ssh\authorized_keys,管理员组用户看 C:\ProgramData\ssh\administrators_authorized_keys。位置错了,公钥再正确也不会生效。
问题二:管理员公钥文件已经写了,还是不行。
大概率是 ACL 不符合要求。重新执行:
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
Restart-Service sshd
问题三:Linux/macOS 提示 connection refused。
通常是 sshd 没启动,或者 Windows 防火墙没放行 22 端口。先在 Windows 上执行 Get-Service sshd 和 Get-NetFirewallRule -Name OpenSSH-Server-In-TCP。
问题四:提示 permission denied。
检查用户名、密码、公钥位置、私钥文件、Windows 用户是否允许登录。也可以用 ssh -vvv 看客户端到底尝试了哪把私钥。
问题五:Agent 登录后执行 PowerShell 命令乱码或路径不对。
优先使用 powershell -NoProfile -Command "..." 或 pwsh -NoProfile -Command "...",路径里有空格时加引号。复杂脚本不要塞进一行命令,先 scp 上传 .ps1,再远程执行。
12. 最后总结
Windows 支持 OpenSSH Server 以后,AI Agent 管理 Windows 的门槛其实低了很多。你不需要让 Agent 看远程桌面,也不需要让它模拟鼠标键盘。只要 Windows 端启用 sshd,Linux/macOS 端准备好 SSH key,Agent 就能通过一条标准 SSH 通道完成大量自动化任务。
这套方案的关键不是“神奇”,而是标准:标准 SSH 客户端、标准公钥认证、标准 PowerShell 命令、标准服务和防火墙规则。标准意味着可复用、可审计、可脚本化,也意味着出问题时能按证据排查。
我建议把它作为 Windows 自动化的基础设施来对待:先在测试机上跑通,确认普通用户和管理员用户两种公钥位置,写好 SSH config,限制网络边界,再交给 Agent 使用。这样 Windows 就不再是 Agent 工作流里的“图形孤岛”,而是和 Linux、macOS 一样,可以被命令行稳定管理的一台机器。