Я выполняю следующее в PHP-приложении:
$source = '/home/user/file.ext';
$output_dir = $this->setOutputString();
chdir('/home/ben/xc/phplib/bgwatcher-2011a/a01/');
exec('php bin/createjob.php $source $output_dir', $output);
return $output[0];
Проблема в следующем: у меня есть контроль над $source
, но не $output_dir
, который является устаревшей файловой системой Windows, и в пути есть пробелы. Пример $output_dir
:
/home/vol1/district id/store id/this_is_the_file.html
Вставляя строку вывода в функцию exec()
, я попробовал оба:
addslashes($output_dir)
и '"' . $output_dir . '"'
для экранирования всей выходной строки. В первом случае путь соединяется с:
/home/vol1/districtthis_is_the_file.html
... где все между первым пробелом и именем файла сбрасывается. Во втором случае, exec()
, кажется, выбрасывает башмак и не работает должным образом - к сожалению, сообщение об ошибке теряется в оборудовании - я могу предоставить его, если это абсолютно необходимо, но у меня также есть ограничения по времени для найти решение.
Какое решение здесь? Я sprintf()
всю строку для exec()
? Я очень озадачен тем, почему addslashes
не работает правильно, чтобы избежать пробелов, и я предполагаю, что это как-то связано с очисткой с exec (), но я не могу найти какую-либо документацию для его резервного копирования.
Обновление: Я пробовал escapeshellarg () и preg_replace () безуспешно. Размышляя об этом дальше, нужно ли мне дважды уходить с пути? Или избежать пути и команды? Если путь не экранируется один раз exec () и один раз PHP перед выполнением команды, то понятно ли, что мне нужно учитывать оба выхода? Или это не так?