授予用户对 www-data 拥有的 /var/www 的权限

Geo*_*rce 44 apache2 www 12.04

我为某些网站设置了一个简单的 Web 服务器,其布局类似于:

站点 1: /var/www/site1/public_html/

站点 2: /var/www/site2/public_html/

我以前使用 root 用户来管理文件,然后www-data在我完成后将它们还给(WordPress 网站,需要 WP Uploads 才能工作)。这可能不是最好的方法。

我正在尝试找到一种方法来创建另一个用户(我们称之为 user1),该用户有权编辑 site1 但不是 site2 中的文件,并且不会阻止文件被www-data. 我有什么办法可以做到这一点吗?

Mas*_*oor 83

如果我们检查 site1 的所有权,我们会发现这样的东西,

ls -ld /var/www/site1/
drwxr-xr-x 2 root root 4096 Oct 24 21:06 site1/
Run Code Online (Sandbox Code Playgroud)

这意味着该目录由用户 root,组 root 拥有。用户 root 对目录具有写入权限(加上读取和执行权限),而组 root 仅具有读取和执行权限。

我们希望将组所有权更改为另一个(新)组并将 user1 添加到该特定组。我们还将授予该特定组的写权限。

创建一个新组,

sudo addgroup site1
Run Code Online (Sandbox Code Playgroud)

将 user1 添加到新创建的组中,

sudo adduser user1 site1
Run Code Online (Sandbox Code Playgroud)

检查 user1 是否真的在该组中,

groups user1
Run Code Online (Sandbox Code Playgroud)

输出应该是一个类似的列表,

user1 : <other-groups> site1
Run Code Online (Sandbox Code Playgroud)

现在我们可以更改您想要的目录的组所有权。

sudo chown -vR :site1 /var/www/site1/
changed ownership of `/var/www/site1/' from root:root to :site1
Run Code Online (Sandbox Code Playgroud)

向这个新的组所有者授予写权限,

sudo chmod -vR g+w /var/www/site1/
mode of `/var/www/site1/' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)
Run Code Online (Sandbox Code Playgroud)

检查所有更改是否确实存在,

ls -ld /var/www/site1/
drwxrwxr-x 2 root site1 4096 Oct 24 21:06 /var/www/site1/
Run Code Online (Sandbox Code Playgroud)

因此,该目录现在归用户 root 组 site1 所有。用户 root 和组 site1 都具有对该目录的写入权限(加上读取和执行权限)。属于组 site1 的任何用户都将享有授予该组的所有权限。

现在以 user1 登录,移动到 site1 目录并尝试在该目录中创建一个文件,

echo "My User1 Site" > index.html 
bash: index.html: Permission denied
Run Code Online (Sandbox Code Playgroud)

这失败了,因为 user1 的主要组很可能不是 site1。所以,换到那个组。

newgrp - site1
Run Code Online (Sandbox Code Playgroud)

尝试重新创建文件(请注意,更改组后您已移动到 user1 的主目录),现在应该可以工作了。由于创建的文件将具有全局读取权限,因此 apache(或您的 Web 服务器)在访问它们时应该不会遇到任何问题。

编辑

此外,正如dan08在评论中指出的,您需要将 www-data 添加到 site1 组。

sudo adduser www-data site1
Run Code Online (Sandbox Code Playgroud)

在许多(并非所有)发行版中,www-data 是运行 Apache Web 服务器的用户。这也意味着 Apache 所做的一切(特别是包括 PHP 脚本)默认都将在用户 www-data(以及 www-data 组)的权限下完成。WordPress 使用用户 www-data 写入文件。

如果您想查看 apache Web 服务器的运行情况,请发出以下命令,

ps aux | grep apache2 | less
Run Code Online (Sandbox Code Playgroud)

  • `Permission denied` 消息不是由于“主要组”,而是由于用户实际上尚未在该组中(就操作系统而言)。如果您注销并重新登录,它将按预期工作(无需运行 `newgrp - site1`)。 (3认同)
  • 您还需要将 www-data 添加到 site1 组。在 Wordpress Web 界面中上传和更改文件时。更改由 Apache 使用 www-data 用户完成。所以大多数时候读取权限是不够的。 (2认同)

Jad*_*eye 12

对于那些在他们的主文件夹下有他们的 wordpress 根文件夹的人:

Ubuntu/阿帕奇

  1. 将您的用户添加到 www-data 组:

    信用授予对 www-data 组的写入权限

    你想打电话usermod给你的用户。所以那将是:

    sudo usermod -aG www-data yourUserName
    
    Run Code Online (Sandbox Code Playgroud)

    假设www-data组存在

  2. 检查您的用户是否在www-data组中:

    groups yourUserName
    
    Run Code Online (Sandbox Code Playgroud)

    你应该得到类似的东西:

    yourUserName : yourUserGroupName www-data
    
    Run Code Online (Sandbox Code Playgroud)

    yourUserGroupName 通常与您的用户名相似

  3. 递归更改文件夹的组所有权,保留您的用户所有权

    chown yourUserName:www-data -R yourWebSiteFolder/*
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将目录更改为 yourWebSiteFolder

    cd yourWebSiteFolder
    
    Run Code Online (Sandbox Code Playgroud)
  5. 递归更改文件夹和子文件夹的组权限以启用写入权限:

    find . -type d -exec chmod -R 775 {} \;
    
    Run Code Online (Sandbox Code Playgroud)

    模式/home/yourUserName/yourWebSiteFolder/'0755 (rwxr-xr-x)改为0775 (rwxrwxr-x)

  6. 递归更改文件和子文件的组权限以启用写入权限:

    find . -type f -exec chmod -R 664 {} \;
    
    Run Code Online (Sandbox Code Playgroud)

    结果应该类似于:

    WAS:
    -rw-r--r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html
    CHANGED TO:
    -rw-rw-r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html
    
    Run Code Online (Sandbox Code Playgroud)

    相当于:

    chmod -R ug+rw foldername
    
    Run Code Online (Sandbox Code Playgroud)

    权限将类似于 664 或 775。


Dan*_*Dan 7

创建两个组:site1grpsite2grp

sudo groupadd site1grp && sudo groupadd site2grp
Run Code Online (Sandbox Code Playgroud)

添加www-data到两个组。

sudo adduser www-data site1grp && sudo adduser www-data site2grp
Run Code Online (Sandbox Code Playgroud)

将 user1 和 user2 添加到适当的组

sudo adduser user1 site1grp && sudo adduser user2 site2grp
Run Code Online (Sandbox Code Playgroud)

更改站点文件夹的权限,以便用户所有者是 www-data 并且组所有者是适当的组

sudo chown -R www-data:site1grp /var/www/site1  && sudo chown -R www-data:site2grp /var/www/site2
Run Code Online (Sandbox Code Playgroud)

现在www-data在两个站点上都拥有用户和组权限,并且每个用户都拥有各自站点的组权限。