2016-10-13 4 views
0

Я пытаюсь выполнить команду sed shell через PHP, чтобы изменить некоторую строку в файле. Файл расположен на /etc/text.txt, и я пытаюсь изменить текст внутри этого файла, используя следующий код:PHP execute sed shell command

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

Но текст «footext» в text.txt не меняется.

Пожалуйста, помогите мне решить эту проблему

Благодарность

+1

Кажется, что ваши 'www-data' или любой другой пользователь не имеет прав на запись в этот каталог. Цитата: _ Если пользователь Apache (www-data) может писать или изменять/etc, вся система скомпрометирована. –

+0

Чтобы получить доступ из вашего php-скрипта, вы должны изменить группу (см. Chown) файла в ту же группу apache/php работает и дает правильные групповые разрешения через chmod. Для обеспечения безопасности apache должен иметь доступ только к этому файлу в файле/etc. –

+0

Отсутствующая одинарная цитата, которая должна закрыть регулярное выражение, является опечаткой? –

ответ

0

Прежде всего я хотел бы вновь итерируют присущие опасности позволяя (общественность) веб-сервер для изменения системных файлов. Выполнение этого будет приведет к тому, что злоумышленник нарушит вашу систему, это всего лишь вопрос о том, сколько времени потребуется.

Сказали, что есть пара проблем с вашим кодом. Первым из них является зависимость от внешних сторонних (shell) команд, для чего-то, что может и должно быть сделано в чистом PHP.
Редактирование текста является одним из основных преимуществ PHP, в конце концов, и код будет довольно простым. В качестве примера ...

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

Основным преимуществом является то, что вы не должны полагаться на несвязанных программ третьих сторон присутствовать (хотя и sed довольно повсеместно). Который делает код намного проще для понимания, самодостаточным и, следовательно, платформенным агностиком (в максимально возможной степени).

КАК за то, почему ваш код не работает, я тоже подозреваю, что это имеет какое-то отношение к разрешениям на файлы. Как отмечено в комментариях, пользователь www-data не имеет права на запись в папку /etc/ по умолчанию. Поэтому, чтобы позволить ему редактировать файл там, вам сначала нужно создать файл с пользователем с правами root, а затем изменить владельца на www-data.
Однако, не ни при каких обстоятельствах делать это с уже существующими файлами в этой папке. Потенциал непреднамеренных и катастрофических побочных эффектов слишком велик!

Если вам абсолютно необходимо, чтобы скрипт PHP изменял системный файл, напишите сценарий оболочки и вызовите его через crontab или что-то подобное. После вы на 100% уверены, что вход на 100% безопасен от злоупотреблений. (IE: только печатные символы, предпочтительно ASCII.)

+0

Хорошо, спасибо вам большое. Это действительно помогло мне. – Mac

+0

Добро пожаловать, рад, что смогу помочь. :) – ChristianF