php执行shell,返回空

53 篇文章 0 订阅

问题:以下shell脚本在 www 用户下执行 sudo /usr/local/webserver/nginx/sbin/nginx -t 是有返回结果的,但用http://localhost/nginx.php?act=test 访问是看不到返回值,shell指令都没执行,safe-mode 是off的,不知为何,请教高人了?
nginx.php代码如下:
<?php
if(isset($_GET['act'])&&!empty($_GET['act'])){
  if($_GET['act']=='test'){
     $message=shell_exec("sudo /usr/local/webserver/nginx/sbin/nginx -t");
     echo "测试结果:".$message;
  }elseif($_GET['act']=='restart'){
     $message=shell_exec("sudo /usr/local/webserver/nginx/sbin/nginx -s reload")
;
     echo "重启结果:".$message;
  }
}else{
  header("Status: 404 Not Found");
}
?>


回复:我一开始也为这个问题迷惑不解,为何 php cgi以www用户执行sudo ls -al / 命令就可以正常输出,而执行

sudo /usr/local/webserver/nginx/sbin/nginx -t 却没有输出?

没有任何输出,导致我们无法跟踪错误的原因,那么,使用Linux标准输出重定向,看看有无输出,我的php代码是(设置/wwwroot/log.txt权限为777):
/wwwroot/index.php
<?php
$s = shell_exec("/usr/bin/sudo /home/nginx/sbin/nginx -t >/wwwroot/log.txt");
echo $s;

请求http://localhost/index.php, 发现log.txt文件是空白的,即没有正常输出,那说明有可能发生了错误,为此,我再尝试使用Linux的标准错误输出重定向:
$s = shell_exec("/usr/bin/sudo /home/nginx/sbin/nginx -t 2>/wwwroot/log.txt");

注意重定向符号前的2

再请求index.php 这时,在log.txt中记录了详细的错误:
sudo: sorry, you must have a tty to run sudo

这个错误我没见过,大致意思说,当执行sudo时,必须要从终端登录(可能nginx本身的一些限制)

google搜索这个错误提示, 解决办法也很简单:
注释掉 /etc/sudoers中 ‘Defaults requiretty’ 这个就行,即前面加#

按这个办法处理,浏览器仍然没有任何输出,我的猜测:可能是nginx启动程序输出目标是终端,那么折衷的办法就是使用输出重定向了,所以,改造的代码如下:
index.php
<?php
$trace="/wwwroot/log.txt";

if(!is_writable($trace) || !is_readable($trace)) {
    exit("$trace must readable and writable");
}

file_put_contents($trace,'');

echo `/usr/bin/sudo /home/nginx/sbin/nginx -t >$trace 2>&1`;

echo `top -b -n 1`;
echo file_get_contents($trace);


这是通过简接方式来观察输出的,类似这个现象的,还有使用top命令查看系统负载,top命令需要在终端窗口中执行,使用php执行shell_exec("top -n 1"),给出的错误就是TERM environment variable not set. 解决办法就是使用-b参数执行top, 即shell_exec("top -b  -n 1")

如果你有更好的方法,欢迎一起探讨,如果实验成功,也就可以通过web页面控制nginx了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP可以通过几种方式来执行shell脚本。其中一种方式是使用`shell_exec`函数,它可以执行shell命令并返回输出结果。例如,可以使用以下代码执行shell脚本并将结果输出: ```php $output = shell_exec('ls -l'); echo $output; ``` 此代码将执行`ls -l`命令,并将结果输出到屏幕上。 另一种方式是使用`exec`函数,它可以执行shell命令并将结果存储在一个数组中。以下是一个示例代码: ```php $shell = "bash dig.sh"; exec($shell, $result, $status); $shell = "<font color='red'>$shell</font>"; echo "<pre>"; if ($status) { echo "shell命令{$shell}执行失败"; } else { echo "shell命令{$shell}成功执行, 结果如下<hr>"; print_r($result); } echo "</pre>"; ``` 在这个示例中,`bash dig.sh`是要执行shell脚本,`exec`函数会将脚本的输出存储在`$result`数组中,并且`$status`变量会保存shell命令的执行状态。最后,代码会打印输出结果并根据执行状态判断命令是否执行成功。 还有一种方式是使用`system`函数,它也可以执行shell命令并将输出直接输出到屏幕上。以下是一个示例代码: ```php $shell = "bash dig.sh"; echo "<pre>"; system($shell, $status); echo "</pre>"; $shell = "<font color='red'>$shell</font>"; if ($status) { echo "shell命令{$shell}执行失败"; } else { echo "shell命令{$shell}成功执行"; } ``` 这段代码与之前的示例类似,`system`函数将执行shell命令并将结果直接输出到屏幕上。同时,可以通过`$status`变量判断命令是否执行成功。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [如何用PHP执行shell 脚本和 shell命令](https://blog.csdn.net/weixin_45312916/article/details/128985210)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [PHP执行Shell脚本或Bash脚本文件并返回命令输出详情](https://blog.csdn.net/m0_47207594/article/details/127583057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值