J'ai donné la permission de lire et d'écrire des fichiers dans /var/www
à l'utilisateur actif (moi) en suivant les étapes décrites dans Quel est le moyen le plus simple d'éditer et d'ajouter des fichiers dans "/ var/www"? . Cela fonctionne bien lorsque j'essaie de créer/lire un fichier dans le répertoire du projet.
Dites que je travaille dans /var/www/xyz
Je suis capable de lire et d'écrire des fichiers dans ce dossier à l'aide d'un code php
. Maintenant, j'ai créé un dossier dans le dossier xyz
, disons abc
/var/www/xyz/abc
Dans mon code php
lorsque je lis un fichier situé à l'intérieur de abc
, cela fonctionne bien, mais cela me donne warning: permission denied
lorsque je tente de créer un fichier. dans ce dossier.
L'avertissement exact est
Warning: fopen(abc/a.txt): failed to open stream: Permission denied in /var/www/xyz/code.php
On m'a demandé de fournir quelques résultats:
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: -
Pour cette situation, vous devez ajouter le bit set-group-ID
au répertoire /var/www/xyz
afin que les répertoires nouvellement créés au sein du groupe héritent du groupe parent.
chmod g+s /var/www/xyz
Voir man 2 chmod
S_ISGID (02000) set-group-ID (définit le groupe effectif du processus sur execve (2); verrouillage obligatoire, comme décrit dans fcntl (2); prend le nouveau groupe de fichiers dans le répertoire parent, comme décrit dans chown (2) et mkdir (2))
Voir les commentaires sur la réponse de l'article référé.
Editer après le commentaire:
Si vous avez ajouté le bit setgid
au répertoire parent après , le sous-répertoire a été créé:
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
mais le sous-répertoire a été créé avant cela:
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
le bit setgid
fonctionne lorsque vous créez de nouveaux fichiers et répertoires. Cela ne fonctionnera pas pour ceux qui ont déjà été créés. Ainsi, le répertoire codes
appartient toujours à wq
et au groupe wq
, et l’autre utilisateur n’a pas l’autorisation de créer des fichiers à cet emplacement; c'est pourquoi vous obtenez la même erreur qu'avant. Soit chown
le sous-répertoire pour définir le groupe correct, soit supprimez-le et recréez-le.
chown :group /var/www/dodge/code
Résolution de ce problème en ajoutant le dossier xyz
au groupe var-www
. Ainsi, je peux maintenant écrire aussi dans les fichiers des sous-dossiers.