关于本周
关于本周
插播一篇技术周记
连续更新了两篇读书笔记加起来有一万两千字,本想轻量化完成周记任务的我整个人都不好了。于是决定这一篇周记改为技术周记,主要讲述我是如何不花一分钱解决在外唤醒家中休眠电脑问题的!!(令我没想到的是这篇周记写完之后也达到了 4600 字!)
研究远程唤醒的起因
我前段时间重装了一遍电脑系统,之后有一天在公司想远程家里电脑的时候发现由于忘记设置电源管理配置导致电脑进入休眠了,于是当时就想如何把这个问题优化一下。
向日葵是一个很好用的远程软件,可是他们的 WOL 棒子卖的太黑了(168 ~ 198元),我肯定是不会花这么多钱买一个专门用来开机的硬件的,对于我来说买这个都不如买树莓派。(当然,对于没有技术基础的用户来说,买一个向日葵的开机棒确实是满足远程唤醒唯一的选项)。
因为我的 NAS 是全年通电的,因此通过 WOL 的方法可以在能耗和使用体验上面进行比较好的平衡,我最终决定将通过 NAS 作为桥梁来实现这个需求。
名词解释
这里我对一些英文缩写进行解释,至于后续文章中出现的 pip 、Python 以及 SSH 等词将不会做特殊解释,各位可以自行去我们的好伙伴百度 进行查询。
WOL - Wake On Lan 顾名思义,通过局域网唤醒
NAS - Network Attached Storage 学名叫做“网络附属存储”,我的理解就是一个硬盘巨大的电脑(我的 NAS 有 4 张 8T 的硬盘)。这款群辉的
NAS我用了有 3 年了,质量一直很坚挺,所用到的功能越来越多(Aria2、Aliddns 自动解析、WOL以及Homebridge 智能家居等等)
NAS 配置
<div style="text-align:left">型号:DS918+(现 DS920)<br>内存: 4G<br>DSM 版本: DSM 6.2.3-25426 Update 3</div>
通过 WOL 唤醒局域网设备的核心思路
第一步 - 通过群辉的任务计划发送指令
第二步 - 指令通过 root 权限执行wakeonlan程序
第三步 - wakeonlan 指令通过群辉 NAS 发送至内网特定 MAC 地址设备
最终 - 设备唤醒成功
准备工作
被唤醒的设备开启 WOL 支持
开启 windows10 电脑的 WOL 功能可以参考这篇文章Win10 系统打开 WOL 远程网络唤醒功能的方法,本文将不做详细开启 WOL 功能的教程,遇到问题或需要帮助可于公众号或文章底部留言。
外网 IP
由于我在使用远程唤醒大部分时间是需要外网执行的,那么这里就需要我们能够从外网顺利的访问我们内网的设备。因为运营商的 ipv4 地址数量有限,因此对于家庭网络我们一般需要向电信申请外网的 ipv4,这样才能够从外网访问我们家里的设备。请看到这里的朋友首先确保自己是外网 IP,我之前有一次由于忽略了外网 IP 这个事情导致我在另一个项目上面浪费了超过 4 个小时的时间!!!
如何确认自己是否为公网 IP
确认自己是否为公网 IP 需要进入到路由器后台,进入路由器后台的方法不做阐述。
进入到路由器之后找到WAN IP

这个是你目前网络分配的 IP 地址,那么此时需要你前往iP 地址归属地查询来查看自己的外网 IP 地址

当你的WAN IP和IP138显示的IP 地址相同时,那么恭喜你,你的 IP 已经是外网可访问状态了。
如果WAN IP显示与 IP138 查询结果不符,那么您现在还是电信的内网 IP。
申请公网 IP
申请公网 IP 非常简单,只需要联系电信客服(我是直接联系的附近电信师傅)提供身份证、姓名以及电话号码即可很快获取到公网 IP(我申请过两次,分别为一天和七天申请下来)。
自动解析域名至外网 IP(可选)
即使我们现在获取到了一个公网 IP,但家用的 IP 地址是非固定的,其一般会在 24-48 小时内被重新分配至一个不同的 IP 地址。
因此这里建议通过 NAS 进行自动域名解析,即在 IP 重新分配之后通过 阿里云 的 API 自动重新解析域名至本地公网 IP。这样可以保证仅需配置一次域名地址即可随意访问家里网络。
域名自动解析的方法我后续可能会更新作为一篇周记,但这是非常简单的一个流程。我是通过 Docer 安装chenhw2的aliyun-ddns-cli包直接启用的域名自动解析,可以通过Dcoker项目chenhw2/aliyun-ddns-cli 进行配置。
具体教程可以参考通过群辉 docker+阿里云简单实现 DDNS
设置端口映射
由于我们的NAS并没有直接暴露在公网IP,实际上这是需要通过路由器进行端口映射的。这里端口映射的方法我不做详细描述,各位请自行百度。
我们需要的内部端口分别为
22 - SSH 端口
5000 - 群辉 NAS 默认 HTTP 访问端口
5001 - 群辉 NAS 默认 HTTPS 访问端口
同时需要将局域网IP设置为NAS对应的IP

注意,这里在端口转发的时候如果已经设置内网端口为22了,那么后面在设置NAS的SSH端口时也务必设置为22!!
正式开始请再次确认确认
已获取公网 IP
已将公网 IP 自动解析至自己的域名(可选)
被唤醒的设备已开启 WOL 支持
开始设置 WOL
安装 Python3

我们首先需要在群辉的套件中心安装 Python3
允许使用 root 账号登录
接下来我们需要开启 root 账号权限,这里我参考了这篇文章。群晖 DSM 开启 ROOT 权限及 WinSCP 使用 ROOT 登录
DSM 开启 SSH
随后我们需要进入群辉的控制面板找到终端机和SNMP选项勾选启动Telnet功能以及启动SSH功能后应用

获取 root 权限
开启 ROOT 账号和修改密码
开启群辉的 SSH 功能之后我们需要一个 SSH 工具,这里我用的是PUTTY这里可以自行百度或谷歌进行下载。
下载完 Putty 之后我们打开 Putty 进行链接
按顺序输入
1.NAS 的内网 IP(我的是 192.168.1.10,请务必替换为自己的 NAS 内网 IP)
2.在 NAS 控制面板开启 SSH 时候显示的端口(默认都是 22)
3.确保连接模式调整为SSH
4.链接!



控制台显示
login as:
这时需要输入你群辉 admin 账号的名称(一般应该是 admin)
login as:admin
回车之后出现
admin@192.168.1.10's password:
这时请输入 admin 账号的密码,注意这里密码是不会显示的,因此请小心输入
当提示
admin@你的NAS主机名称:~$
即代表已成功登录 admin 账号

登录成功之后输入
sudo -i
这里会再次提示输入密码,这里继续使用刚才的 admin 密码即可。 密码正确之后显示如下

此时接着输入
synouser --setpw root 密码
这里的密码建议与之前的 admin 密码相同即可,避免后续搞混。(记得回车执行命令,确保命令正确执行!)

DSM 版本 6.2 以上需要的额外操作
这里我们不用教程贴作者的做法,因为直接通过命令行界面去编辑文件对于不熟悉 Linux 的朋友可能会造成误操作。(比如说我当时就因为误操作导致差点无法恢复 SSH 服务!)
我们需要回到群辉 NAS 的套件中心找到Perl插件并安装

安装 Perl 之后我们还需要安装 ConfigFileEditor-noarch-16.spk
ConfigFileEditor-noarch-16.spk 的下载链接可以在前面的教程文章底部找到。
由于微信公众号无法直接上传文件 ,因此我也上传了一份至我的阿里云 OSS ,可以复制此链接至浏览器进行下载https://kevinshicn.oss-cn-shenzhen.aliyuncs.com/zhouji/05/ConfigFileEditor-noarch-16.spk
下载完成之后请在 NAS 的套件中心点击手动安装进行安装

安装完毕之后在套件中心找到 Config File Editor 并打开

随后选中 sshd 配置文件

之后找到
#PermitRootLogin prohibit-password
将其替换为
PermitRootLogin yes


保存之后重启 NAS 即可
错误的修改 sudoers 造成 sudo -i 命令报错
我参考的教程帖子底下有部分用户出现这样的问题,这是因为之前根据其他教程不小心改了 sudoers导致的。解决方法我这里不再阐述,请直接参考下图进行修改(看不清的话请去底部翻文章的参考引用[6]

安装 pip
重新通过 SSH 登录服务器
此时我们打开 Putty 输入相同的地址与端口链接,此时记得使用 root 账号以及前面设置的密码进行登录。

随后输入
sudo su
回车后输入
wget https://bootstrap.pypa.io/get-pip.py
即可开始从 bootstrap.pypa.io 网站下载 get-pip.py

这时候的下载速度可能会非常慢,因为服务器在国外。我是通过将get-pip.py文件放到自己的服务器之后进行下载的,这里我把我的OSS 链接分享出来供大家下载。
wget https://kevinshicn.oss-cn-shenzhen.aliyuncs.com/zhouji/05/get-pip.py
之后通过
python3 get-pip.py -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
指令来安装 pip,这里安装成功后显示如下(注意这里我直接使用的豆瓣镜像,因为国内用户直接执行 get-pip.py 下载会异常缓慢。如遇问题请改用下面这个原版指令通过 pip 默认服务器安装!
python3 get-pip.py

通过 pip 安装 wakeonlan
我当时在成功安装 pip 之后遇到了大坑,这个问题应该是由于环境变量导致的,因此这里我将用我自己的方法来优化接下来的步骤。
按照原文我们是需要通过下面指令直接安装 wakeonlan 包的
pip3 install wakeonlan
然而回车执行之后我这里弹出了 pip 指令未找到的提示

这个问题当时困扰了我很久,最后我找到的解决办法是在不更改环境变量的前提条件下,直接跑到pip的目录进行调用,于是我需要先找到pip在哪里。这里我们输入
find / -name pip
我这里返回了结果如下
ash-4.3# find / -name pip
/tmp/pip-uninstall-yl447hvl/pip
其中
/tmp/pip-uninstall-yl447hvl/pip
就是我们需要访问的 pip 路径
然后我们改一下上面的命令
从
pip3 install wakeonlan
修改为
/tmp/pip-uninstall-yl447hvl/pip install wakeonlan -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
回车之后进行 wakeonlan 的安装(同样这里我直接把豆瓣的镜像源带上了,不然直接执行的网速还是非常的慢),这边可以看到 pip 正常执行了,wakeonlan 的安装也正常在运行了。
随后我们用同样的方法确定 wakeonlan 的路径
find / -name wakeonlan
返回结果
ash-4.3# find / -name wakeonlan
/volume1/@appstore/py3k/usr/local/bin/wakeonlan
就是我们的 wakeonlan 路径!!
此时证明我们的 wakeonlan 安装成功!
通过 ssh 发送指令执行唤醒
此时我们用不同的设备(手机、平板以及另一台电脑等)通过 SSH 发送以下指令就可以唤醒我们指定的设备了
/volume1/@appstore/py3k/usr/local/bin/wakeonlan 需要被唤醒设备的MAC地址
将唤醒指令添加进群辉 NAS 的任务计划功能(备用选项)
此时我们已经可以通过 SSH 链接群辉 NAS 进行局域网设备唤醒了,但不排除有时我们的 SSH 链接不稳定。那么这就需要我们通过群辉的控制台进行指令的发送。
找到群辉控制面板的计划任务
添加计划任务

务必按图设置任务的计划

任务设置
这里我们输入前面测试成功的唤醒指令,至于邮件提醒功能是可有可无的。
/volume1/@appstore/py3k/usr/local/bin/wakeonlan 需要被唤醒设备的MAC地址

点击确定即可完成任务的添加,随后从控制台右键即可运行唤醒本地设备

通过 IOS 快捷命令语音唤醒设备(装逼选项)
参考的文章同时给出了另一种很好玩的做法那就是通过IOS的快捷命令连接SSH后发送命令来进行唤醒。
设置过程非常简单,只需要找到通过SSH运行脚本这个快捷指令即可,设置方法如下
主机设置为你的公网 IP 或域名
端口设置为对应的 SSH 端口
用户设置为 root
密码设置为 root 对应密码
输入设置为前面测试可以用的唤醒代码
/volume1/@appstore/py3k/usr/local/bin/wakeonlan 需要被唤醒设备的MAC地址

之后就可以愉快的通过 siri 唤醒电脑了!
本周总结
可能写的太过于详细了
一篇这么简单的教程写下来篇幅达到了接近 4500 个字,我仍然认为这对读者以及对于作者(我)来说都并不是最完美的展现方式,下一篇技术类周记我将用更简洁的方法来写文章,并尽量保证技术基础低的读者理解并实现目标!
推荐阅读
- 周记 2021-01-周记项目正式启动
- 周记 2021-02-我是如何 43 天内拿下 PMP 证书的
- 周记 2021-03-书籍分享《重新定义团队:谷歌如何工作》(1-3 章)
- 周记 2021-04-书籍分享《重新定义团队:谷歌如何工作》(第 4 章)
---
欢迎关注我的公众号“凯文有事找你”,原创技术、生活、经验教训文章第一时间推送。
<center> <img src="https://kevinshicn.oss-cn-shenzhen.aliyuncs.com/zhouji/04/%E5%85%AC%E4%BC%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81.png?x-oss-process=style/Interlace" style="width: 100px;"> </center>