文档章节

PHP在Linux下运行Shell命令

kisshua
 kisshua
发布于 2014/06/05 14:22
字数 738
阅读 80
收藏 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
粉丝 31
博文 170
码字总数 34673
作品 0
武汉
后端工程师
私信 提问
crontab+flock实现定时检测进程状态并重启

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

贤郎--Querying
08/21
0
0
linux下shell编程(一)

介绍 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解...

笔阁
2016/05/05
601
1
Bash 通过特殊环境变量进行代码注入攻击

Bash 或Bourne again shell,是一个类UNIX shell 脚本,可能是Linux系统中最常见的安装组件。从1980年诞生到现在,bash 已经从一个简单的基于终端的命令解释器演进到诸多其他的奇特用途。 在...

Scholer
2014/09/25
5.8K
24
16个桌面Linux用户必须要知道的Shell命令

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

王振威
2012/05/06
0
28
php linux 脚本语法解释

#!/usr/bin/env php 表示用php 解析器去执行下面的命令,env 指的是环境变量,这里是为了系统通用,若写死路径后,切换到另外一个系统就无法运行。 参考链接: https://www.cnblogs.com/zqif...

qimh
07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链安全 - 以太坊短地址攻击

1 基础知识 EVM虚拟机在解析合约的字节码时,依赖的是ABI的定义,从而去识别各个字段位于字节码的什么地方。关于ABI,可以阅读这个文档: https://github.com/ethereum/wiki/wiki/Ethereum-C...

HiBlock
20分钟前
1
0
自定义函数及内部函数

变量的作用域 局部变量 global $Global及其他超全局数组 静态变量 仅初始化赋值 保留于内存直到response才销毁 global和static变量的区别 global:局部变量全局话 static:定义静态局部变量 函...

关元
21分钟前
1
0

中国龙-扬科
33分钟前
1
0
python包

https://www.lfd.uci.edu/~gohlke/pythonlibs/

陆朋
43分钟前
1
0
一文弄懂“分布式锁”,一直以来你的选择依据正确吗?

本文主要会关注的问题是“分布式锁”的问题。 多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。 常见的分布式锁实...

Java干货分享
51分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部