我无法在代码中添加*来查找文件
这个代码工作
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");
}