通过rsync一键同步博客静态文件

背景

每次更新完资源后都要手动把静态文件拉到服务器,持续这个操作两年后开始感觉繁琐了。

方案

  1. svn hook:服务端做一个webhook,webhook收到svn的通知事件时在服务器执行一次svn checkout。这个方案相对复杂,而且需要配合svn做一个webhook,不想折腾。
  2. 上传单页:逻辑不复杂,要做一个小应用,还是不想折腾。
  3. rsync:这是最近听说的一个shell工具,只需要写一个shell脚本,简单靠谱,比较理想的方案。

解决

  1. rsync是通过ssh登录操作的,所以有一步交互式填密码,既然是懒人工具当然不能接受这个交互过程,sshpass恰好可以解决这个问题。

  2. 在windows安装cygwin,用于执行shell,安装时找到sshpass命令安装。

  3. 开始打码:

    #!/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/
作者
icy8
发布于
2022年11月4日
许可协议