如何在PHP中运行函数exec



我无法在代码中添加*来查找文件

这个代码工作

exec("mediaconvert -t wav -i /home/20220228/11/23401.rec -o /var/www/html/test.mp3");

如果我加一个*,它就不起的作用

exec("mediaconvert -t wav -i /home/20220228/11/*01.rec -o /var/www/html/test.mp3");

path中的p.s.只有一个文件,当我尝试从shell执行此代码时,它就可以工作了。请帮帮我(

文件名扩展和其他bash特定功能可能/不会在其他shell(例如标准POSIX(中工作。如果带有*的命令没有在bash/compatible中执行,它将无法按预期工作。您需要验证PHP安装在.中执行命令的环境/shell

运行以下测试脚本:

<?php
exec('echo "$SHELL"', $out); 
var_dump($out);

当我直接在CLI上运行PHP脚本时,我会得到被调用的shell的"/bin/bash"。当我通过浏览器运行它时,奇怪的是我得到了"/sbin/nologin"。对于通过浏览器调用执行PHP的用户apache有不同的环境;实际的";用户通过SSH登录。默认情况下,Apache用户无法使用Bash-shell。

这些结果来自运行Apache 2.4/PHP 8.1.4的Centos7服务器。您的里程数可能有所不同底线:如果您正在执行的命令依赖于bash特定的功能,那么它必须在bash环境或其他支持所需功能的shell中执行。

如果bash不可用,您的另一个选项是使用例如glob来获取目录中与模式匹配的文件,然后在为每个特定文件执行命令时对它们进行循环。


编辑:正如@Sammitch所指出的(见评论(,/sbin/nologin是一个常见的";外壳名称";非登录用户的选项,并且很可能使用/bin/sh。这应该仍然允许文件名扩展/globbing。使用exec('ls *.php', $out);测试浏览器脚本调用-通配符函数如预期。


您可能会发现这个问题/答案很相关:使用php-exec启动带有大括号扩展的linux命令

我建议您反其道而行之。首先,获取要输入的文件,然后执行。例如:

$input_files = ...
exec("mediaconvert -t wav -i " . $input_files . " -o /var/www/html/test.mp3");

您可以尝试使用glob()函数查找文件,然后可以使用exec((。您可以使用以下代码尝试类似的解决方案:

$input_files = '/home/20220228/11/*01.rec';
foreach (glob($input_files) as $filename) {
exec("mediaconvert -t wav -i " . $filename . " -o /var/www/html/test.mp3");
}

相关内容

  • 没有找到相关文章

最新更新