这次研究的课题是用iOS快捷指令通过ssh执行远程服务器上的操作,如果你没有服务器也没有iOS设备,那么你可以图一乐。
起因
最近工作忙/天冷/吃饱了撑的,导致睡眠不怎么规律,昨天下班到家就睡着了,结果8点多醒了,这就导致了半夜睡不太着觉。突然想起博客年久失修,生活博客半年没更,技术博客半年内倒是更了两个,但都是写了标题没写多少内容。不玩lol了之后是越来越懒得动电脑,家里的台式机也就是在吃饭的时候才打开20分钟用B站下饭。由于博客使用hexo搭建,不开电脑的话更新的几率就很小。所以我就想,我能不能在手机上写博客,再用一种快捷的方式推送到服务器上?
之前的操作
对于技术博客,通常就是学习到了新东西或者有一些阿妹子嘤的新发现,趁着兴奋劲在电脑上就写了;对于另一个生活博客,通常是在手机上用zine写完,再等有空(划水)的时候在电脑上同步一下。
对于hexo,通常是用
1
hexonewpostname
创建一个markdown文件,写好内容后使用
12
hexocleanhexog
生成静态页,再复制到nginx配置中对应的网站目录,这一番操作过后,新的创作就对外显示了。
由于这一番操作太复杂,我还搭建了jenkins,配合git来了一波自动部署。这样每次写完内容,只需要push到git上,就可以等待jenkins帮我把后续工作处理好了。这一番操作被我记录在了搭建jenkins配合gitee实现自动部署里。
新的想法
我可以不可以在手机上编写好内容,然后通过app的分享,把内容分享给iOS的快捷指令,然后拜托快捷指令帮我把内容上传到服务器,顺便同步到git,再自动部署呢?
打开快捷指令app,发现是有ssh功能的
这样思路基本就清晰了
用app分享文件给快捷指令
通过ssh传到服务器
服务器把文件内容保存下来
从git下载仓库
用yarn安装hexo
把博文内容移动到hexo目录下
构建hexo
复制hexo静态文件到网站目录
输出成功
开始实操接受来自分享的数据
在快捷指令的设置里,可以设置当前快捷指令接受哪些消息,顺便我们用“显示结果”把获取到的内容显示出来以供调试。
需要注意的是,显示结果时需要选择“作为文件”。
打开备忘录,随便分享一个文件进来,可以看到快捷指令已经接收到了分享过来的备忘录,并显示了内容。
选择仓库
由于有两个博客,所以每次推送的时候需要手动选择要推送的博客。这里用到了快捷指令的列表和从列表选取的功能。
增加了这一步骤,顺便我们让它们一起展示出来。
编码传输
在实际操作过程中,我发现如果是用简单的echomarkdown_contentmarkdown_file.md的方式来保存文件内容是不可行的,原因有二:
echo内容的时候会被markdown里不可预料的字符截断。
使用echo的话还需要处理换行等特殊字符。
可能还有其他麻烦事我没遇到,仅仅是这两个麻烦的问题就够我麻烦半天了。在友人Hermit的建议下,我决定使用base64传输博文数据。这样就算是换行都能处理在里边了。
可以看到,原文里不管是有换行还是特殊符号,一律转码成奇怪的人类看不懂的字符了。这边转成了base64,就肯定要在某个地方转换回来。我们只有指望服务器那边的shell能解码了。由于博客是在完成了之后才写的,所以我知道shell肯定能解码。
快捷指令连接服务器
在连接服务器的时候我们有两个选择,一个是用密码连接,一个是用SSH密钥连接。
由于我在电脑上一直是用SSH连接,所以这次也直接就想到用SSH连接了。生成密钥-上传到服务器一气呵成之后,出现了一个奇怪的问题。在快捷指令app里直接点击快捷指令运行时可以用SSH连接到服务器,脚本也都正常运行,也能正常输出结果,但是通过分享触发快捷指令时,服务器就会连接失败。调试了很多次之后放弃了SSH连接,改为密码登录了。
本来后续的文件处理、构建、同步git等操作都准备在快捷指令写的,转念一想,好像操作挺多的。决定在服务器上写个脚本执行后续操作,快捷指令只负责传值就好了。
在这一步,我们只需要把这几个参数
博客名
文件名
博文内容(base64)
传过去就可以了。
编写脚本
由于之前没怎么写过shell脚本,这一步可是费了好大的劲。但写博客就简单了,我直接复制过来就可以了。注释写得很全,就不多写别的了。
#文件名,用在hexonew{filename}postname="$3.md"#分类blog_techblog_lifecategory=$1#博客内容content=$2echo文件名是echo$postnameecho分类是echo$categoryecho内容长度echo${#content}#写入本地文件echo$content
base64-d$postnameecho写入本地文件成功#上传到gitrm-rfblog_$categorygitclone-b$categorygit
gitee.