我有一个目录,我希望能够被群组网站开发中的任何人使用。目录的所有者是root,该组是网站开发。我已将权限设置为---rws---
,并且还在setfacl -dm "u::---,g::rwx,o::---" .
目录的默认acl上设置了这些权限我还将自己添加到了网站开发组,我曾经以为会给我目录的完全权限。但是,当我尝试运行virtualenv website-env
为网站创建virtualenv时,我收到此错误:
Running virtualenv with interpreter /usr/local/bin/python3.3
Using base prefix '/usr/local'
Traceback (most recent call last):
File "/usr/local/lib/python3.4/site-packages/virtualenv.py", line 2338, in <module>
main()
File "/usr/local/lib/python3.4/site-packages/virtualenv.py", line 824, in main
symlink=options.symlink)
File "/usr/local/lib/python3.4/site-packages/virtualenv.py", line 984, in create_environment
site_packages=site_packages, clear=clear, symlink=symlink))
File "/usr/local/lib/python3.4/site-packages/virtualenv.py", line 1158, in install_python
mkdir(lib_dir)
File "/usr/local/lib/python3.4/site-packages/virtualenv.py", line 447, in mkdir
os.makedirs(path)
File "/usr/local/lib/python3.3/os.py", line 258, in makedirs
makedirs(head, mode, exist_ok)
File "/usr/local/lib/python3.3/os.py", line 269, in makedirs
mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: 'website-env/lib'
我可以通过sudo
运行它,但是我必须继续使用sudo
来执行每个与virtualenv相关的命令。是什么导致virtualenv缺少对其创建的文件的权限?
ls -la
的输出是:
total 8
dr-xrws---+ 2 root website-development 4096 May 6 02:01 .
drwxr-xr-x 3 root root 4096 Apr 16 20:47 ..
groups
的输出是:
will wheel website-dev website-development
(website-dev
群体来自较旧的尝试,我还没有去清理,但我不认为这会影响到这一点。
virtualenv --python=python3.3 -v website-env
的输出与virtualenv --python=python3.3 website-env
的输出相同。
virtualenv --version
的输出为1.11.4
。
我或许应该注意到我在CentOS上运行它,所以我在virtualenv命令行中指定了Python版本来解决CentOS仍然附带的事实并依赖于Python 2.6.9
答案 0 :(得分:1)
问题在于您设置acl的方式,特别是-d
标志。这将设置新文件/目录的默认权限。在您的情况下,您已将它们设置为与访问权限---rws---
相同,并且当virtualenv
在website-env中创建子目录时,它们也具有这些权限。实际上,我不确定为什么virtualenv
不能像写入网站env一样写信给他们,但这是当前的问题。
解决问题:
从网站环境中删除所有acl控件。然后运行setfacl -m "u::---,g::rwx,o::---" website-env
。
$ getfacl website-env
# file: website-env
# owner: root
# group: website-development
flags: -s-
user::---
group::rwx
other::---
virtualenv
现在可以正确执行。
<强>可选强>:
我发现如果要为新文件/目录设置默认权限,可以使用第二个命令setfacl -m "d:u::rwx,d:g::rwx,d:o::---" website-env
添加它们。
$ getfacl website-env
...
...
default:user::rwx
default:group::rwx
default:other::---
这些似乎是virtualenv执行所需的最小权限。使用权限rwxrws---
创建新目录。您可以通过使用蒙版设置来更好地微调这一点,但我对此并不了解。
似乎将用户权限设置为---
会覆盖设置为rwx
的组权限:
d---rws---+ 2 root group 4.0K May 6 02:09 dir1
d---rws---+ 2 user group 4.0K May 6 02:09 dir2
user:~$ touch dir1/foo && ls dir1
foo
user:~$ touch dir2/foo && ls dir2
touch: cannot touch 'dir2/foo': Permission denied
有趣的是,我可以访问root
所拥有的目录,只要我是group
的成员,但我无法访问我拥有的目录,尽管我是该成员的成员。相同的组并具有组类权限。显然,所有者的权限优先,如果设置为---
,他就无法修改他的文件,即使该组中的其他人也可以!
您的案例中发生了什么:website-env
由root拥有。群组website-development
可以完全访问它。运行virtualenv
时,会在website-env
内创建具有权限---rws---
的子目录(由默认设置acl设置)。但是,这些子目录不归root用户所有,而是由运行virtualenv
的用户拥有。他对这些子目录的用户类权限为---
,因此virtualenv
无法修改它们。
解决方案是允许所有者完全访问子目录,即。在acl中使用default:user:rwx
安全性不会受到影响,因为这些文件/目录不是由root拥有,而是由拥有它们的用户拥有,无论如何都应该拥有访问权。