关于本周

KevinShiCN · 文章

关于本周

插播一篇技术周记

连续更新了两篇读书笔记加起来有一万两千字,本想轻量化完成周记任务的我整个人都不好了。于是决定这一篇周记改为技术周记,主要讲述我是如何不花一分钱解决在外唤醒家中休眠电脑问题的!!(令我没想到的是这篇周记写完之后也达到了 4600 字!

研究远程唤醒的起因

我前段时间重装了一遍电脑系统,之后有一天在公司想远程家里电脑的时候发现由于忘记设置电源管理配置导致电脑进入休眠了,于是当时就想如何把这个问题优化一下。

向日葵是一个很好用的远程软件,可是他们的 WOL 棒子卖的太黑了168 ~ 198元),我肯定是不会花这么多钱买一个专门用来开机的硬件的,对于我来说买这个都不如买树莓派。(当然,对于没有技术基础的用户来说,买一个向日葵的开机棒确实是满足远程唤醒唯一的选项)。

因为我的 NAS全年通电的,因此通过 WOL 的方法可以在能耗和使用体验上面进行比较好的平衡,我最终决定将通过 NAS 作为桥梁来实现这个需求。

名词解释

这里我对一些英文缩写进行解释,至于后续文章中出现的 pipPython 以及 SSH 等词将不会做特殊解释,各位可以自行去我们的好伙伴百度 进行查询。

WOL - Wake On Lan 顾名思义,通过局域网唤醒

NAS - Network Attached Storage 学名叫做“网络附属存储”,我的理解就是一个硬盘巨大的电脑(我的 NAS 有 4 张 8T 的硬盘)。这款群辉的 NAS 我用了有 3 年了,质量一直很坚挺,所用到的功能越来越多(Aria2Aliddns 自动解析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

这里是路由器显示的WAN IP
这里是路由器显示的WAN IP

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

这里是你的IP地址
这里是你的IP地址

当你的WAN IPIP138显示的IP 地址相同时,那么恭喜你,你的 IP 已经是外网可访问状态了。

如果WAN IP显示与 IP138 查询结果不符,那么您现在还是电信的内网 IP。

申请公网 IP

申请公网 IP 非常简单,只需要联系电信客服(我是直接联系的附近电信师傅)提供身份证、姓名以及电话号码即可很快获取到公网 IP(我申请过两次,分别为一天和七天申请下来)。

自动解析域名至外网 IP(可选)

即使我们现在获取到了一个公网 IP,但家用的 IP 地址是非固定的,其一般会在 24-48 小时内被重新分配至一个不同的 IP 地址。

因此这里建议通过 NAS 进行自动域名解析,即在 IP 重新分配之后通过 阿里云API 自动重新解析域名至本地公网 IP这样可以保证仅需配置一次域名地址即可随意访问家里网络。

域名自动解析的方法我后续可能会更新作为一篇周记,但这是非常简单的一个流程。我是通过 Docer 安装chenhw2aliyun-ddns-cli包直接启用的域名自动解析,可以通过Dcoker项目chenhw2/aliyun-ddns-cli 进行配置。

具体教程可以参考通过群辉 docker+阿里云简单实现 DDNS

设置端口映射

由于我们的NAS没有直接暴露在公网IP,实际上这是需要通过路由器进行端口映射的。这里端口映射的方法我不做详细描述,各位请自行百度。

我们需要的内部端口分别为

22 - SSH 端口
5000 - 群辉 NAS 默认 HTTP 访问端口
5001 - 群辉 NAS 默认 HTTPS 访问端口

同时需要将局域网IP设置为NAS对应的IP

端口转发配置参考
端口转发配置参考

注意,这里在端口转发的时候如果已经设置内网端口为22了,那么后面在设置NASSSH端口时也务必设置为22!!

正式开始请再次确认确认

已获取公网 IP

已将公网 IP 自动解析至自己的域名(可选)

被唤醒的设备已开启 WOL 支持

开始设置 WOL

安装 Python3

群辉套件中心的Python3截图
群辉套件中心的Python3截图

我们首先需要在群辉的套件中心安装 Python3

允许使用 root 账号登录

接下来我们需要开启 root 账号权限,这里我参考了这篇文章。群晖 DSM 开启 ROOT 权限及 WinSCP 使用 ROOT 登录

DSM 开启 SSH

随后我们需要进入群辉的控制面板找到终端机和SNMP选项勾选启动Telnet功能以及启动SSH功能应用

开启SSH示意图
开启SSH示意图

获取 root 权限

开启 ROOT 账号和修改密码

开启群辉的 SSH 功能之后我们需要一个 SSH 工具,这里我用的是PUTTY这里可以自行百度或谷歌进行下载。

下载完 Putty 之后我们打开 Putty 进行链接

按顺序输入

1.NAS 的内网 IP(我的是 192.168.1.10请务必替换为自己的 NAS 内网 IP

2.在 NAS 控制面板开启 SSH 时候显示的端口(默认都是 22

3.确保连接模式调整为SSH

4.链接!

PUTTY链接设置示意图
PUTTY链接设置示意图
这里可能会有安全警告,点是即可
这里可能会有安全警告,点是即可
PUTTY成功链接服务器示意图
PUTTY成功链接服务器示意图

控制台显示

login as:

这时需要输入你群辉 admin 账号的名称(一般应该是 admin

login as:admin

回车之后出现

admin@192.168.1.10's password:

这时请输入 admin 账号的密码,注意这里密码是不会显示的,因此请小心输入

当提示

admin@你的NAS主机名称:~$

即代表已成功登录 admin 账号

登陆成功截图
登陆成功截图

登录成功之后输入

sudo -i

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

密码正确,已进入root账号权限
密码正确,已进入root账号权限

此时接着输入

synouser --setpw root 密码

这里的密码建议与之前的 admin 密码相同即可,避免后续搞混。记得回车执行命令,确保命令正确执行!

退出前界面应该长这样
退出前界面应该长这样

DSM 版本 6.2 以上需要的额外操作

这里我们不用教程贴作者的做法,因为直接通过命令行界面去编辑文件对于不熟悉 Linux 的朋友可能会造成误操作。(比如说我当时就因为误操作导致差点无法恢复 SSH 服务!)

我们需要回到群辉 NAS套件中心找到Perl插件并安装

Perl插件
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套件中心点击手动安装进行安装

手动安装ConfigFileEditor
手动安装ConfigFileEditor

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

找到Config File Editor
找到Config File Editor

随后选中 sshd 配置文件

选中sshd配置文件
选中sshd配置文件

之后找到

#PermitRootLogin prohibit-password

将其替换

PermitRootLogin yes
替换前
替换前
替换后
替换后

保存之后重启 NAS 即可

错误的修改 sudoers 造成 sudo -i 命令报错

我参考的教程帖子底下有部分用户出现这样的问题,这是因为之前根据其他教程不小心改了 sudoers导致的。解决方法我这里不再阐述,请直接参考下图进行修改(看不清的话请去底部翻文章的参考引用[6]

修复sudoers步骤
修复sudoers步骤

安装 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
显示Successfully installed pip-21.0.1代表pip安装成功
显示Successfully installed pip-21.0.1代表pip安装成功

通过 pip 安装 wakeonlan

我当时在成功安装 pip 之后遇到了大坑,这个问题应该是由于环境变量导致的,因此这里我将用我自己的方法来优化接下来的步骤。

按照原文我们是需要通过下面指令直接安装 wakeonlan 包的

pip3 install wakeonlan

然而回车执行之后我这里弹出了 pip 指令未找到的提示

未找到pip命令,哪怕换pip install也不行
未找到pip命令,哪怕换pip install也不行

这个问题当时困扰了我很久,最后我找到的解决办法在不更改环境变量的前提条件下,直接跑到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 链接不稳定。那么这就需要我们通过群辉的控制台进行指令的发送。

找到群辉控制面板的计划任务

添加计划任务

任务名称任意填写,用户账号记得选择root
任务名称任意填写,用户账号记得选择root

务必按图设置任务的计划

禁止任务自动执行
禁止任务自动执行

任务设置

这里我们输入前面测试成功的唤醒指令,至于邮件提醒功能是可有可无的。

/volume1/@appstore/py3k/usr/local/bin/wakeonlan 需要被唤醒设备的MAC地址
设置界面如下
设置界面如下

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

右键运行即可
右键运行即可

通过 IOS 快捷命令语音唤醒设备(装逼选项)

参考的文章同时给出了另一种很好玩的做法那就是通过IOS快捷命令连接SSH发送命令来进行唤醒。

设置过程非常简单,只需要找到通过SSH运行脚本这个快捷指令即可,设置方法如下

主机设置为你的公网 IP 或域名

端口设置为对应的 SSH 端口

用户设置为 root

密码设置为 root 对应密码

输入设置为前面测试可以用的唤醒代码

/volume1/@appstore/py3k/usr/local/bin/wakeonlan 需要被唤醒设备的MAC地址
IOS快捷指令设置
IOS快捷指令设置

之后就可以愉快的通过 siri 唤醒电脑了!

本周总结

可能写的太过于详细了

一篇这么简单的教程写下来篇幅达到了接近 4500 个字,我仍然认为这对读者以及对于作者(我)来说都并不是最完美的展现方式,下一篇技术类周记我将用更简洁的方法来写文章,并尽量保证技术基础低的读者理解并实现目标!

推荐阅读

---

欢迎关注我的公众号“凯文有事找你”,原创技术生活经验教训文章第一时间推送。

<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>