Почему sed не работает внутри команды PHP exec? - PullRequest
0 голосов
/ 03 января 2012

У меня есть защищенный промежуточный сайт, доступный только через назначенные IP-адреса. Он должен иметь возможность переключать видимые URL-адреса в соответствии с реальным сайтом, поэтому я настроил простую форму, позволяющую тестировщикам переключаться между промежуточными «сайтами», редактируя файл .htaccess от их имени. Команда PHP для редактирования файла .htaccess была настроена так:

$sed_cmd = "/bin/sed -i 's/^SetEnv MAGE_RUN_CODE=.*$/SetEnv MAGE_RUN_CODE=".$run_code."/' ../.htaccess";

Команда grep, запускаемая до и после вызова этой команды, запускается, чтобы проверить ее следующим образом:

<p>Previous switch: <strong><em><?php echo `grep 'SetEnv MAGE_RUN_CODE=' ../.htaccess`; ?></strong></em></p>
      <?php exec($sed_cmd, $sed_out, $sed_result); ?>
      <p>Command <strong><em><?php echo $sed_cmd?></em></strong> yielded:
      <br />Return: <?php echo $sed_result; ?>
      <br />Printed:<strong><em><?php print_r($sed_out); ?></em></strong></p>
<p>New switch: <strong><em><?php echo `grep 'SetEnv MAGE_RUN_CODE=' ../.htaccess`; ?></strong></em></p>

Команды grep работают нормально, а копирование / вставка строки sed в командную строку также работает нормально. Однако команда sed завершается неудачно при запуске на веб-странице с помощью команды PHP exec, как указано выше, что приводит к состоянию выхода 4:

Previous switch: SetEnv MAGE_RUN_CODE=naturapet_website

Command /bin/sed -i 's/^SetEnv MAGE_RUN_CODE=.*$/SetEnv MAGE_RUN_CODE=animal_health_store_website/' ../.htaccess yielded:
Return: 4
Printed:Array ( )

New switch: SetEnv MAGE_RUN_CODE=naturapet_website

У процесса есть доступ на запись в файл, и, поскольку я не могу найти способ получить дополнительную информацию об ошибке, я озадачен.

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

Может кто-нибудь сказать мне, почему sed не работает, когда вызывается в exec, как я настроил выше?

Ответы [ 2 ]

1 голос
/ 19 января 2012

Объяснение

sed создает временный рабочий файл при использовании с параметром -i. Затем sed использует содержимое этого временного файла для обновления вместо исходного файла (например, ../.htaccess).

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

Поэтому каталог, в котором находится .htaccess, может быть защищен от записи или что-то в этом роде (ACL ...). Я никогда не видел ошибку ' Array () ': Дайте мне знать, если найдете ...

Возможные обходные пути

Используйте свой собственный временный .htaccess.tmp файл (т.е. не используйте опцию -i):

$sed_cmd = "/bin/sed 's/^SetEnv MAGE_RUN_CODE=.*$/SetEnv MAGE_RUN_CODE=".$run_code."/' ../.htaccess > ../.htaccess.tmp && cat ../.htaccess.tmp > ../.htaccess";

Вы можете использовать cp вместо cat, но cat сохранит первоначального владельца и разрешение .htaccess.

Другая идея состоит в том, чтобы получить вывод sed, а затем записать обратно файл .htaccess:

$sed_cmd = "/bin/sed 's/^SetEnv MAGE_RUN_CODE=.*$/SetEnv MAGE_RUN_CODE=".$run_code."/' ../.htaccess";
exec ($sed_cmd, $sed_out, $sed_result);
$file = fopen ('../.htaccess', 'w');
fwrite ($file, $sed_out);
fclose ($file);
0 голосов
/ 17 января 2012

Поместите свои sed вещи в скрипт set_MAGE_RUN_CODE.sh:

#!/bin/bash
FILE=../.htaccess
if [ -f "$FILE" ]
then 
   sed -i 's/^SetEnv MAGE_RUN_CODE=.*$/SetEnv MAGE_RUN_CODE=$@/' "$FILE"
else
   # print error
   echo >&2 "$(basename $0): Cannot find file '$FILE' in directory '$(pwd)'"
fi

Не забудьте дать разрешение на выполнение:

chmod +x /your/dir/set_MAGE_RUN_CODE.sh

Затем обновите свой код PHP:

<p>Previous switch: <strong><em>
    <?php echo `grep 'SetEnv MAGE_RUN_CODE=' ../.htaccess`; ?>
</strong></em></p>

<?php exec("/your/dir/set_MAGE_RUN_CODE.sh new_website", $sed_out, $sed_result); ?>

<p>Command <strong><em><?php echo $sed_cmd?></em></strong> yielded:
  <br />Return: <?php echo $sed_result; ?>
  <br />Printed:<strong><em><?php print_r($sed_out); ?>
</em></strong></p>

<p>New switch: <strong><em>
  <?php echo `grep 'SetEnv MAGE_RUN_CODE=' ../.htaccess`; ?>
</strong></em></p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...