背景和需求

  • 多人在一台 Linux 服务器上协同工作
  • 权限、责任分明
  • 存在私有目录和公共目录
  • 成员各自本地开发,均具备发布到测试环境的权限
  • 只有组长具备发布到生产环境的权限
  • 一键发布,省时安全
  • 需要妥善处理覆盖文件可能存在的问题

创建工作组和用户

创建一个工作组,以及若干个用户,使得每个用户都在并且仅在该工作组下。

1
2
3
4
5
6
7
8
9
## 创建名为 worker 的工作组
sudo groupadd worker

## 此方法下,person1 只存在一个 group: worker
sudo adduser person1 -g worker

## 可以通过 usermod 去修改已有用户所在的 group
sudo adduser person2
sudo usermod -g worker person2

修改 umask

将 umask 值修改为 002,这样,所创建的文件/目录权限默认就是 664/775,使同组成员可以修改。

默认值若不是 002,可修改 /etc/profile,也可以在 ~/.bash_profile 中添加 umask 002

同步脚本

思想: 使用 tar 命令将需要同步的文件进行打包,通过 scp 上传到服务器,再登录上服务器进行解压覆盖原工程(这里有个前提,本地和服务器已经建立好免密码登录),然后将本地和服务器端的压缩包删除。

关键代码

1
2
3
4
5
6
7
tar --exclude ".svn" \
--exclude ".idea" \
--exclude ".DS_Store" \
-czf tmp.web.tgz -C ./my_proj .
scp tmp.web.tgz ${REMOTE_ADDR}:${TARGET_PATH}
ssh ${REMOTE_ADDR} "cd ${TARGET_PATH}; tar --no-overwrite-dir -xzf tmp.web.tgz; rm tmp.web.tgz"
rm tmp.web.tgz

服务端

服务端方面,需要对共有目录设置相关权限。

共有的测试目录下,所有的文件所在组都应该是此前设定的组,如 worker;并且,权限均为 775 或者 664。

而生产目录下,权限则应该设定为 755 或者 644。

命令参考

1
2
sudo chown -R someone.worker my_proj
sudo chmod -R g+w my_proj

参考链接: https://wiki.archlinux.org/index.php/Users_and_groups_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)