有时候电脑还挂着,但是人已经躺在床上了。这时候,作为一个懒人,当然不能自己下床去点一下关机了,更何况,如果是在凛冽寒风的冬天,宁可让电脑一直运行也都不会去关掉它了。
那么就尝试使用手机让电脑关机吧!
经常使用捷径的我,第一个想到的就是iOS 原生的捷径了,可以方便的喊一声Siri 就执行,而且配合自动化,以后还可以实现一些花里胡哨的操作。
所幸捷径中有一个运行SSH 脚本的操作。那么关机的时候,就需要使用命令行的方式来关机。装双系统(Win10 和黑苹果)的我,还要考虑如何使用命令行识别当前运行的是哪个系统的问题。
Win10 下命令行的关机操作
这个比较方便,稍微搜索一下就可以得到:shutdown /s /t 0
黑苹果下命令行的关机操作
macOS 使用终端关机的命令同样是shutdown
,不过应该换成shutdown -h now
。而且还有一点要注意的是macOS 下的shutdown 命令是需要管理员权限的,也即是sudo shutdown -h now
。这个在terminal 中输入,并输入密码之后就会执行关机操作。但是如果放在捷径中,是没有办法输入密码的。好在sudo
命令提供了一个-S
的选项,可以从基本输入读取密码。因此,最终的命令就改为了echo password | sudo -S shutdown -h now
。
-S, --stdin Write the prompt to the standard error and read the password from the standard input instead of using the terminal device.
区分不同的操作系统
macOS 和Windows 使用的是不同的shell,命令都不同,如何使用同一条命令区分不同的操作系统呢?
一开始想到的是使用neofetch ,同样都打印出系统的基本信息,然后做区分,但是想到macOS 下使用的是grep,Windows 下使用的findstr 。这个又成了一个难点。而且,当我在Windows 下安装neofetch 之后,发现使用捷径的SSH 运行neofetch 并不容易,而且要使用同一条命令运行两个操作系统的neofetch 也并不容易,原因时安装位置不同且Windows 下的sshd 的默认shell 是cmd,也不想去改了(主要还是PowerShell 不熟吧)。
就在这时候,我想到了环境变量的方法,只要在两个操作系统中都配置相同的环境变量名,不同的值就可以实现区分不同的操作系统了,而且对于echo
这条命令,不管是zsh 还是cmd 都可以识别。
三种shell打印环境变量
- cmd:
echo %name%
- PowerShell:
$env:name
- zsh:
echo $name
可以看出,cmd 和zsh 打印环境变量的命令更相似,,而且Windows 下sshd 的默认shell 就是cmd,也省去了我修改的步骤。^^
而且,对于Windows 系统来说,本来就有一个系统环境变量:OS,对应的值为Windows_NT。只需要在.zshrc
文件中加入一行:export OS=Darwin
就可以了。就这样,我得出了一条区分不同系统的命令:echo $OS%OS%
。但是,在测试的过程中,我发现,对于Windows 下,捷径执行这条命令可以得到想要的输出,但是在macOS 下,执行后得到的输出却好像是文件类型?且获取不到想要的文本,见下图。
还好,影响不大,毕竟只要两个系统对于同一个命令都可以输出且输出不同就可以了,只要有个if,剩下的交给else 就行了。
SSH 登陆的用户和密码
对于密码,这个是比较简单的,只要设置同个登录密码即可。我是选择了使用SSH 密钥登录来隐藏密码。将iPhone 生成的公钥复制到各自的authorized_keys
文件中就好了。
macOS 下文件路径:~/.ssh/authorized_keys
Windows 下文件路径:C:/Volumes/Windows/Users/用户名/.ssh/authorized_keys
对于用户名,就需要稍稍修改下了。Windows 由于使用的是微软的账号登录,因此默认的用户名是邮箱的头几个字母,这与我macOS 下的登录用户名不同,需要修改。
右键Windows 徽标-计算机管理-本地用户和组-用户。找到自己的用户,右键重命名即可。
至此,就可以使用Siri 运行捷径实现两个系统的关机了。
隐藏macOS 命令行中的登录密码
在上面的功能都实现之后,好巧不巧,今天看到了少数派发的一篇文章,与我实现了同样的功能,于是才萌发了写这篇文章的想法。
在那篇文章中,实现的功能与我基本相同,不过他使用了非对称加密将命令行中sudo 需要的密码加密了,更加的安全。于是,我便参照实现并记录下来。非对称加密真是好东西~
- 首先使用openssl 工具在电脑端生成一对密钥:
openssl genrsa -out ~/.ssh/PrivateKey.pem
- 提取出其中的公钥:
openssl rsa -in ~/.ssh/PrivateKey.pem -out ~/.ssh/PublicKey.pem -pubout
- 使用公钥加密sudo 密码并使用base64 编码成字符:
echo password | openssl rsautl -encrypt -inkey ~/.ssh/PublicKey.pem -pubin | base64
- 在捷径中使macOS 关机的命令:
echo base64_decoded | base64 -D | openssl rsautl -decrypt -inkey ~/.ssh/PrivateKey.pem | sudo -S shutdown -h now
- 以上第三步需要使用base64 编码的原因:公钥加密后的密文是字节流,不便传输
- 第四步中四个命令依次为:打印密文、base64 解码、私钥解密、关机
参考文献: