用 iPhone 一键重启、关闭电脑,只要有了这个快捷指令就能搞定

Cocoa开发者社区

共 3507字,需浏览 8分钟

 · 2021-08-13

在生活中的一些场景,可能需要使用 iPhone 控制 Mac 的电源。例如在上床后,需要关闭电脑电源,或者是使电脑熄灭屏幕。其实,在少数派上早有文章可以实现这些功能,但是配置较为复杂。例如下面的这两篇文章。
但是本文仅使用捷径,就可以很简单地实现这些功能。接下来就随着文章,来看看如何使用捷径,控制电脑执行重启、注销和关机等操作。读完本文后,可以学到以下知识点:
  1. 如何开启远程登录 Mac

  2. 捷径 SSH 模块的使用

  3. SSH 公钥的使用方法

  4. RSA 加密的实际运用

Mac 配置

为了实现局域网内的控制,首先需要开启 macOS 的 ssh 访问功能。前往「系统偏好设置」>「共享」,勾选「远程登录」,打开 ssh 远程登录功能。
点击上方的「编辑...」,编辑局域网内电脑的名称,例如此处的 james,最后点击「好」保存设置。
此时,如果要在局域网内访问电脑,只需要访问 james.local 即可。这样做的好处是,即使电脑切换到其他网络下,Mac 在局域网内 IP 地址发生改变,也依旧可以通过主机名访问。
最后,可以通过 ssh 命令确认开启状态。打开终端,输入「ssh 主机名」连接本机,例如图中的「ssh james.local」,如果正常就会询问密钥指纹是否正确。反之,如果 ssh 服务没有正常工作,就会像第二条命令一样显示「Connection refused」。

捷径构建

接下来,就要使用构建捷径来实现功能。新建捷径,搜索 ssh 模块,选择「通过 SSH 运行脚本」添加模块,可以看到该模块要求输入以下参数:主机、用户、认证方式、密码和命令。
在上一步,已经设置好的主机名即为主机参数。用户和密码对应着电脑的用户密码,不必多说。最重要的是该执行什么命令。所以特在此整理了一份命令速查表,读者可以根据需要复制相应的命令。

关机

shutdown -h now
重启shutdown -r now
常亮pmset noidle
电脑休眠pmset sleepnow
屏幕休眠pmset displaysleepnow
唤醒电脑wakeonlan 网卡地址
这个表格有两个地方需要补充说明,首先是「唤醒电脑」功能。该功能需要在局域网内有一台其他设备,例如树莓派。捷径实际上是发送 wakeonlan 给树莓派。树莓派再通过 WOL 协议唤醒 Mac,而不是直接将命令发给 Mac,这一点请切记。
其次,还要注意的是 shutdown 命令属于系统级命令,需要超级用户权限才能执行。如果在终端里直接执行该命令,会有如下的报错,而且也无法关闭电脑。因为目前登录的是用户,而不是超级用户。
为了能够正常执行该命令,需要在前面加上 sudo,以此表示使用超级用户权限执行命令。
在命令前面添加 sudo 之后,会要求输入用户的密码进行确认,密码输入正确之后即可关机。但是这时候要注意到一个问题,捷径是没有办法与电脑交互的,更别提输入密码了。sudo 命令的作者 Robert Coggeshall 显然也考虑到了这个问题,所以提供了一个 -S 的参数,该参数可以接收管道传来的字符串,作为密码进行确认,无需手动输入密码。
所以加上 -S 参数后的关机命令是如下,此处的「密码」需要更换成读者的电脑密码。

echo 密码|sudo -S shutdown -h now

命令构建完成之后,就可以开始填写捷径参数了。如下图所示,可以看出用户名是 james,密码是 123456(当然是假的了)。保存该捷径,命名为关机,通过喊一句「heySiri, 关机」即可关闭电脑电源。当然,这里的关机只是一个演示功能,对于 macOS 用户来说,更常见的电源操作应该是:pmset sleepnow(电脑休眠)。
但是细心的读者可能也注意到了,此处的密码是明文保存,非常不安全。此处需要特别说明的是,密码区域的 123456 之所以是明文,这是因为作者使用的是 iOS 15 测试版,在 iOS 14 上它应该是 6 个小黑点。但是即使是这样,命令区域输入的密码依旧是不安全的明文,安全性有待提高。所以在实现基本功能之后,就可以来完善它的安全性了。

更换密钥验证

在上一步,作者使用密码作为验证访问 Mac。但是这样做,轻则暴露密码长度,重则直接暴露密码,所以可以考虑使用密钥验证。点击「认证」选择「SSH 密钥」,捷径就会生成 SSH 密钥以供使用。
从上图右边可以看出,这个密钥的类型是 ed25519。如果想要其他类型的密钥,可以点击下面的「生成新密钥」进行选择,作者在此处选择了 2048 位的 RSA 密钥。读者可以根据自己的偏好选择,无论是 ed25519 还是 RSA 方法都是一样的。
生成 SSH 密钥后,就要在电脑上配置密钥。点击「共享公共密钥」,将密钥文本导出,将密钥发送到电脑上。
通过 Finder 的快捷键 shift+command+G,前往 ~/.ssh 文件夹。
新建名为 authorized_keys 的文件,粘贴密钥,将文件保存到 ~/.ssh 路径之下。这样配置之后,就可以无需密码,直接通过公钥访问 Mac。此处的图形界面操作是为新手考虑而写,有 命令行基础的用户,请直接使用下面这条命令追加公钥。 
pbpaste >> ~/.ssh/authorized_keys

密码加密传输

在解决完了密钥验证问题之后,还剩下命令里的明文密码要解决。这时候可以请出大名鼎鼎的 RSA 非对称加密算法了。非对称加密需要公钥,私钥一对。顾名思义,公钥是可以公开传播的,而私钥就是要私藏好的。公钥可以用于加密,却无法解密,只有使用私钥才可以解密。所以只要妥善保管私钥,那么整个加密体系就是安全的。
接下来,就来看看 RSA 加密的实际应用。首先需要生成一对公私钥,它将被用以加解密文本,命令如下:
# 生成私钥
openssl genrsa -out ~/.ssh/PrivateKey.pem 2048

# 生成公钥
openssl rsa -in ~/.ssh/PrivateKey.pem -pubout > ~/.ssh/PublicKey.pub
将密码进行加密并编码,echo 后面跟随的内容即为密码,例如此处的 123456,请将此处的 123456 替换为读者自己的电脑密码。
但是可以看出,经过加密之后的 123456 变成了一串乱码,这是因为 RSA 加密的结果是二进制流,而非普通的可打印字符,那么这还怎么使用?这时候,就可以请出 base64 编码了,它可以将任何信息流都转换为特定字符集内的编码。 
此处的 O7O...Q== 即为密码加密编码之后的结果。如果需要验证是否正确,可以进行解密验证。可以看出,成功解密出了 123456 的密码明文。
接下来,只需要把原来命令里的 echo 123456 替换成加密后的 base64,即可实现密码的加密。替换之后的命令如下图所示。

该命令由 4 个小命令组成,由 |(管道符)进行连接。首先使用 echo 输出 base64 编码,通过 base64 -d 解码出二进制流,传递给 openssl 命令解密出明文。最后将明文作为参数,传递给 sudo 命令作为密码使用,执行立即关机的命令。

效果演示 

文章总结

本文以远程关机为例,教学如何使用捷径通过 SSH 对电脑电源进行操作。在作者的日常生活中,其实更多的是配合其他模块共同使用,作者的捷径里有一个名为「离开模式」的捷径,它的功能是关闭屏幕挂灯和电脑休眠。在作者需要出门的时候,手上在整理出门要带的东西,嘴上就可以直接喊:「heySiri,离开模式」。东西收拾好之后,也就可以直接离开了,免去了手动休眠和关闭挂灯的步骤。当然这还是比较简化的描述,以后可能会专门在写一篇文章,来介绍这个捷径的制作过程。
另外,SSH 能够做到的绝不止本文所提的电源控制,还可以是音量的加减,打开网页,打开软件等。本文以电源控制为例,只是举了一个常用的场景。本文抛砖引玉,希望读者能够结合自己的生活场景举一反三,做出一些更适合自己的捷径。




浏览 77
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报