Matrix 首页推荐

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。

文章代表作者个人观点,少数派仅对标题和排版略作修改。


前言

在生活中的一些场景,可能需要使用 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 替换为读者自己的电脑密码。

➜ echo 123456|openssl rsautl -encrypt -pubin -inkey ~/.ssh/PublicKey.pub
y��ڊ��_���Ɲ�Ea�� P�h�6��>"C�傣�E�!�+���
                                       ��[�B�����7��'3�P�        u#D*�
&���A߶�7ږ���Y߇{�^}�I�8*��ft�뱱ރ�z��+��v=ജK�2������i� ���VFש�

 

但是可以看出,经过加密之后的 123456 变成了一串乱码,这是因为 RSA 加密的结果是二进制流,而非普通的可打印字符,那么这还怎么使用?这时候,就可以请出 base64 编码了,它可以将任何信息流都转换为特定字符集内的编码。

➜ echo 123456|openssl rsautl -encrypt -pubin -inkey ~/.ssh/PublicKey.pub|base64
O7O6emCBxJ6jG0elhtnFjHwTkRl8mofO+UkfRFzcL5casGTwYAIM2sC1grXlMkyL21lT6OkAtOEC
l9hHHbshfgZHrMRFlCvOp0C3NdiQga50Jau14Hx6oNcahxtXLoS8x1dH5sPpypLVOBFk1OaJ9daF
HWGX/eI7S6GBCOguOd0fuzimI66dUXcQFmOvH8Ou2veoF3LrjSffE2lLCQCt7k3/YCznonsUu6lv
DS+E9G4cSSrXQrcf/HsITsWLa3TpwF/iLL3Uh1NaOY9M998vhB/u/DTwi8OJf7ygXVu9YdIthe4n
0t/ACABYRf9yOGG1vnT8LXqvPFFHVynGAbwP2Q==

 

此处的 O7O...Q== 即为密码加密编码之后的结果。如果需要验证是否正确,可以进行解密验证。可以看出,成功解密出了 123456 的密码明文。

➜ echo 'O7O6emCBxJ6jG0elhtnFjHwTkRl8mofO+UkfRFzcL5casGTwYAIM2sC1grXlMkyL21lT6OkAtOEC
l9hHHbshfgZHrMRFlCvOp0C3NdiQga50Jau14Hx6oNcahxtXLoS8x1dH5sPpypLVOBFk1OaJ9daF
HWGX/eI7S6GBCOguOd0fuzimI66dUXcQFmOvH8Ou2veoF3LrjSffE2lLCQCt7k3/YCznonsUu6lv
DS+E9G4cSSrXQrcf/HsITsWLa3TpwF/iLL3Uh1NaOY9M998vhB/u/DTwi8OJf7ygXVu9YdIthe4n
0t/ACABYRf9yOGG1vnT8LXqvPFFHVynGAbwP2Q=='|base64 -d|openssl rsautl -decrypt -inkey ~/.ssh/PrivateKey.pem
123456

接下来,只需要把原来命令里的 echo 123456 替换成加密后的 base64,即可实现密码的加密。替换之后的命令如下所示。

echo 'THdWo9IwCBLk65DPWZ8ZnC8+8eoogVcWAlUcViSM3DwKftC2L5KhZ5yBkN5EKIhNt0ogEsZxD+zF
tSiiHNQfA0FjLME/HxOtvLlObmjH6Xkhztkc+Q2Fm+f3FbhIP5YiK2hnWGD+8kNDIYrqhVy0NeRH
8L8ga36YwQbj/jVoy6H66qPbKy+/9DyGNVKUbrKpEoNrj5MULUL8h+e3bY7NM5JhYNvN3OVkmUn4
IfRsn8mXQjgfftksL0fmNq52O/4bsTjDFaxuVfC9np7u4F9ujWMYnefiUDxdwGTb0yCR6+8uoJsb
HVSNwSNUB80OcdJv5AITYCpX9Eifz9GHb/kiXA=='|base64 -d|openssl rsautl -decrypt -inkey ~/.ssh/PrivateKey.pem |sudo -S shutdown -r now

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

效果演示

 

文章总结

本文以远程关机为例,教学如何使用捷径通过 SSH 对电脑电源进行操作。在作者的日常生活中,其实更多的是配合其他模块共同使用,作者的捷径里有一个名为「离开模式」的捷径,它的功能是关闭屏幕挂灯和电脑休眠。在作者需要出门的时候,手上在整理出门要带的东西,嘴上就可以直接喊:「heySiri,离开模式」。东西收拾好之后,也就可以直接离开了,免去了手动休眠和关闭挂灯的步骤。当然这还是比较简化的描述,以后可能会专门在写一篇文章,来介绍这个捷径的制作过程。

另外,SSH 能够做到的绝不止本文所提的电源控制,还可以是音量的加减,打开网页,打开软件等。本文以电源控制为例,只是举了一个常用的场景。本文抛砖引玉,希望读者能够结合自己的生活场景举一反三,做出一些更适合自己的捷径。

关联阅读

通过 pmset 工具管理 masOS 睡眠,让你的 Mac 睡得更好

Mac 上隐藏了许多实用的功能,只有这样才能打开

歪用 HomeKit 让 Siri 更「听话」

> 下载少数派 客户端 、关注 少数派公众号 ,了解更妙的数字生活 🍃

> 想申请成为少数派作者?冲!