PHP中shell_exec执行cat /etc/*-release失败,但终端CLI执行正常的问题求助
PHP中shell_exec执行cat /etc/*-release失败,但终端CLI执行正常的问题求助
Hey John,我来帮你捋捋这个问题~
你遇到的核心矛盾是:同样的用户身份下,终端里能正常运行cat /etc/*-release,但PHP用shell_exec()执行就提示文件不存在,不过whoami这类简单命令却能正常工作。
问题根源
PHP的shell_exec()默认调用的是系统的/bin/sh(非交互式、非登录shell),而你在PuTTY终端里使用的大概率是bash(可以在终端里敲echo $SHELL确认)。两者在通配符解析逻辑上有差异:
- 终端里的bash会先把
/etc/*-release中的*展开成所有匹配的实际文件(比如/etc/os-release、/etc/lsb-release),再传给cat执行; - 而
/bin/sh可能没有正确处理这个通配符,直接把/etc/*-release当作一个完整的文件名,自然找不到对应的文件。
解决方案
直接在命令里指定用bash来执行,让它和你终端的执行环境一致,修改代码如下:
$p = shell_exec('bash -c "cat /etc/*-release 2>&1"');
额外验证
你可以在PHP里执行这句代码,看看当前shell的类型,和终端的结果对比:
echo shell_exec('echo $SHELL');
终端里执行echo $SHELL应该会返回/bin/bash,而PHP默认返回的可能是/bin/sh,这也能印证我们的判断。
之前你尝试修改PATH其实是绕错了方向,这个问题和环境变量路径无关,核心是shell的类型和通配符解析逻辑差异导致的~
备注:内容来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

