2010-01-23 1 views
2

У меня есть 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

+1

Я знаю, это очевидно, но для всех, кто приходит: НИКОГДА не запускайте внешние команды на основе пользовательского ввода. Если скрипт не находится на каком-либо веб-сервере, отлично, но в противном случае убедитесь, что вы проверяете, проверяете и проверяете еще 5 раз, что никто не может использовать этот скрипт для выполнения любой команды, которой они не должны. – Matchu

ответ

2

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

+0

Вы по-прежнему можете использовать комбинацию функций pcntl_fork/pcntl_exec. Hovewer, чтобы получить выход программы, вам приходится иметь дело с временными файлами, поскольку (звучит) нет функции pipe (2) :) – alvelcom

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

Хорошее предложение, но я хочу избежать использования escapeshellarg() (я обновил вопрос соответственно). Версия, которую я использую, имеет ошибку, которая вырезает символы, отличные от ASCII. – Rory

+0

Не стесняйтесь заменять эту функцию любой другой функцией (например, определите ее самостоятельно), которая правильно фильтрует символы. Я просто хотел дать вам представление, как это сделать :) – poke

+0

Почему downvote btw? – poke

-1

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

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

Update/редактирование:

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

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

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

Что-то вроде этой работы - как с помощью команды, так и с массивом аргументов.

+0

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

+0

Да Мне нужен этот скрипт для работы на тысячах файлов, которые можно назвать чем угодно и почти наверняка будут иметь пробелы в их именах. – Rory

 Смежные вопросы

  • Нет связанных вопросов^_^