
本文详细讲解如何通过 shell_exec() 从 php 向 bash 脚本传递参数,并重点强调参数转义以防止命令注入,确保执行安全可靠。
本文详细讲解如何通过 shell_exec() 从 php 向 bash 脚本传递参数,并重点强调参数转义以防止命令注入,确保执行安全可靠。
在 PHP 中调用外部 Bash 脚本并动态传参,是常见运维与自动化场景中的关键需求。核心方法是在 shell_exec() 中将变量作为命令行参数追加到脚本路径后,并在 Bash 脚本中通过 $1, $2 等位置参数接收。
✅ 正确传参方式(含安全防护)
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..
? Bash 脚本接收逻辑
对应脚本 /home/svradmin/scripts/testbash.sh 需具备可执行权限(chmod +x testbash.sh),内容如下:
#!/bin/bash
# 检查是否收到至少一个参数
if [ $# -eq 0 ]; then
echo "Error: No argument provided."
exit 1
fi
# 获取第一个参数
cmd_name="$1"
# 根据参数执行不同逻辑
case "$cmd_name" in
"fcn1")
echo "Hello World!! fcn1 has executed.."
;;
"fcn2")
echo "Hello World!! fcn2 has executed.."
;;
*)
echo "Unknown command: $cmd_name"
exit 2
;;
esac
⚠️ 关键注意事项
- 永远不要直接拼接未转义的用户输入(如表单数据、URL 参数):shell_exec("./script.sh $user_input") 极易导致远程代码执行漏洞;
- escapeshellarg() 是 PHP 提供的标准防护函数,它会为字符串添加单引号并转义内部单引号,确保参数边界清晰;
- 若需传递多个参数,可依次使用 $1, $2, $3,并在 PHP 中用 escapeshellarg() 分别处理每个变量;
- 建议在 Bash 脚本开头添加 set -u(报错未定义变量)和 set -e(任一命令失败即退出),提升健壮性;
- 生产环境应限制脚本执行权限(如使用专用低权限用户运行 PHP 进程),并避免脚本中调用 eval 或 source 不可信文件。
通过规范传参 + 严格转义 + 参数校验三重保障,即可安全、灵活地实现 PHP 与 Bash 的协同工作。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











