我在本地安装了 Dokuwiki,我定期使用 rsync 将其同步到我的服务器。我还将给我的一个朋友一个 ssh 帐户,并托管他的公共 Dokuwiki 安装。但是,我遇到了访问权限问题 - 即使镜像是只读的,Dokuwiki 仍然需要对数据目录的写入权限以进行缓存等。Apache 服务器以用户 www-data 的身份运行,每次我这样做时rsync,它重置权限。
根据本网站上的一些其他答案,我尝试使用 setfacl 设置默认权限,但它似乎不起作用 - getfacl 指示权限存在,但 Dokuwiki 不会运行,当我尝试将文件写入为用户www-data,它也不起作用。我缺少什么?
wiki/data$ sudo su www-data
$ pwd
/var/www/wiki/data
$ whoami
www-data
$ touch hi
touch: cannot touch `hi': Permission denied
$ getfacl /var/www/wiki/data
getfacl: Removing leading '/' from absolute path names
# file: var/www/wiki/data
# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
这是我用来设置权限的命令:
setfacl -R -d -m u:www-data:7 /var/www/*
答案1
问题#1:Rsync 正在删除 ACL
应用 ACL 权限后,您需要注意,当您执行该操作时,rsync
您将使用-A
或--acls
开关。这指示rsync
确保在进行同步时保留这些。
摘自 rsync 手册页
-A, --acls preserve ACLs (implies -p)
问题#2:没有 ACL 权限
在查看您的示例时,它确实包含如下权限。
传统烫发
# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x
ACL
default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
但这些 ACL 是用于创建新对象的,并且并不完全按照您的想法工作。www-data
除了默认的 ACL 权限之外,您还需要为用户创建一个条目。
例子
$ pwd
/tmp/somedir
$ mkdir data
$ setfacl -R -d -m u:gopher:7 data
$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
一个实验
现在让我们尝试data
以 user 身份将文件写入目录gopher
。
$ sudo -u gopher touch /tmp/somedir/data/afile
touch: cannot touch `/tmp/somedir/data/afile': Permission denied
看起来熟悉?
添加额外的 ACL 权限
这是因为您需要为用户添加 ACL www-data
,默认规则不是用于访问,而是用于创建新文件/目录。
$ setfacl -R -m u:gopher:7 data
现在再次检查data
目录:
$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
user:gopher:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
唯一的区别是我们现在有一个 ACL 表示用户gopher
有权rwx
访问:
user:gopher:rwx
重复实验
尝试再次向目录写入数据:
$ sudo -u gopher touch /tmp/somedir/data/afile
$
有效!!!仔细检查生成的文件:
$ ls -l /tmp/somedir/data/afile
-rw-rw-r--+ 1 gopher gopher 0 Oct 7 21:36 /tmp/somedir/data/afile