我将 sgid 递归添加到我的 WordPress 网站的文档根目录中。我可以在其中创建文件和目录并继承组。即使是由 FTP 创建的目录也可以与 sgid 一起正常工作。但是 apache (www-data) 创建的任何目录都没有启用 sgid 位,因此内部的任何内容都将使用默认的 www-data:www-data 创建。
例如,在 uploads/2017 目录中,apache 创建了没有 sgid 的 09 目录。即使我在这里使用 root 用户创建任何目录,它也会启用 sgid。
drwxrwsr-x+ 10 www-data myuser 4096 Sep 19 20:44 .
drwxrwsr-x+ 16 www-data myuser 4096 Sep 19 20:48 ..
drwxrwxr-x+ 2 www-data myuser 4096 Sep 19 19:23 09
drwxrwsr-x+ 2 root myuser 4096 Sep 19 21:04 test
我们如何在创建新目录时强制 apache 使用 sgid?
答案1
这是 WordPress 的事情,对吧?我遇到了同样的问题,我也指责 Apache,但我找到的解决方案实际上是 WordPress 设置。
看https://codex.wordpress.org/Editing_wp-config.php#Override_of_default_file_permissions
在我的特定服务器上,WordPress 使用自己的文件权限设置(并忽略 SGID 位),与您描述的方式相同。我不知道理由是什么,但似乎是故意的。我的解决方案是将特定的权限掩码添加到 wp-config.php 文件中:
define( 'FS_CHMOD_DIR', 02775 );
0 == 八进制
2==设置SGID
第755章
使用正确的权限设置现有的 WordPress 文件和目录(包括所有目录上的 SGID)后,WordPress 创建的新文件和目录(插件、主题、上传)使用 02755 文件掩码并继承了正确的组所有权。注意 Apache 用户 www-data 也必须在该组中。
更多细节:
创建供所有 SFTP 用户和 Apache 使用的组:sudo groupadd sftp-grp。
将 Apache 添加到组 sftp-grp: sudo usermod -a -G sftp-grp www-data
将常规用户添加到组 sftp-grp,如上所述。
将所有 WordPress 文件设置为 Apache 所有,但具有共享组: sudo chown -R www-data:sftp-grp /var/www/path-to-wordpress
确保所有 WordPress 文件都是组读/写(可能需要重新考虑 .htaccess 和 wp-config.php): sudo chmod -R g+rw /var/www/path-to-wordpress
将 SGID 位添加到 WordPress 主目录: sudo chmod g+s /var/www/path-to-wordpress
...以及所有子目录: sudo find /var/www/path-to-wordpress -type d -exec chmod g+s '{}' \;
添加到 wp-config.php:define( 'FS_CHMOD_DIR', 02775 );