在PHP中执行Shell命令遭遇引号问题求助
解决PHP中shell_exec执行curl的引号问题
方法一:修正shell命令的引号与变量解析问题
你的问题核心是单引号包裹的字符串里变量不会被PHP解析,同时shell命令里的JSON字符串需要正确转义引号,避免被shell截断。修正后的代码如下:
<?php $APP_ID = 38993011; $DESCRIPTION = "deneme"; $USER = "superuser"; // 先把JSON数据单独构造,用json_encode确保格式正确,避免手动转义出错 $postData = json_encode([ 'deployment' => [ 'revision' => 'REVISION', 'changelog' => '', 'description' => $DESCRIPTION, 'user' => $USER ] ]); // 用双引号包裹整个命令,这样变量能被解析;shell里的双引号要转义成\" $CMD = "curl -X POST \"https://superwebsite/v2/{$APP_ID}/supplements.json\" \ -H \"Api-Key:SAAK-EJRV2PDLKGES0L7NTT\" \ -i \ -H \"Content-Type: specification/json\" \ -d '$postData'"; $output = shell_exec($CMD); print($output); ?>
要点说明:
- 用
json_encode生成JSON数据,比手动写字符串更可靠,自动处理引号转义 - 整个命令用双引号包裹,PHP会解析里面的
{$APP_ID}变量 - JSON数据用单引号包裹在shell命令里,避免和外层的双引号冲突,同时shell不会解析单引号内的内容,保证JSON格式完整
方法二:用PHP原生curl扩展(更安全推荐)
直接调用shell命令存在命令注入风险(如果变量来自用户输入的话),更安全的方式是用PHP自带的curl扩展实现:
<?php $APP_ID = 38993011; $DESCRIPTION = "deneme"; $USER = "superuser"; // 构造POST数据 $postData = json_encode([ 'deployment' => [ 'revision' => 'REVISION', 'changelog' => '', 'description' => $DESCRIPTION, 'user' => $USER ] ]); // 初始化curl $ch = curl_init("https://superwebsite/v2/{$APP_ID}/supplements.json"); // 设置curl选项 curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Api-Key:SAAK-EJRV2PDLKGES0L7NTT', 'Content-Type: specification/json' ]); // 如果需要输出响应头(对应原curl的-i参数),添加以下选项 curl_setopt($ch, CURLOPT_HEADER, true); // 执行请求并获取结果 $output = curl_exec($ch); curl_close($ch); print($output); ?>
要点说明:
- 完全避免了shell命令的引号问题,所有参数都通过curl扩展传递
- 更安全,不会存在命令注入风险
- 便于调试和错误处理(可以用curl_error获取错误信息)
内容的提问来源于stack exchange,提问作者atsntc
相关产品推荐
相关产品推荐

