При запуске PHP-функции exec() на сервере Windows будет ли он передавать управляющие символы ASCII в оболочку?
Я хочу использовать PHP exec()
функция для запуска исполняемого файла на сервере Windows. Командная строка будет использовать управляющие символы ASCII в качестве разделителей для данных, передаваемых в исполняемый файл. Код, который у меня сейчас есть:
for( $i = 0; $i < $size; $i++ ){
$input .= $arg[$i];
$input .= "\037"; /* Unit Separator */
}
Это создает входные данные для C-программы из элементов массива, заданных в качестве параметра для инкапсулирующей функции. Я пишу слой абстракции, который позволит PHP-сценарию разгрузить часть своей более тяжелой обработки в C-программу для повышения эффективности и сделать это прозрачно с помощью простого вызова функции. Для этого я передам любые структуры данных, используемые в качестве входных данных для алгоритма в сериализованной форме, в стандартный поток ввода программы C, возможно, с использованием простой программы эха. Параметром этой эхо-программы будет весь сериализованный вывод. Чтобы сделать это, я должен быть уверен, что оболочка не будет обрезать какие-либо управляющие символы (я уже пробовал разделять входные элементы символами новой строки, и это приводило к преждевременному завершению командной строки). Я не очень хорошо знаком с тем, как работает Windows, так как я более привык делать вещи на платформе Unix.
1 ответ
Безопасный способ передачи произвольных данных в программу переменного тока - это использование proc_open()
и записать данные в дескриптор файла stdin недавно созданного процесса. Тогда оболочка вообще не связывается с данными. Кроме того, могут быть переданы произвольные двоичные данные, даже со встроенными нулевыми байтами.
Затем результат процесса может быть прочитан из файлового дескриптора, связанного с потоком файлов stdout процесса. Для получения дополнительной информации и примеров, см. Страницу руководства PHP для proc_open()
Вот