PHP调用Shell命令可用于服务器管理与自动化,常用方法包括:1. exec()执行命令并返回最后一行输出,第二参数获取完整输出数组;2. system()直接输出结果到终端,适合实时查看;3. passthru()适用于二进制数据输出;4. shell_exec()以字符串形式返回完整输出;5. popen()实现单向管道通信,支持持续输入输出;6. proc_open()提供stdin、stdout、stderr的完全控制,适用于复杂交互。使用时需对用户输入用escapeshellarg()和escapeshellcmd()转义,避免命令注入,禁用高危函数并限制权限,确保安全。

PHP 与 Shell 的交互在服务器管理、自动化脚本、系统监控等场景中非常实用。通过 PHP 调用 Shell 命令,可以执行外部程序、读取命令输出、传递参数,甚至实现双向通信。下面介绍几种常用方式及其使用场景。
exec() 是最基础的函数之一,用于执行一个外部命令并返回最后一行输出。
示例:
$command = "ls -l /tmp";
$output = exec($command, $outputLines, $returnCode);
echo "返回码: $returnCode
";
print_r($outputLines); // 所有输出行
注意:exec() 只返回最后一行结果,但第二个参数可接收完整输出数组。适合获取结构化输出。
system() 执行命令并将输出直接打印到浏览器或终端,适合实时查看命令结果。
立即学习“PHP免费学习笔记(深入)”;
示例:
system("whoami", $status);
if ($status === 0) {
echo "命令执行成功";
}
passthru() 更适合处理二进制数据(如生成图片、PDF),它原样输出命令结果,不作任何解析。
shell_exec() 将命令执行后的所有输出以字符串形式返回,使用反引号 `` 或函数调用均可。
示例:
$output = shell_exec('date');
echo "当前时间: $output";
该方法简洁,适合需要捕获完整输出内容的场景。
当需要持续输入或输出时,popen() 可打开一个指向进程的管道。
示例:向命令输入数据
$fp = popen('grep "error" ', 'w');
fwrite($fp, "info: all good\n");
fwrite($fp, "error: something wrong\n");
pclose($fp);
这里将多行文本传给 grep 命令,实现过滤。'w' 表示写入子进程,'r' 表示读取其输出。
最强大的方式是 proc_open(),支持 stdin、stdout、stderr 的完全控制,可用于复杂交互。
示例:双向通信
$descriptors = [
0 => ["pipe", "r"], // stdin
1 => ["pipe", "w"], // stdout
2 => ["pipe", "w"] // stderr
];
$process = proc_open('/bin/bash', $descriptors, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], "echo Hello from shell\n");
fwrite($pipes[0], "exit\n");
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($process);
}
这种方式适用于需要登录交互式环境、执行多个命令的场景。
调用 Shell 命令存在风险,尤其是用户输入未过滤时。
以上就是PHP命令怎么与Shell交互_PHP与Shell脚本交互执行与管道通信的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号