假如你正在运作一个静态网页,大部分情况下,为了保持服务器的环境轻便,会选择本地(以Windows为例)上先build出来再上传到服务器上。这样一来就不得不考虑如何同步文件了。
一开始我用的是 scp ,它的命令很简单而且很常用:
|
|
但是我并不推荐使用 scp ,首先它每次都只是全量复制,把本地的文件全部重新上传一次,并不能删除已经弃用或过时的文件。所以实际上它不能实现真正的同步。
其次它对于文件的权限处理也有点问题,可能是跨平台传输的问题,如下所示:
|
|
虽然这样上传上去是能用的,因为默认情况下其他用户有可读权限。但这不是一个好习惯。推荐的做法一般是有明确的权限管理,例如一个专门的用户来管理网页文件,拥有读写权限,然后让web服务器的用户(nginx的话就是www-data)拥有只读权限,其他用户则没有任何权限。
如果要实现上面这些需求,一般会使用Linux自带的 rsync ,但如果要在Windows上用的话好像只能装 cwRsync 或者 WSL (Windows Subsystem for Linux)。
配置远程权限
假设管理网页的用户是 web ,web server用户是 www-data 。需要先把 web 加进 www-data 的组,否则组权限会有问题。
|
|
然后修改目录的owner和mode:
|
|
g+s 是 setgid 位,能保证新文件和目录会继承父目录的组而不是创建者的默认组。这一步不是必要的但是推荐这么做。
配置完成后,就可以回到Windows上了。
cwRsync
cwRsync 是 rsync 在 Windows 上的实现版本,算法和 rsync 一样。
在GitHub上下载并解压它,就可以使用了。同步脚本示例:
|
|
因为环境变量里一般已经有openssh的ssh.exe了,所以这里不将cwRsync的路径添加到环境变量里,而是用绝对路径来调用。出于某种未知原因,这里要用 -e 来显式指定它应该使用的ssh,并且上传路径需要加上 //?/ 前缀,否则会被判断为一个远程主机。
--delete 用来删除多余文件, --chmod 用来显式指定目录和文件的权限,其中目录的 2 就是 setgid 位。
WSL
用 WSL 会更简单,如果你有需求的话装一个也不麻烦。
同步命令示例:
|
|