文档章节

PHP在Linux下运行Shell命令

kisshua
 kisshua
发布于 2014/06/05 14:22
字数 738
阅读 72
收藏 1

原本在本机开发PHP的时候,Shell调用一切正常。上线的时候才反应到线上的服务器对权限做了严格的控制,一顿折腾之后梳理出在严格权限控制的Linux上如何通过Nginx/Apache 以Web的方式调用Shell命令,比如调用java编译或者执行java程序。

Web服务器使用www用户启动。分为两种情况:一种是命令是通过root安装的,并不能直接把权限直接赋给www用户,比如/usr/local/nginx/sbin/nginx;一种是www用户对要执行的命令有绝对的权限,但是由于缺少某些环境变量,执行的程序如果用到了这些变量就得提前再次设定环境变量。

先说第一种,其实php.ini里面已经定义了不可以调用的命令,默认情况下exec, system之类都不能执行。首先要去php.ini里面把

disable_functions=

这一项里面定义的那些调用Shell脚本的函数移出列表,然后重启Nginx的PHP-PFM或者Apache。可以测试一下

<?php echo exec(“pwd”); ?>

正常情况下应该就可以看到当前的路径信息了。但是要想执行一些root才能执行的命令,比如重新加载Nginx配置文件,还需要一些额外的操作,这里参考http://bbs.chinaunix.net/thread-3693263-1-1.html

1、设置 sudo 配置文件 可写权限
chmod u+w /etc/sudoers

2、增加 www 用户的 nginx 脚本管理权限
www     ALL=(root)      NOPASSWD: /etc/init.d/nginx

3、关闭 【强制控制台登录】执行
【非常重要】,注释该行 我的问题就出在这里,开启了这个选项之后。在PHP中怎么调用,都没有执行结果
#Defaults    requiretty

4、还原 sudo 配置权限  440
【非常重要】,如果不还原权限。在PHP中怎么调用,都没有执行结果。
chmod u-w /etc/sudoers

5、调用php
$result2 = exec(“/usr/bin/sudo /etc/init.d/nginx stop”,$result);
var_dump($result);
var_dump($result2);

再看看如果调用Java编译并执行。www用户拥有对/work/java目录的执行权限。直接上代码:

Java的,文件名”TestJava.java”

public class TestJava{
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}

PHP的,文件名”test.php”

<?php

function del_file($file){
if(file_exists($file) && unlink($file) ){
echo “del “.$file.”<br />\r\n”;
}
}

function execute($exe){
echo $exe.”<br />\r\n”;
$r=exec($exe, $res);
var_dump($res);
echo “<br />———————-<br />\r\n”;
var_dump($r);
echo “<br />———————-<br />\r\n”;
}

$target_file = “TestJava.class”;
$output_file = “output.txt”;
$src=”/work/web/services.adsage.com/deploy/monitor/test/TestJava.java”;
$bin=”TestJava”;
$jcommon = “export JAVA_HOME=/work/java\nexport JRE_HOME=$JAVA_HOME/jre\nexport PATH=$JAVA_HOME/bin:$PATH\n/work/java/bin/”;
$javac=$jcommon.”javac “.$src;
$javab=$jcommon.”java “.$bin.” >> “.$output_file;
del_file($target_file);
del_file($output_file);

execute($javac);
execute($javab);

echo “final:<br />\r\n”;
$output=file_get_contents($output_file);
echo $output;
?>

通过Web浏览结果:

del TestJava.class
del output.txt
export JAVA_HOME=/work/java export JRE_HOME=/jre export PATH=/bin: /work/java/bin/javac /work/web/services.adsage.com/deploy/monitor/test/TestJava.java
array(0) { }
———————-
string(0) “”
———————-
export JAVA_HOME=/work/java export JRE_HOME=/jre export PATH=/bin: /work/java/bin/java TestJava >> output.txt
array(0) { }
———————-
string(0) “”
———————-
final:
Hello World!

 

本文转载自:http://www.shootsoft.net/221

共有 人打赏支持
kisshua
粉丝 30
博文 166
码字总数 34666
作品 0
武汉
后端工程师
crontab+flock实现定时检测进程状态并重启

Crontab 注:我们担心常驻进程(死循环)运行时出现不知名错误,而导致进程中断执行,通过crontab+flock保证常驻进程的中断之后重启 Flock 这条命令,第一次执行,可以发现几点 命令行会等待2...

贤郎--Querying
08/21
0
0
Crontab 让linux定时执行shell脚本

使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令。例如系统管理员安排一个备份任务使其每天都运行 入门 # crontab –e 这样可以已编辑模式打开个人的crontab配置文件,然...

酱醋茶丶
2015/07/31
0
0
Shell脚本编程30分钟入门

什么是Shell脚本 示例 看个例子吧: #!/bin/shcd ~mkdir shell_tutcd shell_tut for ((i=0; i<10; i++)); do done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到...

quanpower
2014/03/23
0
0
16个桌面Linux用户必须要知道的Shell命令

有些人仍然会有这中愚蠢的想法,他们认为使用Linux就必须使用Linux shell命令。胡说!你可以不懂得任何Linux命令,比如说ps,grep,ls等,但是你仍然可以使用很多现代的Linux桌面发行版。 Li...

王振威
2012/05/06
0
28
Linux下的Shell工作原理

Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序。它不 属于内核部分,而是在核心之外,以用户态方式运行。其基本功能是解释并 执行用户打入的各种命令,实现用户与Linux核心...

yhhedu
2014/05/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java中的移位运算符

国庆给自己放了个小长期二十几天,回来继续更新专栏 上一篇文章我们说了Java里的二进制,知道了计算机是以0和1来处理数据的,在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号...

SuShine
23分钟前
2
0
linux版QQ

下载地址在这 http://yun.tzmm.com.cn/index.php/s/XRbfi6aOIjv5gwj Appimage包不用做什么别的处理,安装啥的都不需要。。找到文件所在目录,终端中修改一下文件的权限 chmod 777 QQ-2017112...

悲催的古灵武士
28分钟前
1
0
咕泡-MyBatis 实用篇作业

1. Mapper在spring管理下其实是单例,为什么可以是一个单例? 首先,mapper 内部不包含 成员字段,无状态单例是安全的 另外,一直存在不用每次调用都new 一个新实例 2. MyBatis在Spring集成下...

职业搬砖20年
32分钟前
2
0
MQTT协议的初浅认识之连接建立

MQTT百科 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布...

亚林瓜子
48分钟前
1
0
OpenStack部署都有哪些方式

对于每一个刚接触到OpenStack的新人而言,安装无疑是最困难的,同时这也客观上提高了大家学习OpenStack云计算的技术门槛。想一想,自己3年前网上偶然接触到OpenStack时,一头茫然,手动搭建一...

tututu_jiang
49分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部