我以为我了解了 Linux 权限,但是唉……为什么我在这里没有权限?
我是这个www-data
团体的成员:
docker@docker01:/home/docker$ id
uid=1002(docker) gid=998(docker) groups=998(docker),33(www-data)
父目录是 user/group www-data
,并且该组具有rwx
:
docker@docker01:/home/docker$ ls -lh /var/www/userdata02.example.com/html/
total 40K
drwxrwxr-x 768 www-data www-data 20K Jun 1 08:01 private
drwxrwxr-x 777 www-data www-data 20K Jun 5 20:55 public
但是当我尝试创建一个新的子目录时,出现权限错误:
docker@docker01:/home/docker$ mkdir /var/www/userdata02.example.com/html/public/803y9xcn
mkdir: cannot create directory ‘/var/www/userdata02.example.com/html/public/803y9xcn’: Permission denied
我在这里遗漏了什么……?
答案1
权限对于所有者(“读写执行”)、对于组、对于其他人而言rwxrwxr-x
意味着。rwx
rwx
r-x
对于目录,“读取”标志(r
)表示“获取目录列表”,“写入”(w
)表示在该目录中“创建/删除/重命名对象”,“执行”(x
)表示“进入”(cd)该目录。
w
仅所有者或所有者组才允许更改 ( )。您是docker
,但您不是 所有者,也就是www-data
。可能docker
不属于该www-data
组,所以您是那些“其他人”之一,无权写入。
这个问题可以这样解决:
docker
通过使用 POSIX ACL 专门为其所属的用户或组添加权限;- 加入
docker
群组www-data
; - 通过将权限更改为全世界可写的。
选项按安全性降低的顺序呈现(而不是易实现性的增加)。此外,两个较低的选项有一个警告:新创建的对象将由所有者拥有docker
,现在www-data
将无法控制它们;它可能无法删除它们甚至无法读取它们,这取决于使用什么权限创建对象。这很麻烦,我建议不要这样做。我会解释 POSIX ACL 路径:
setfacl -m user:docker:rwx /var/www/userdata02.example.com/html/public
setfacl -m default:user:docker:rwx /var/www/userdata02.example.com/html/public
setfacl -m default:user:www-data:rwx /var/www/userdata02.example.com/html/public
setfacl -m default:group:www-data:rwx /var/www/userdata02.example.com/html/public
即使在第一种情况下,对象也将归创建者所有(docker
),但您可以拥有一个“默认”ACL,它将应用于所有新对象并嵌套到子目录中,因此您可以强制所有新对象拥有完全权限www-data
。这就是下面三行的作用。
或者,您可以为此类对象创建一个特殊组,而不是授予权限user:docker
。group:that_group
根据您在 Docker 中要执行的操作,这可能会使您以后的生活更轻松。