PHP: Définition des autorisations pour que je puisse écrire un fichier?

StackOverflow https://stackoverflow.com/questions/941879

  •  06-09-2019
  •  | 
  •  

Question

Je suis en train de créer un fichier avec PHP voici mon code:

$file_to_send = 'ftp_test_from_created_file.txt';
chmod($file_to_send, 0777);
$fh = fopen($file_to_send,'w');
$tsv_line = 'Hey\tThese\tAre\tTab\tSeperated\tValues';
fwrite($fh, $tsv_line);
fwrite($fh, '\n');
$tsv_line = 'Hey\tThese\tAre\tToo';
fwrite($fh, $tsv_line);
fclose($fh);

Cela me donne clairement une erreur parce que je suis en train de définir des autorisations sur un fichier qui n'existe pas encore. Bien que si je saute l'appel chmod je reçois une autre erreur me disant que je ne dispose pas des autorisations définies. Donc, soit je suis un poulet malade vs cycle d'œuf ou je dois définir les autorisations sur le répertoire contenant ... mais comment? il a essayé tous les folling:

chmod('../containingfolder/', 0777);
chmod('../', 0777);
chmod('', 0777);

Aucun dont le travail ... que dois-je faire? Oh, et par la façon une fois que je suis fait ce que je dois changer les autorisations de retour?

Merci!

UPDATE J'ai essayé chmod (, 0777 '.) et c'est l'erreur que je suis:

Warning: chmod(): Operation not permitted

La seule raison pour laquelle je suis en train de faire de ce dossier est que je peux le télécharger par FTP ailleurs, je comptais utiliser unlink (). Donc, s'il y a une meilleure façon? Comme peut-être stocker le fichier dans la mémoire de l'envoyer (ne sais pas si c'est possible)? Aussi je me sers PHP4. Merci!

Était-ce utile?

La solution

Créez un répertoire en dehors de votre racine du document que nous appellerons $tmpFolder faire en sorte que l'utilisateur que le serveur Web est en cours d'exécution en dispose des autorisations de lecture / écriture. Ensuite, les éléments suivants:

$file_to_send = $tmpFolder . '/ftp_test_from_created_file.txt';
chmod($file_to_send, 0777);
$fh = fopen($file_to_send,'w');
$tsv_line = 'Hey\tThese\tAre\tTab\tSeperated\tValues';
fwrite($fh, $tsv_line);
fwrite($fh, '\n');
$tsv_line = 'Hey\tThese\tAre\tToo';
fwrite($fh, $tsv_line);
fclose($fh);

Autres conseils

Il est également possible que le serveur apache en cours d'exécution (si elle est apache) n'a pas accès à modifier les autorisations sur ce répertoire. Il pourrait avoir root / root en tant qu'utilisateur / groupe et apache fonctionne sur le groupe apache ou wwwuser ou autre chose.

Faites un ls -l sur le répertoire parent et voir ce que l'utilisateur et le groupe a accès à ce dossier.

Pour modifier l'autorisation du répertoire courant, utilisez

chmod('.', PERMISSION);

Avez-vous vraiment besoin 0777, à savoir monde et inscriptible en lecture? Semble très laxiste pour moi!

Modifier : Votre suggestion chmod ( '../ containingfolder /', 0777); aurait travaillé aussi. Pouvez-vous être plus prolixe sur les erreurs que vous obtenez?

Vous ne pouvez pas définir les permissions d'une entrée si l'utilisateur en cours d'exécution PHP ne peut pas le modifier. Regardez la configuration de apache, recherche pour l'utilisateur, il est en cours d'exécution avec (par défaut, il est www-data). Pour éviter ces derniers dans l'avenir, vous mettre au même groupe que le groupe par défaut et donner racine du document chmod -R g + a

Si l'utilisateur peut écrire dans le répertoire, vous devriez être en mesure de simplifier tout cela avec file_put_contents().

<?php
$file = 'file_to_write.txt';
$data = "Tab\tseparated\tvalues\nMore\tseparated\tvalues";
file_put_contents($file);

Si vous ne disposez pas des autorisations d'écriture dans le répertoire courant (ou tout autre répertoire) vous ne serez pas en mesure de créer le fichier, et encore moins chmod il.

Si vous pouvez afficher les erreurs que vous obtenez de vos commandes chmod(), cela aiderait.

chmod('.',0777);

devrait fonctionner.

Si vous voulez maintenir la prison chroot, mais ont toujours besoin des privilèges chmod le répertoire courant, vous allez devoir comprendre comment utiliser sudo avec l'option -S et conduit le mot de passe root pour STDIN afin pour obtenir les priviledges.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top