2016-10-13 3 views
0

Je tente d'exécuter une commande sed shell via PHP pour changer une chaîne dans un fichier. Le fichier se trouve à /etc/text.txt et je tente de modifier un texte dans ce fichier en utilisant le code suivant:Commande PHP execute sed shell

$old_path = getcwd(); 
chdir('/etc/'); 
$cmd = "sed -i 's/footext/newtext/g' text.txt"; 
exec($cmd); 
chdir($old_path); 

Mais le texte « footext » à text.txt ne change pas.

S'il vous plaît aidez-moi à résoudre ce problème

Merci

+1

On dirait que votre 'www-data' ou n'importe quel utilisateur n'a pas les permissions pour écrire dans ce répertoire. Quote: _Si l'utilisateur Apache (www-data) peut écrire ou modifier/etc tout le système est compromis._ –

+0

Pour avoir accès à partir de votre script php, vous devez changer le groupe (voir chown) du fichier dans le même groupe Apache/php fonctionne et donne les autorisations de groupe appropriées via chmod. Pour des raisons de sécurité, apache seulement devrait avoir accès à ce seul fichier dans/etc. –

+0

La citation unique manquante qui devrait fermer l'expression rationnelle est une faute de frappe? –

Répondre

0

d'abord tout ce que je voudrais Réitérons les dangers inhérents à permettre à votre (public) serveur Web pour modifier les fichiers système. Faire mènera à un attaquant compromettant votre système, il est seulement question de combien de temps cela prend.

Cela dit, il y a quelques problèmes avec votre code. Le premier est le recours à des commandes tierces (shell) externes, pour quelque chose qui pourrait et devrait être fait en PHP pur à la place.
Éditer du texte est l'une des principales forces de PHP, après tout, et le code serait assez simple. A titre d'exemple ...

if (!$content = file_get_contents ($filename)) { 
    // Handle errors opening/reading the file here. 
} 

// Assuming case-sensitive search and replace here, as per the `sed` used. 
$content = str_replace ("old text", "new text", $content); 

if (!file_put_contents ($filename, $content)) { 
    // Handle errors with writing to the file here. 
} 

Le principal avantage est que vous n'avez pas besoin de compter sur des programmes tiers non liés à être présent (même si sed est assez omniprésent). Ce qui rend le code beaucoup plus facile à comprendre, autonome et donc agnostique pour la plate-forme (dans toute la mesure du possible).

AS pourquoi votre code ne fonctionne pas, je pense aussi que cela a quelque chose à voir avec les autorisations de fichiers. Comme indiqué dans les commentaires, l'utilisateur www-data n'a pas l'autorisation d'écrire dans le dossier /etc/ par défaut. Donc, afin de lui permettre d'éditer un fichier là-bas, vous devez d'abord créer le fichier avec un utilisateur root, puis changer la propriété en www-data.
Cependant, ne pas en aucun cas faire cela aux fichiers déjà existants dans ce dossier. Le potentiel d'effets secondaires imprévus et catastrophiques est tout simplement trop énorme!

Si vous avez absolument besoin d'un script PHP pour modifier le fichier système, écrivez un shell-script et appelez-le via crontab ou quelque chose de similaire. Après, vous êtes sûr à 100% que l'entrée est sûre à 100% contre les abus. (IE: Caractères imprimables uniquement, de préférence ASCII.)

+0

Eh bien, merci beaucoup. Cela m'a vraiment aidé. – Mac

+0

De rien, je suis content que je puisse vous aider. :) – ChristianF