Я выполняю следующее в приложении 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 перед тем, как он выполнит эту команду, стоит ли рассуждать, что мне нужно учитывать оба escape файла? Или это не так, как это работает?