ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Home Assistant 中通过 SSH 远程控制 Windows 关机

Home Assistant 中通过 SSH 远程控制 Windows 关机 在 Home Assistant 中通过 SSH WOL 远程控制 Windows 电脑开关机本指南将帮助你实现开机通过 Wake-on-LAN (WOL) 魔术包唤醒 Windows 电脑。关机通过 SSH 连接 Windows 的 OpenSSH 服务器执行shutdown命令。本文基于 Home Assistant OS / Container 环境Windows 端为 Windows 10/11。文中涉及的用户名、IP 地址等均已用占位符代替请替换为你自己的实际信息。 准备工作Home Assistant 已安装Terminal SSH或SSH Web Terminal加载项。Windows 电脑已连接局域网且已知其IP 地址和MAC 地址可通过ipconfig /all查看。Windows 登录用户名下文用你的用户名代替——请确保该账户已设置密码空密码会被 SSH 服务拒绝。1. Windows 端设置1.1 启用 OpenSSH 服务器打开设置→应用→可选功能。点击添加功能搜索并安装OpenSSH 服务器。按Win R输入services.msc打开服务管理器。找到OpenSSH SSH Server将其启动类型设为“自动”然后点击“启动”。1.2 配置 Windows 防火墙打开控制面板→Windows Defender 防火墙→允许的应用。找到OpenSSH Server确保“专用”和“公用”复选框都被勾选。如果找不到点击“更改设置”→“允许其他应用”手动添加C:\Program Files\OpenSSH\sshd.exe。排障经验若连接超时可临时关闭防火墙测试确认后再重新开启并添加例外规则。1.3 设置 Windows 账户密码重要SSH 服务默认禁止空密码登录。请为你的 Windows 账户设置一个密码按Ctrl Alt Del→更改密码或通过设置→账户→登录选项添加密码。⚠️ 若你坚持使用无密码账户则必须配置公钥认证见下文 1.5但本指南仍建议设置密码作为备选。1.4 在 Home Assistant 中生成 SSH 密钥对打开 Home Assistant 的终端Terminal执行以下命令建议使用ed25519算法ssh-keygen-ted25519-f/config/.ssh/id_rsa出现提示时直接按回车不要设置密码即留空 passphrase。完成后私钥/config/.ssh/id_rsa和公钥/config/.ssh/id_rsa.pub已生成。1.5 将公钥部署到 Windows公钥认证① 复制公钥内容在 Home Assistant 终端中执行cat/config/.ssh/id_rsa.pub复制输出的整段内容以ssh-ed25519或ssh-rsa开头。② 在 Windows 上创建公钥文件先确认你的 Windows 账户是否属于管理员组在 PowerShell 中执行net localgroup administrators若你的账户是管理员大多数情况以管理员身份打开记事本打开文件C:\ProgramData\ssh\administrators_authorized_keys若不存在则新建将公钥内容粘贴进去保存。⚠️重要Windows 的默认sshd_config末尾有Match Group administrators规则管理员账户只会读取C:\ProgramData\ssh\administrators_authorized_keys不会读取C:\Users\你的用户名\.ssh\authorized_keys。所以管理员必须把公钥放在administrators_authorized_keys里。若你的账户是普通用户进入目录C:\Users\你的用户名\.ssh\若.ssh文件夹不存在则新建在.ssh文件夹下新建文件authorized_keys无后缀粘贴公钥内容并保存。③ 开启 sshd 的公钥认证⭐ 本次排障发现的关键点这是最容易漏掉的一步也是“仍然要求输入密码”最常见的原因。以管理员身份打开记事本打开C:\ProgramData\ssh\sshd_config找到下面这行PubkeyAuthentication no把它改为PubkeyAuthentication yes说明如果该行前面有#即#PubkeyAuthentication yes去掉#即可。很多教程默认公钥认证是开启的但实际机器上可能被显式写成了no导致 sshd完全忽略你的密钥、直接要求密码。④ 设置公钥文件权限⭐ 最关键步骤若未正确设置权限SSH 会忽略该密钥文件导致回退到密码登录。以管理员身份打开 PowerShell以管理员账户为例执行cd C:\ProgramData\ssh# 1. 移除继承权限只保留显式权限icacls administrators_authorized_keys/inheritance:r# 2. 仅授予 SYSTEM 和 Administrators 完全控制icacls administrators_authorized_keys/grantSYSTEM:Ficacls administrators_authorized_keys/grantBUILTIN\Administrators:F# 3. 显式移除多余的“Authenticated Users”权限排障经验/inheritance:r 清不掉显式 ACEicacls administrators_authorized_keys/removeNT AUTHORITY\Authenticated Users⭐排障经验实际案例中即使执行了/inheritance:r文件里仍残留一条NT AUTHORITY\Authenticated Users:(F)的显式权限条目继承清理只删除“继承”项不删除显式项Windows OpenSSH 因此认定文件“不安全”而拒绝使用密钥。务必用/remove把这条也删掉。验证权限是否正确执行icacls administrators_authorized_keys正确结果应只有以下两项不能出现Authenticated Users或其他用户administrators_authorized_keys BUILTIN\Administrators:(F) NT AUTHORITY\SYSTEM:(F)再确认文件所有者应为BUILTIN\Administrators(Get-AclC:\ProgramData\ssh\administrators_authorized_keys).Owner⑤ 重启 SSH 服务在 PowerShell管理员中执行Restart-Servicesshd1.6 测试 SSH 连接在 Home Assistant 终端中执行替换用户名和 IPssh-i/config/.ssh/id_rsa 你的用户名你的电脑IP首次连接会提示验证主机密钥输入yes接受。如果配置正确你应该无需密码直接登录到 Windows 的命令行。❗ 如果遇到Host key verification failed说明 Windows 主机密钥已变更在 Home Assistant 终端执行ssh-keygen -R 你的电脑IP清除旧记录再次连接即可。2. Home Assistant 配置2.1 编辑configuration.yaml在configuration.yaml中添加以下内容# 1. 配置 WOL 开关switch:-platform:wake_on_lanname:my_pc# 自定义名称mac:AA-BB-CC-DD-EE-FF# 替换为你的电脑 MAC 地址host:你的电脑IP# 替换为你的电脑 IP建议填写turn_off:service:shell_command.turn_off_pc# 关联关机命令# 2. 配置关机 shell_commandshell_command:turn_off_pc:ssh -o UserKnownHostsFile/dev/null -o StrictHostKeyCheckingno -i /config/.ssh/id_rsa 你的用户名你的电脑IP shutdown /s /t 0参数说明-o UserKnownHostsFile/dev/null忽略主机密钥检查避免 IP 变化导致连接失败。-o StrictHostKeyCheckingno自动接受新主机密钥。shutdown /s /t 0Windows 立即关机命令。2.2 检查配置并重启 Home Assistant在 Home Assistant 的开发者工具→检查配置中验证 YAML 无误。点击重启Home Assistant 使配置生效。3. 使用与验证开机在 Home Assistant 概览页面找到开关实体my_pc点击“开”电脑应被 WOL 唤醒。关机点击“关”电脑会执行关机命令。4. 常见问题排查现象可能原因解决方法开机无反应WOL 未在 BIOS 和网卡中启用进入 BIOS 开启 WOL并在 Windows 网卡属性中启用“魔术包唤醒”。关机失败SSH 连接超时防火墙拦截或 IP 改变检查 Windows 防火墙是否放行 22 端口在shell_command中使用-o ConnectTimeout5。提示Permission denied公钥权限不正确或 Windows 账户密码为空重设公钥权限见 1.5 ④确保账户有密码。连接后仍要求输入密码⭐ 最常见①sshd_config中PubkeyAuthentication no② 公钥文件 ACL 里残留Authenticated Users等多余权限③ 公钥放错了文件④ 未重启 sshd① 改为PubkeyAuthentication yes② 用icacls检查并只保留Administrators和SYSTEM③ 管理员账户须放到C:\ProgramData\ssh\administrators_authorized_keys④ 执行Restart-Service sshd。5. 附加进阶技巧5.1 将 SSH 私钥权限加固可选在 Home Assistant 中确保私钥仅可被读取chmod600/config/.ssh/id_rsachmod700/config/.ssh如果私钥权限过宽例如 644OpenSSH 客户端会拒绝使用该密钥并退回密码登录可在测试时加-vvv查看Permissions ... are too open提示。5.2 使用自定义脚本实现更复杂的操作你可以在 Windows 上创建批处理脚本如C:\scripts\关机.bat然后通过 SSH 调用shell_command:turn_off_pc:ssh ... C:\scripts\关机.bat5.3 安全建议检查C:\ProgramData\ssh\sshd_config建议把PermitEmptyPasswords设为no若它是yesPermitEmptyPasswords no 总结通过以上配置你可以在 Home Assistant 中一键远程控制 Windows 电脑的开关机且全程使用安全加密的 SSH 连接。本次排障沉淀下来的两个关键点务必记住PubkeyAuthentication必须为yes否则 sshd 直接忽略所有公钥。administrators_authorized_keys的 ACL 只能有Administrators和SYSTEM任何多余的Authenticated Users等权限都会让 Windows OpenSSH 拒绝使用该密钥且管理员账户只会读这个文件不会读~\.ssh\authorized_keys。若在实施过程中遇到任何问题欢迎反馈补充
返回列表