设置共享目录和virtualenv进行开发

时间:2014-04-17 21:13:49

标签: permissions virtualenv acl

我有一个目录,我希望能够被群组网站开发中的任何人使用。目录的所有者是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

1 个答案:

答案 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拥有,而是由拥有它们的用户拥有,无论如何都应该拥有访问权。