『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 10104|回复: 38

[经验分享] 另类HA一键WOL远程开关主机玩法(适用任何win&linux)

  [复制链接]

9

主题

136

帖子

906

积分

高级会员

Rank: 4

积分
906
金钱
770
HASS币
0
发表于 2022-8-8 01:56:21 | 显示全部楼层 |阅读模式
本帖最后由 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

至此,操作完成!受控主机状态带在线检测反馈到开关上的,一键远程软开机关机搞定,测试完美~


评分

参与人数 2金钱 +13 收起 理由
ysst4 + 5 膜拜大神!
zelotoj + 8 赠人玫瑰,手留余香!

查看全部评分

回复

使用道具 举报

0

主题

620

帖子

2568

积分

金牌会员

Rank: 6Rank: 6

积分
2568
金钱
1948
HASS币
0
发表于 2022-8-8 08:59:27 | 显示全部楼层
顶一下,感觉也是挺简单方便
回复

使用道具 举报

52

主题

1349

帖子

5740

积分

论坛DIY达人

积分
5740
金钱
4391
HASS币
20
发表于 2022-8-8 11:17:19 | 显示全部楼层
方法不错,谢谢分享!!
回复

使用道具 举报

2

主题

100

帖子

785

积分

高级会员

Rank: 4

积分
785
金钱
685
HASS币
0
发表于 2022-8-11 15:39:48 | 显示全部楼层
多谢 正好需要 只搞了开 关都是远程桌面进去关的
回复

使用道具 举报

9

主题

136

帖子

906

积分

高级会员

Rank: 4

积分
906
金钱
770
HASS币
0
 楼主| 发表于 2022-8-16 14:36:05 | 显示全部楼层
invincible 发表于 2022-8-11 15:39
多谢 正好需要 只搞了开 关都是远程桌面进去关的

那这个正合适你了,不用远程桌面进去关
回复

使用道具 举报

1

主题

27

帖子

121

积分

注册会员

Rank: 2

积分
121
金钱
94
HASS币
0
发表于 2022-10-5 19:08:52 | 显示全部楼层
你好,请问一下我的按照你的配置好了,但是开关按钮能开机不能关机,用ssh命令是可以关机的,但是按开关按钮就是不能关机,是什么问题呀?
回复

使用道具 举报

9

主题

136

帖子

906

积分

高级会员

Rank: 4

积分
906
金钱
770
HASS币
0
 楼主| 发表于 2022-10-7 16:28:45 | 显示全部楼层
变态小学鸡 发表于 2022-10-5 19:08
你好,请问一下我的按照你的配置好了,但是开关按钮能开机不能关机,用ssh命令是可以关机的,但是按开关按 ...

你试过进入ha容器内用 ssh 系统用户名@ip地址  能直接免密登录到受控主机的openssh了吗
回复

使用道具 举报

1

主题

27

帖子

121

积分

注册会员

Rank: 2

积分
121
金钱
94
HASS币
0
发表于 2022-10-8 00:15:42 | 显示全部楼层
zjhcr 发表于 2022-10-7 16:28
你试过进入ha容器内用 ssh 系统用户名@ip地址  能直接免密登录到受控主机的openssh了吗 ...

我是用PVE虚拟机安装的,我没有弄PVE的密匙。
我点开关我看日志返回的是return code: 255的错误,但是我直接用商店里面的ssh用命令行就又可以控制电脑关机,难道商店里的那个ssh,生成的密匙是不一样的吗?
回复

使用道具 举报

9

主题

179

帖子

1409

积分

金牌会员

Rank: 6Rank: 6

积分
1409
金钱
1230
HASS币
0
发表于 2022-10-22 19:49:44 | 显示全部楼层
zjhcr 发表于 2022-10-7 16:28
你试过进入ha容器内用 ssh 系统用户名@ip地址  能直接免密登录到受控主机的openssh了吗 ...

我把生成的公钥分别改名放到对应文件夹中以后,用HA的ssh还是需要输入密码,但我同时把公钥放到群晖里,就可以关闭群晖,这是为什么
回复

使用道具 举报

9

主题

179

帖子

1409

积分

金牌会员

Rank: 6Rank: 6

积分
1409
金钱
1230
HASS币
0
发表于 2022-10-23 00:50:02 | 显示全部楼层
变态小学鸡 发表于 2022-10-8 00:15
我是用PVE虚拟机安装的,我没有弄PVE的密匙。
我点开关我看日志返回的是return code: 255的错误,但是我 ...

我和你以PVE装的HA,也是用的addons里的ssh插件生成的公钥,但是我按步骤把公钥分别复制到那两个文件以后还是不行。但我同时也罢生成的秘钥导入群晖里,就可以免密码登录并关机。不知道你用SSH关机Windows的时候需要你输入密码吗,我的不管是登录还是发送关机命令都需要输入密码,但是我吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-26 09:24 , Processed in 0.117123 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表