本帖最后由 zjhcr 于 2022-8-8 02:16 编辑
在论坛逛了几圈,寻找HA下一键远程软开关主机(非物理通断电启动关闭)的方法,看了几个帖子,效果都并不理想;
要么需要借助第三方程序或插件,要么需要开启win系统的RPC服务然后使用HA的开关机add-on插件,虽然相对简单但都存在着不便或安全隐患。
经过一番折腾,终于找到方法解决WOL方式的一键软开关主机,能通吃Windows和Linux主机,群晖、威联通等NAS类Linux主机也是没有问题的
其实思路很简单,启动部分就是通过HA的WOL服务功能唤醒主机的,依旧需要设备具备或者开启WOL支持。
而软关机部分主要是通过shell_command命令来发送关机指令让远程主机执行关机。
Linux主机本身支持SSH就能很好地实现这个功能,主要解决HA通过SSH的免密登录发送shell命令给受控主机就可以了。而本文的重点部分是介绍如何解决了Windows系统也能支持SSH方式接受shell command命令。
新手提示:内容阅读需要有一定的SSH操作基础,虽然操作错了也不会带来什么致命影响,但建议还是熟悉SSH后再来尝试。
首先第一步,Windows主机部署OpenSSH服务,Linux主机可以跳过此步
受控的Windows主机若是win10以前的版本,譬如win7,安装OpenSSH使Win主机获得SSH的支持
具体部署请参考:win7下安装openSSHhttps://blog.csdn.net/youlinhuanyan/article/details/105925666
若受控主机是win10后的版本,系统已经自带OpenSSH,但是需要启用功能和设置系统启动自动运行服务
请参考:win10自带的openssh使用教程https://www.dadighost.com/help/39658.html
第二步,进入HA的SSH生成密匙对,并将公匙放置受控主机authorized_keys里
(Tips:如果是安装在容器下的HA,宿主机SSH可以用docker exec -it 容器名称 bash命令进入到内部容器终端,容器名称可以用docker ps命令查看。也可以安装portainer容器管理器点console在网页上使用容器内部终端。使用群晖的Docker套件的话,则可以右键单击容器——详情——终端机
Docker 图形化工具 Portainerhttps://www.jianshu.com/p/e76054edabe1
)
HA的SSH下输入ssh-keygen生成密匙对
然后输入ls /root/.ssh/ -a查看目录下是否已生成id_rsa.pub公钥文件
退出容器的终端,回到宿主机的终端,输入docker cp homeassistant:/root/.ssh/id_rsa.pub /tmp/ (homeassistant为容器名称,/tmp/为临时目录)
第三步:拷贝生成的公匙到受控主机
Win系统:使用WinSCP这个软件登录宿主机,用户名和密码与宿主机SSH登录名密码一致,把宿主机上/tmp/id_rsa.pub文件拷贝回Windows系统目录上,为了举例方便,我拷贝至C:\Users\Administrator\.ssh\里,Administrator是有管理员权限的用户,.ssh目录如果不存在,请先在cmd用mkdir .ssh创建此目录,右键无法新建。然后把id_rsa.pub复制一份并改名为authorized_keys,然后再拷贝一份id_rsa.pub至C:\ProgramData\ssh目录下并改名为administrators_authorized_keys
(完成这步此时你的受控win主机C:\Users\Administrator\.ssh\目录里应有authorized_keys文件、和C:\ProgramData\ssh目录里应有administrators_authorized_keys文件。若这步我表达得不够清楚,可以参照微软官方的文档,部署公匙——标准用户、管理用户,这两块都要操作 OpenSSH 密钥管理https://docs.microsoft.com/zh-cn ... enssh_keymanagement)
Linux系统:受控主机输入scp HA宿主机管理用户名@HA宿主机IP:/tmp/id_rsa.pub /root/.ssh/authorized_keys把id_rsa.pub拷贝成authorized_keys放在.ssh目录下
第四步:HA测试SSH连接受控主机
回到HA的终端,输入命令ssh 受控主机用户名@受控主机IP,例如ssh [email protected],第一次可能会提示添加密匙,键入yes回车就行了。然后看看是否会提示输入受控主机的用户名和密码,如果没有提示,则通过密匙免密登录受控机成功,然后HA就可以通过shell command来控制受控主机了!
HA的配置部分,实体为开关,yaml内容参考:
switch:
- platform: wake_on_lan
mac: "00:E0:67:02:44:33"
name: "Win7 PC"
host: "192.168.1.110"
turn_off:
service: shell_command.suspend_win7pc
shell_command:
suspend_win7pc: "ssh [email protected] rundll32.exe powrProf.dll,SetSuspendState"
其中,
mac是受控主机网卡mac地址
name是在HA中生成开关实体的名字,你起个方便你自己记的
host是受控主机的ip地址,建议受控主机采用手动固定地址或者通过添加路由器DHCP固定分配地址
turn_off:
service: shell_command.suspend_win7pc 为安排开关关闭时调用哪个shell_command命令
对应的shell_command:命令可以在下方填写,rundll32.exe powrProf.dll,SetSuspendState为Windows系统进入低功耗睡眠状态,修改为shutdown.exe -s -t 00则为关机命令
Linux系统的话则可以改为shutdown或者poweroff
至此,操作完成!受控主机状态带在线检测反馈到开关上的,一键远程软开机关机搞定,测试完美~
|