Выполнить внешнюю команду, передав массив с пробелами в именах файлов - PullRequest
2 голосов
/ 23 января 2010

У меня есть 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.String[]%29

Ответы [ 3 ]

2 голосов
/ 01 февраля 2010

Похоже, что это невозможно с помощью встроенных функций PHP.

1 голос
/ 23 января 2010
function myExec ( command, arguments )
{
    exec( command + ' ' + implode( ' ', array_map( escapeshellarg, arguments ) ) );
}
0 голосов
/ 23 января 2010

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

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

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

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

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

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

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

...