2016-10-13 3 views
0

Ich versuche, eine Sed-Shell-Befehl über PHP auszuführen, um einige Zeichenfolge in einer Datei zu ändern. Die Datei befindet sich auf /etc/text.txt befindet, und ich versuche einen Text innerhalb der Datei folgenden Code zu ändern:PHP ausführen sed Shell-Befehl

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

Aber der Text ‚footext‘ bei text.txt nicht ändert.

Bitte helfen Sie mir dieses Problem zu lösen

Dank

+1

Scheint so, als hätten Ihre 'www-data' oder was auch immer der Benutzer hat keine Berechtigung, in dieses Verzeichnis zu schreiben. Quote: _Wenn der Apache-Benutzer (www-data) schreiben/ändern/etc kann, ist das ganze System kompromittiert._ –

+0

Um Zugriff aus Ihrem PHP-Skript zu erhalten, sollten Sie die Gruppe (siehe chown) der Datei in die gleiche Gruppe ändern apache/php läuft und gibt per chmod die richtigen Gruppenrechte. Aus Sicherheitsgründen sollte Apache nur Zugriff auf diese einzige Datei in/etc haben. –

+0

Das fehlende einfache Zitat, das die Regexp schließen sollte, ist ein Tippfehler? –

Antwort

0

allererst Ich mag würde die inhärenten Gefahren, erneut auf Ihre (öffentlich) zu erlauben, Web-Server-System-Dateien zu ändern. Dies führt dazu, dass zu einem Angreifer führt, der Ihr System kompromittiert, es ist nur eine Frage, wie viel Zeit es braucht.

Das heißt, es gibt ein paar Probleme mit Ihrem Code. Der erste ist die Abhängigkeit von externen Shell-Befehlen (für Shell), die stattdessen in reinem PHP ausgeführt werden können und sollten.
Bearbeiten von Text ist eine der wichtigsten Stärken von PHP, und der Code wäre ziemlich einfach. Als Beispiel ...

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. 
} 

Der Hauptvorteil ist, dass Sie brauchen nicht zu verlassen sich auf unabhängige Programme Dritter anwesend zu sein (obwohl sed ist ziemlich allgegenwärtig). Das macht den Code viel einfacher zu verstehen, eigenständig und somit plattformunabhängig (so weit wie möglich).

AS für, warum Ihr Code nicht funktioniert, vermute ich auch, dass dies etwas mit Dateiberechtigungen zu tun hat. Wie in den Kommentaren erwähnt, hat der Benutzer www-data keine Berechtigung, standardmäßig in den Ordner /etc/ zu schreiben. Um es zu ermöglichen, eine Datei dort zu bearbeiten, müssen Sie zuerst die Datei mit einem root-fähigen Benutzer erstellen und dann den Besitz in www-data ändern.
Allerdings tun Sie nicht unter keinen Umständen tun dies zu bereits vorhandenen Dateien in diesem Ordner. Das Potenzial für unbeabsichtigte und katastrophale Nebenwirkungen ist einfach zu groß!

Wenn Sie unbedingt ein PHP-Skript benötigen, ändern Sie die Systemdatei, schreiben Sie ein Shell-Skript und rufen Sie es über crontab oder etwas Ähnliches auf. Nach haben Sie 100% sicher, dass die Eingabe 100% sicher vor Missbrauch ist. (IE: Nur druckbare Zeichen, vorzugsweise ASCII.)

+0

Nun, vielen Dank. Es hat mir wirklich geholfen. – Mac

+0

Gern geschehen, froh, dass ich helfen konnte. :) – ChristianF