通过rsync一键同步博客静态文件
背景
每次更新完资源后都要手动把静态文件拉到服务器,持续这个操作两年后开始感觉繁琐了。
方案
- svn hook:服务端做一个webhook,webhook收到
svn
的通知事件时在服务器执行一次svn checkout
。这个方案相对复杂,而且需要配合svn做一个webhook,不想折腾。 - 上传单页:逻辑不复杂,要做一个小应用,还是不想折腾。
- rsync:这是最近听说的一个shell工具,只需要写一个shell脚本,简单靠谱,比较理想的方案。
解决
rsync是通过ssh登录操作的,所以有一步交互式填密码,既然是懒人工具当然不能接受这个交互过程,
sshpass
恰好可以解决这个问题。在windows安装
cygwin
,用于执行shell,安装时找到sshpass
命令安装。开始打码:
#!/bin/bash ### 静态文件发布 # sshPwd="" # 远程服务器的ssh密码 # remoteDir="/www/wwwroot/blog/" # 需要上传的目标远程目录 # currentDir=$(pwd) # 当前目录 # localDir="./public/" # 需要上传的源目录 # sshHost="root@255.255.255.255" # 服务器ssh信息root是用户名 # owner="www" # 目录的所有者 因为rsync上传的文件所有者都会莫名地赋予一堆数字。 # 载入配置 . ./config.sh # 配置信息最好是写在一个独立的文件 # 开始 # hexo编译 hexo clean hexo g if [[ ! -d $localDir ]] then echo "目录不存在" exit elif [[ -z "$remoteDir" || -z "$sshHost" || -z "$sshPwd" ]] then echo "配置异常" exit fi echo "clean ${remoteDir}" echo # 先清空远程目录,危险操作,按个需开启 # sshpass -p ${sshPwd} ssh ${sshHost} rm -rf ${remoteDir}/* echo "upload ${localDir} -> ${remoteDir}" # 将本地文件上传到远程目录 localDir 一定要/结尾 sshpass -p ${sshPwd} rsync -av --chmod=777 ${localDir}/ ${sshHost}:${remoteDir} if [ -n $owner ] then echo "chown -R ${owner} ${remoteDir}" # 修改目录所有者 sshpass -p ${sshPwd} ssh ${sshHost} chown -Rf ${owner} ${remoteDir} fi echo "complete "
其他操作
因为每次打开cygwin
都要cd
到博客目录执行发布脚本
,比较麻烦。这时候可以用chere
工具实现右键从当前目录打开cygwin
,如果没有这个命令可以再执行一下setup.exe
安装文件,选chere
安装,然后执行:
chere -i -t mintty
右键找到Bash prompt here
菜单项打开即可。
通过rsync一键同步博客静态文件
http://blog.icy8.cn/posts/14762/