
PHP 的 exec() 等函数默认不调用 Shell 解释器(如 bash/sh),因此无法直接解析 > 重定向符号;必须显式通过 sh -c 启动 Shell 才能支持管道、重定向等 Shell 特性。
php 的 `exec()` 等函数默认不调用 shell 解释器(如 bash/sh),因此无法直接解析 `>` 重定向符号;必须显式通过 `sh -c` 启动 shell 才能支持管道、重定向等 shell 特性。
在 PHP 中调用外部命令时,exec()、system()、passthru() 和 shell_exec() 默认不经过 shell 解析器——它们直接调用 fork() + execve() 执行指定程序,绕过了 /bin/sh 对操作符(如 >, |, &&)的解释。因此,像 echo Hallo > /tmp/testtt.txt 这样的命令会被当作 单个可执行文件名 处理(系统会尝试查找名为 echo Hallo > /tmp/testtt.txt 的程序),自然失败且不会创建文件。
✅ 正确做法是显式调用 shell 并传入命令字符串:
<?php
error_reporting(E_ALL);
echo "<HTML><BODY>";
// ✅ 正确:通过 sh -c 让 shell 解析重定向
exec('sh -c "echo Hallo > /tmp/testtt.txt"', $output, $retval);
echo "Rückgabe mit Status $retval und Ausgabe:<br/>";
foreach ($output as $s) {
echo htmlspecialchars($s) . "<br/>";
}
echo "</BODY></HTML>";
?>⚠️ 注意事项:
- 使用 sh -c 时,命令需作为单个字符串参数传入(推荐用单引号包裹,避免 PHP 提前解析变量或转义);
- 若命令中含用户输入,务必严格过滤或使用 escapeshellarg() 防止命令注入;
- /tmp 权限(drwxrwxrwt)本身无问题(sticky bit + world-writable),但需确认 Web 服务器进程(如 www-data、apache)对该路径有写权限;
- 替代方案:使用纯 PHP 文件操作(更安全、更可控):
file_put_contents('/tmp/testtt.txt', "Hallo\n");
? 总结:PHP 的进程执行函数 ≠ Shell 终端。需要 Shell 功能(重定向、管道、变量扩展等),就必须显式调用 sh -c 或 bash -c;否则,请优先考虑原生 PHP 函数替代,兼顾安全性与可维护性。
立即学习“PHP免费学习笔记(深入)”;



















