Выполните внешнюю команду, передав массив с пробелами в именах файлов

StackOverflow https://stackoverflow.com/questions/2124091

Вопрос

У меня есть PHP-скрипт, которому необходимо выполнять программы, которые будут работать с файлами, имеющими пробелы в именах.Большинство функций PHP для выполнения внешних команд (например exec()) примите 1-строковый аргумент для выполнения командной строки.Однако затем вы должны сделать такие вещи, как escapeshellarg() чтобы сделать ваш ввод безопасным.

Есть ли какой-нибудь способ выполнить внешнюю команду в PHP с помощью массива.Так что вместо того , чтобы:

exec("ls -l ".escapeshellarg($filename));

Я могу пойти:

exec(array("ls", "-l", $filename));

Это означало бы, что мне не нужно беспокоиться об избежании аргументов.Я хочу избежать использования escapeshellarg(), поскольку в версии, которую я использую, есть ошибка, из-за которой удаляются символы, отличные от ASCII.

Java обладает такой функциональностью http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang .Строка[]%29

Это было полезно?

Решение

Похоже, это невозможно со встроенными функциями PHP.

Другие советы

function myExec ( command, arguments )
{
    exec( command + ' ' + implode( ' ', array_map( escapeshellarg, arguments ) ) );
}

Ответ Poke хорош - однако, сколько команд им нужно выполнить?Я бы подумал о внедрении белого списка команд и аргументов - таким образом, вы можете быть чертовски уверены, что они не являются вредоносным вводом.Что - то вроде:

$whitelistCommandArray = array('ls' => 'ls', ...);
if (isset($whitelistCommandArray[$userSuppliedCommand]])
{
    //ok its a valid command, lets parse the args next
    ...
}
else echo "Unsupported command";

Обновлять / редактировать:

Возможен ли создание белого списка аргументов?Что делать, если OP нужно отредактировать множество файлов?– Матчу

хех, я не знаю - это могло бы быть - полностью зависит от ваших потребностей.

$whitelistArray = array('ls' => array('a', 'l', 'h'), ...);

Что-то подобное работает - как с командой, так и с массивом аргументов для нее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top