Php 通过传递一个数组(文件名中有空格)来执行外部命令

Php 通过传递一个数组(文件名中有空格)来执行外部命令,php,shell,escaping,execute,external-process,Php,Shell,Escaping,Execute,External Process,我有一个PHP脚本,需要执行一些程序,这些程序将在名称中有空格的文件上运行。大多数用于执行外部命令的PHP函数(例如,exec())都使用1字符串参数作为命令行的执行参数。但是,为了确保输入的安全,您必须执行类似于escapeshellarg()的操作 是否有某种方法可以在PHP中使用数组执行外部命令。因此,不是: exec("ls -l ".escapeshellarg($filename)); 我可以去: exec(array("ls", "-l", $filename)); 这意味着我

我有一个PHP脚本,需要执行一些程序,这些程序将在名称中有空格的文件上运行。大多数用于执行外部命令的PHP函数(例如,
exec()
)都使用1字符串参数作为命令行的执行参数。但是,为了确保输入的安全,您必须执行类似于
escapeshellarg()
的操作

是否有某种方法可以在PHP中使用数组执行外部命令。因此,不是:

exec("ls -l ".escapeshellarg($filename));
我可以去:

exec(array("ls", "-l", $filename));
这意味着我不必担心逃避争论。我想避免使用
escapeshellarg()
,因为我使用的版本有一个去除非ASCII字符的错误


Java有这个功能

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'), ...);

类似的东西可以工作-同时使用命令和一系列参数。

听起来PHP的内置函数不可能做到这一点。

我知道这是显而易见的,但对于其他人来说:永远不要运行基于用户输入的外部命令。如果脚本不在任何web服务器上,很好,但除此之外,请确保您检查、重复检查并再检查5次,以确保任何人都无法使用此脚本执行他们不应该执行的任何命令。这是一个很好的建议,但我希望避免使用escapeshellarg()(我已相应地更新了问题)。我使用的版本有一个去掉非ASCII字符的错误。请随意用任何其他能够正确过滤字符的函数(例如,自己定义一个)替换该函数。我只是想给你一个方法:)一个白名单的论点可行吗?如果OP需要编辑大量文件怎么办?是的,我确实需要这个脚本在数千个文件上运行,这些文件可以被命名为任何名称,并且几乎可以肯定它们的名称中会有空格。您仍然可以使用pcntl_fork/pcntl_exec函数的组合。为了获得程序的输出,您必须处理临时文件,因为(听起来)没有管道(2)函数:)
$whitelistArray = array('ls' => array('a', 'l', 'h'), ...);