使用 WinSCP 脚本来部署 Hexo 博客

Author Avatar
Equim 2017年2月18日
  • 在其它设备中阅读本文章
Read: 5 minWords: 1,435Last Updated: 17-12-25Written in: MarkdownLicense: CC-BY-NC-4.0

部署 Hexo 博客的方法有很多种,比较常见的是通过 git。
然而 git 还是很麻烦,用 SCP/SFTP 不好吗,又便捷又安全,也不需要额外装什么东西(只要远程端开启了 sshd 就行),也比 git 更直接。
目前我还没找到 SCP/SFTP 对应的 hexo-deploy 插件,于是打算不依靠 hexo deploy,直接自己动手写一个脚本。

Windows 下的 SCP/SFTP 的客户端有 pscpWinSCP 等,这里选用 WinSCP,因为它相比前者支持文件夹同步,会更方便些(前者甚至无法递归删除文件夹)。

已经对 SCP 比较了解的可以直接看脚本操作

手动操作

首先我们尝试手动操作。打开命令行并切换到WinSCP的目录,目录下应该至少有WinSCP.exe和WinSCP.com这两个文件。
输入winscp进入它的CLI,然后输入help看一下帮助:

winscp> help
call     执行任意远程命令
cd       改变远程工作目录
checksum 计算远端文件的校验码
chmod    改变远程文件权限
close    关闭会话
echo     将参数显示为消息
exit     关闭所有会话并结束程序
get      从远程目录下载文件到本地目录
help     显示帮助
keepuptodate 在一个远程目录连续反映本地目录的改变
lcd      改变本地工作目录
lls      列出本地目录的内容
ln       新建远程符号链接
lpwd     显示本地工作目录
ls       列出远程目录的内容
mkdir    新建远程目录
mv       移动或者重命名远程文件
open     连接到服务器
option   设置或显示脚本选项的值
put      从本地目录上传文件到远程目录
pwd      显示远程工作目录
rm       删除远程文件
rmdir    删除远程目录
session  列出连接的会话或者选择活动会话
stat     获取远程文件属性
synchronize 用一个本地目录同步远程目录

功能挺多的,不过对于同步博客来说,用open, synchronize, exit这三个足矣。

接着用open打开一个 SFTP 会话,语法为

open sftp://username@hostname:port/

如果你要使用 SCP 协议,把sftp换成scp即可,但是这里我推荐用 SFTP,因为 SFTP 中目录和文件名是 UTF-8 编码,可以保证中文不会出现问题,而 SCP 就不一定了。
如果没有禁用密码登录,接下来应该会让你输入密码。如果禁用了密码要使用SSH私钥的话,可以加上参数-privatekey,即

open sftp://username@hostname:port/ -privatekey="\path\to\privatekey.ppk"

这里的密钥最好是 ppk 格式,因为 ppk 格式的 ssh 密钥同时包含了公钥、私钥等信息(OpenSSH 是分为两个文件,公钥私钥各一个),而如果远程端开启了公钥验证的话还需要提供对应的公钥才行。OpenSSH 的密钥可以通过puTTygen这个工具来转换为 ppk 格式。
以上这些,如果你是用 puTTy 作为 ssh 客户端的话应该很熟悉。

登录之后,你会进入远程目录,可以输入pwd命令来看看自己当前的工作目录。然后cdls之类命令的都和shell里的差不多。
这时候我们就可以使用synchronize命令来进行同步工作了,简单来说只要一句:

synchronize remote "\local\path\to\public" /remote/path/to/public -delete

注意路径最好是绝对路径。
第一个参数是remote的时候,本地是主动的,远程是被动的,也就是远程目录会以本地目录为准进行同步。
后面的-delete参数可以让远程端删除与本地不匹配的文件,从而保证远程目录和本地目录完全相同。当然,加了这个参数也就意味着你的远程路径千万不能错,一定要再三确认。
关于synchronize可以查阅官方文档

测试一遍没问题之后,用exit退出当前会话。

到这里同步应该是没什么问题了,但是每次操作都要输入这么多语句也容易错。不过好在 WinSCP 的 CLI 提供了/script=这个参数,利用这个参数我们就可以把这些会话内的脚本写到一个脚本文件里,再直接通过winscp /script=xxx.bat来执行。
更多有关winscp的参数说明可以通过winscp /?查阅

脚本操作

首先要将 WinSCP 的路径添加到 PATH 环境变量,或者想省事的话直接把 WinSCP.com 和 WinSCP.exe 移动到博客目录下也行(注意两个都要移过去),这里就不赘述了。
在博客目录下新建一个depl_winscp_batch.bat文件,作为传给 WinSCP 的 script

open sftp://username@hostname:port/ -privatekey="path\to\your\privatekey.ppk"
synchronize remote "\local\path\to\public" /remote/path/to/public -delete
exit

根据自己的情况修改参数。还是那句话,最好填绝对路径而且一定要确认无误。

然后再新建一个depl.bat文件来封装winscp /script=xxx这个操作。这里为了方便,顺便把hexo g这些也封装了进来

@echo off
call hexo clean --silent
call hexo g --silent
winscp /script=depl_winscp_batch.bat

稍微提一下为什么前两句要加上call。这是因为全局安装的 hexo-cli 提供的hexo本身就是一个 cmd 文件,如果不加call的话,在执行到这个命令的时候控制权会转到这个 cmd 上,在这个 cmd 执行完退出后就直接把整个 bat 都退出了。而加上call之后可以让这个 cmd 在执行完后将控制权交回。

最后,需要部署的时候只要一句depl就行了。

知识共享许可协议
本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

本文链接:https://ekyu.moe/article/deploy-hexo-blog-using-winscp-cli-script/