/var/www
我按照给出的步骤授予了工作用户(我)读写文件的权限编辑和添加文件到“/var/www”的最简单方法是什么?。当我尝试在项目目录中创建/读取文件时,它工作正常。
说我在工作 /var/www/xyz
我可以通过php
代码读取和写入此文件夹中的文件。现在,我在文件夹中创建了一个文件夹xyz
,例如abc
/var/www/xyz/abc
在我的php
代码中,当我读取位于其中的文件时abc
,它工作正常,但是warning: permission denied
当我尝试时它给了我创建文件在此文件夹中。
确切的警告是
Warning: fopen(abc/a.txt): failed to open stream: Permission denied in /var/www/xyz/code.php
我被要求提供一些输出:
stat /var/www/dodge
File var/www/dodge'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 700h/1792d Inode: 1445503 Links: 8
Access: (2775/drwxrwsr-x) Uid: ( 33/www-data) Gid: ( 33/www-data)
Access: 2013-07-16 16:29:21.434531583 +0530
Modify: 2013-07-16 14:07:46.482782580 +0530
Change: 2013-07-16 16:28:04.622533850 +0530
Birth: -
stat /var/www/xyz/abc
File: /var/www/dodge/codes'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 700h/1792d Inode: 1446465 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ wq) Gid: ( 1000/ wq)
Access: 2013-07-16 15:16:15.554661170 +0530
Modify: 2013-07-16 15:13:42.698665686 +0530
Change: 2013-07-16 15:13:42.698665686 +0530
Birth: -
答案1
对于这种情况,您需要set-group-ID
在目录中添加位/var/www/xyz
,以便新创建的目录从父级继承组。
chmod g+s /var/www/xyz
看man 2 chmod
S_ISGID (02000) 设置组 ID(在 execve(2) 上设置进程有效组 ID;强制锁定,如 fcntl(2) 中所述;从父目录中获取新文件的组,如 chown(2) 和 mkdir(2) 中所述)
请参阅对所引帖子答案的评论。
评论后编辑:
如果你setgid
在父目录中添加了位后子目录已创建:
File var/www/dodge'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 700h/1792d Inode: 1445503 Links: 8
Access: (2775/drwxrwsr-x) Uid: ( 33/www-data) Gid: ( 33/www-data)
Access: 2013-07-16 16:29:21.434531583 +0530
Modify: 2013-07-16 14:07:46.482782580 +0530
Change: 2013-07-16 16:28:04.622533850 +0530 <---added setgid
但子目录是在此之前创建的:
File: /var/www/dodge/codes'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 700h/1792d Inode: 1446465 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ wq) Gid: ( 1000/ wq)
Access: 2013-07-16 15:16:15.554661170 +0530
Modify: 2013-07-16 15:13:42.698665686 +0530
Change: 2013-07-16 15:13:42.698665686 +0530 <---before ctime above
当您创建新文件和目录时,该setgid
位会起作用。对于已经创建的任何文件和目录,它都不会起作用。因此,codes
目录仍归wq
组所有wq
,而其他用户无权在那里创建文件;这就是您收到与之前相同的错误的原因。要么chown
设置子目录以设置正确的组,要么删除并重新创建它。
chown :group /var/www/dodge/code
答案2
通过将文件夹添加xyz
到组解决了此问题var-www
。因此,现在我也可以写入子文件夹中的文件