前言
作为时不时就要出差的我,为了能够在外面的酒店也能玩到电脑,自然而然的打起远程操控电脑的注意。而纵观世界上任何一个远程串流软件,其必然的前提是——被控端设备一定是在开机状态 (废话) 。但是一直打开电脑不但费电费,而且容易被勤俭节约的同居人 “好心” 帮你关机。为了避免出现“想玩的时候折腾半天,发现是自己电脑关机”这种尴尬的情况,远程开机的需求自然就提了出来。
物理层面的通电开机
总所周知,现在的电子设备基本上都有插电自启的功能,我们的电脑也不例外。
因此我一开始的思路是买一个智能、可以联网开关的插座,对电脑实行物理层面的通断电而达到远程开关机的目的。
主板的通电自启功能一般是默认关闭的,因此我们需要提前在主板中打开。我们只需要在bios中开启即可。每个厂家的bios不同,开启方式也不一样,但是基本都大同小异,例如在华硕主板中,在bios进入到Advanced Mode,在Advanced选项卡中点开高级电源管理,将断电恢复改为电源开启即可。
接下来只要找一个好用的智能插座即可。一开始我瞄准的米家的智能开关插座(毕竟现在用的小米手机)


但!!!看着者这50元的售价,我的荷包在告诉我一定有其他更好的办法!对于家庭nas都是靠捡垃圾配出来的我,这么高端的插座显然不怎么符合我的气质(不是)。
既然已经装了nas,那为何不在nas上作文章呢?
Wake On Lan——网络唤醒
Wake-On-LAN简称WOL,是一种电源管理功能;如果存在网络活动,则允许设备将操作系统从待机或休眠模式中唤醒。许多主板厂商支持IBM提出的网络唤醒标准。该标准允许网络管理员远程打开PC机电源,以便进行文件升级、资源跟踪和设备清点等工作。
Wake On Lan(wol)其实在很早以前就已经诞生,广泛到现在基本是一张主板就搭载这种技术。
使用之前是一样要到bios中开启,跟之前通电自启一样,每个主板商的开启方式都不一样,但大同小异。还是以华硕主板举例:在bios进入到Advanced Mode, 点击APM Configuration, 并将Power On By PCI-E改为Enabled即可。
改完bios后,我们还需要在Windows中设置一下方可。
我们在设备管理器中打开网络适配器,右键你的网卡,点击属性

点击高级选项卡,选到魔术封包唤醒,并设置为开启

至此,被控端的设置便全部设置完成。接下来就要找一个合适的设备进行安装wol客户端,让这台设备发送数据包便可以远程唤醒了。而合适的设备——那自然是二十四小时不关机的设备啦。
openwrt wol
说到24小时不关机的智能设备,大多数人家里那肯定是路由器。而我正好有一台刷了openwrt的旁路由。
我们进入openwrt的后台,找到网络唤醒,然后选择进入被控设备的ip/mac地址,最后点一下唤醒主机即可。

Docker wol-go-web
唉,每次都要选择地址,好麻烦的,还有没有更方便,真正一键启动的办法呢?
有的兄弟,包有的。
在docker的神奇妙妙容器里面,有不少与wol相关的容器。个人觉得最方便的那就是chishin/wol-go-web,它可以只用一串链接就发送wol开机指令,真正做到了一键启动。
部署也非常简单,以下是docker compse文件。
services:
wol-go-web:
image: chishin/wol-go-web:latest
container_name: WolGoWeb
restart: unless-stopped
network_mode: host # 必须要用host模式
environment:
- PORT=9090 # 指定端口号,可自行更改
- KEY=false
部署完成后我们只需要在浏览器输入http://服务器IP或域名:9090/wol?mac=需要唤醒主机的MAC地址即可。在外地还可以通过ddns/内网穿透来进行唤醒主机。
Docker upsnap
upsnap也是一个wol服务,虽然提供了好看的webui,但是单论开机方便而言,其实不如是chishin/wol-go-web那种一条链接直接开机来的舒服。
But!它可以输入设置关机指令!
由于曾经试过串流软件卡死导致无法连接的主机,必须要重启的情况,显然光有wol是无法做到关机的,因此upsnap自然就被我看上了。
部署upsnap也是非常简单
services:
upsnap:
container_name: upsnap
image: ghcr.io/seriousm4x/upsnap:latest # images are also available on docker hub: seriousm4x/upsnap:5
network_mode: host
restart: unless-stopped
volumes:
- ./pb_data:/app/pb_data
# # To use a non-root user, create the mountpoint first (mkdir data) so that it has the right permission.
# user: 1000:1000
# environment:
# - TZ=Europe/Berlin # Set container timezone for cron schedules
# - UPSNAP_INTERVAL=*/10 * * * * * # Sets the interval in which the devices are pinged
# - UPSNAP_SCAN_RANGE=192.168.1.0/24 # Scan range is used for device discovery on local network
# - UPSNAP_SCAN_TIMEOUT=500ms # Scan timeout is nmap's --host-timeout value to wait for devices (https://nmap.org/book/man-performance.html)
# - UPSNAP_PING_PRIVILEGED=true # Set to false if you don't have root user permissions
# - UPSNAP_WEBSITE_TITLE=Custom name # Custom website title
# # dns is used for name resolution during network scan
# dns:
# - 192.18.0.1
# - 192.18.0.2
# # you can change the listen ip:port inside the container like this:
# entrypoint: /bin/sh -c "./upsnap serve --http 0.0.0.0:5000"
# healthcheck:
# test: curl -fs "http://localhost:5000/api/health" || exit 1
# interval: 10s
# # or install custom packages for shutdown
# entrypoint: /bin/sh -c "apk update && apk add --no-cache <YOUR_PACKAGE> && rm -rf /var/cache/apk/* && ./upsnap serve --http 0.0.0.0:8090"
upsnap 开机
部署完成后在浏览器输入http://服务器IP或域名:8090即可进入upsnap的webui后台。

点击右上角新增, 并输入备注、ip、mac地址、子网掩码便可

当然,你也可以点击网络扫描,设定好ip网段以后便可以自动识别添加

upsnap 关机
对于关机而言,我们需要额外设置一番。Windows端最好是安装并启用openssh。
进入到设置>系统>可选功能>添加可选功能,点击查看功能,搜索并安装openssh

设置完成以后,我们回到upsnap,在关机指令中输入sshpass -p "你的电脑密码" ssh -o "StrictHostKeyChecking=no" 你的电脑账号@电脑局域网ip "shutdown /s /t 0 /f"

最后拉到最下面点击保存即可。
现在,你用其他设备登陆upsnap,就可以远程控制开关机啦。