Выполните внешнюю команду, передав массив с пробелами в именах файлов
-
22-09-2019 - |
Вопрос
У меня есть 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'), ...);
Что-то подобное работает - как с командой, так и с массивом аргументов для нее.