
本文详解如何通过 shell_exec() 从 php 向 bash 脚本传递参数,并强调使用 escapeshellarg() 防止命令注入,确保执行安全、逻辑清晰。
本文详解如何通过 shell_exec() 从 php 向 bash 脚本传递参数,并强调使用 escapeshellarg() 防止命令注入,确保执行安全、逻辑清晰。
在 Web 开发或系统自动化场景中,PHP 常需调用外部 Bash 脚本完成特定任务(如文件处理、服务管理等)。当脚本行为需根据 PHP 动态逻辑分支时,必须将变量安全传入 Bash 环境。核心方法是:将变量作为命令行参数传递给脚本,并在 Bash 中通过位置参数($1, $2…)接收。
✅ 正确实现方式
1. PHP 端:构造带参数的命令并转义
避免直接拼接字符串引发的安全风险(如空格、引号、分号导致命令截断或注入),务必使用 escapeshellarg():
function fcn1() {
$old_path = getcwd();
chdir('/home/svradmin/scripts');
$param = escapeshellarg('fcn1'); // 安全转义
$output = shell_exec("./testbash.sh $param");
chdir($old_path);
return $output;
}
function fcn2() {
$old_path = getcwd();
chdir('/home/svradmin/scripts');
$param = escapeshellarg('fcn2'); // 安全转义
$output = shell_exec("./testbash.sh $param");
chdir($old_path);
return $output;
}
echo fcn1(); // 输出:Hello World!! fcn1 has executed..
echo fcn2(); // 输出:Hello World!! fcn2 has executed..⚠️ 注意:escapeshellarg() 是关键防护措施——它会自动为参数添加单引号并转义内部特殊字符,即使传入含空格、$、' 或换行符的字符串也能安全执行。
2. Bash 端:接收并使用参数
脚本需明确读取 $1(第一个参数),并做基础校验以增强健壮性:
立即学习“PHP免费学习笔记(深入)”;
#!/bin/bash
# 检查是否传入参数
if [ $# -eq 0 ]; then
echo "Error: Missing function identifier"
exit 1
fi
func_name="$1"
case "$func_name" in
"fcn1")
echo "Hello World!! fcn1 has executed.."
;;
"fcn2")
echo "Hello World!! fcn2 has executed.."
;;
*)
echo "Unknown function: $func_name"
exit 2
;;
esac? 补充说明与最佳实践
-
路径处理更优写法:可改用绝对路径避免 chdir() 切换,提升可读性与稳定性:
$output = shell_exec("/home/svradmin/scripts/testbash.sh " . escapeshellarg('fcn1')); -
错误处理建议:shell_exec() 不返回错误信息,推荐结合 exec() 获取完整输出与返回码:
exec("./testbash.sh " . escapeshellarg('fcn1'), $output_lines, $return_code); if ($return_code !== 0) { error_log("Bash script failed with code: $return_code"); } 权限与环境注意:确保 PHP 进程用户(如 www-data)对脚本有执行权限(chmod +x testbash.sh),且脚本开头 #!/bin/bash 行存在且换行符为 LF(非 CRLF)。
通过以上结构化实现,你既能灵活控制 Bash 脚本行为,又能筑牢安全防线,适用于生产环境中的可靠集成。



















