编辑
2024-04-20
折腾
00
请注意,本文编写于 88 天前,最后修改于 71 天前,其中某些信息可能已经过时。

目录

寻找解决方案
远程开机实现
远程关机方案
还有更优方案

相关信息

事情是这样的,有时候需要用到的文件,总是会在家里的台式机上,而我已经进行了异地组网,随时可连上家里的网络,这时候如果能远程开关机就更棒了。

寻找解决方案

  1. 使用米家开机卡,然后使用米家App就能远程开关机了
    这个方案直接就pass掉了,首先开机卡占用了一个pcie插槽,虽然说主板有四个插槽,但这个开机卡就浪费了一个,太没性价比了,而且还会把开机跳线占用掉,十分不符合我「不抛弃,不放弃」的风格,为了远程开机,结果本地开机没了。
  2. 搞个智能开关,然后设置通电自启
    这玩意其实也能算个解决方案,但是鉴于我经常在米家App点错开关,万一电脑被我不小心断电,还加大了文件丢失的风险,想想还是算了。
  3. WOL开机
    WOL全称Wake-on-LAN,意即网络唤醒,是指通过局域网对一台主机发送一个魔术包,让这台主机从睡眠或者关机状态中「唤醒」过来。大部分台式机主板都支持WOL,只要在bios中开启该功能即可。我已经进行异地组网,随时可以连接家里的局域网,看起来这个方案最方便。

远程开机实现

第一步,肯定是在bios中开启该功能,我是微星主板,在「设置」-「高级」-「唤醒事件设置」中,将pcie设备唤醒选项开启即可。

第二步,我的软路由和它下面接的华硕路由器(AP模式)里面都自带网络唤醒功能,只要记住电脑的mac地址即可通过任何一台路由器唤醒。

但是事情肯定没有这么简单,因为每次想要唤醒电脑,都要先登录路由器,然后在众多菜单中找到网络唤醒菜单,然后再找到自己的电脑mac地址,然后再唤醒,每多一步操作,我就少一分耐心,我想应该还能有更简单的方式。

正好想起我自己的公众号代码就部署在家里的另一台小服务器上,那我应该可以通过公众号直接唤醒电脑啊,说干就干,接下来就是我的实现方式,关键代码就两行:

python
from wakeonlan import send_magic_packet send_magic_packet("xx:xx:xx:xx:xx:xx") # 函数中填入电脑mac地址

emmmmm,Python就是好,连WOL都有现成的包可用,直接调包就完事了。

于是我只需要在公众号服务端监听消息,只要是我指定的wol唤醒「咒语」,就自动触发这段代码,这里需要特别注意一个事情,由于我公众号服务端是使用docker部署的,所以如果需要网络唤醒这个功能,部署的docker容器一定要使用host模式,桥接模式下亲测并不能在局域网内唤醒电脑。

做完这个功能后,再也不用记电脑的mac地址了,而且有时候回来,到楼下顺手发一下咒语,上楼都不用等电脑开机了,十分方便。

远程关机方案

既然说的是远程开关机的实现方式,必定不能只有开机。一般情况下我都是用windows自带的远程桌面连接,顺手关机倒也还好,但是我还是好奇,能否有其他方式实现,比如我没法远程桌面的时候也想远程关机怎么办?

找了找,发现还真有解决方案,思路大致如下:

  1. windows上开启openssh服务端功能,设置好账号密码
  2. 使用Python通过ssh服务连接上电脑
  3. 发送shutdown指令

关键代码如下:

python
import paramiko def ssh_shutdown(hostname, port, username, password): # 创建SSH对象 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 client.connect(hostname, port, username, password) # 执行关机命令 stdin, stdout, stderr = client.exec_command('shutdown /s /t 0') # 获取命令输出 print(stdout.read().decode()) # 关闭连接 client.close() return "关闭电脑"

参数中hostname填入电脑ip地址,port一般是22,username为电脑登录名,password开机密码

还有更优方案

其实可以把远程开关机的功能都做成 web 接口,这样可以用iPhone中的快捷指令一步就实现开关机,连打开微信公众号的功夫都省了,甚至可以使用 siri 动动嘴就能开关机,或者直接用自动化,进入大楼附近就直接开机,离开自动关机。

本文作者:狄云

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!