PHP выполнить команду оболочки sed

#php #exec #shell-exec

#php #exec #shell-exec

Вопрос:

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

 $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, вся система скомпрометирована.

2. Чтобы получить доступ из вашего php-скрипта, вы должны изменить группу (см. chown) файла на ту же группу, с которой работает apache / php, и предоставить соответствующие групповые разрешения через chmod. В целях безопасности только apache должен иметь доступ к этому единственному файлу в /etc .

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

4. одинарная кавычка просто опечатка, я ее добавил. пользователем / группой php-скрипта является kurnia kurnia, а пользователем / группой для text.txt это vmail/exim. любая идея или ссылка, чтобы предоставить скрипту доступ к этому text.txt ? Спасибо

5. Я бы абсолютно переместил файл куда-нибудь еще, чтобы обработать его. Вашему веб-серверу не должен быть разрешен доступ к такому системному каталогу.

Ответ №1:

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

Тем не менее, есть несколько проблем с вашим кодом. Первым из которых является зависимость от внешних сторонних команд (оболочки) для чего-то, что может и должно выполняться на чистом 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% защищены от злоупотреблений. (Т.Е.: только печатные символы, предпочтительно ASCII.)