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.)
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._ –
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. –
Das fehlende einfache Zitat, das die Regexp schließen sollte, ist ein Tippfehler? –