首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在apache服务器上通过php执行bash文件

在apache服务器上通过php执行bash文件
EN

Stack Overflow用户
提问于 2016-06-10 19:00:35
回答 1查看 1K关注 0票数 1

因此,我在apache服务器上托管了一个网页,当用户通过PHP和AJAX按下按钮时,我试图运行一些python和bash脚本。

现在,我的php文件在python (位于/var/www/html中)执行,该脚本反过来执行bash文件(位于root/files中)。

在终端中手动执行此操作时,所有操作都非常正常。

但是,当我试图通过网页实现这个目标时,bash脚本不会被执行。

(我不能将bash脚本放在/var/www/html中,因为它具有将git存储库克隆到服务器的命令,并且它给出的私钥在放置在那里时不应该是公共错误)

我已经尝试了这个答案中的一些建议,将www-data添加到sudoers中,但它仍然没有像预期的那样工作。

如能对此提供任何帮助,将不胜感激。谢谢

PHP文件:

代码语言:javascript
复制
if(isset($_POST['timestamp']))
{
$uid = $_POST['timestamp'];
echo "Please wait while the app is being generated".$uid;
exec("python /var/www/html/appgenserver.py $uid");

appgenserver.py

代码语言:javascript
复制
#! /usr/bin/env python
import os
import json,sys
from firebase import firebase
import requests
import subprocess


arg = sys.argv[1]
# Path to be created
path = "/root/files/"+str(arg)
print path
if not os.path.exists(path):
os.makedirs(path)     #Gets executed
subprocess.call(['/root/Final/clone.sh', path)   #Not getting executed
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 19:33:57

最可能的原因是bash脚本本身是不可执行的,它只是一个普通的文本文件。

你的狂欢(也许还有appgenserver.py?)可能位于/root下,apache可能以非私密用户(如www-data )的身份运行,该用户既不能访问您的python脚本,也不能访问python将运行的bash。

考虑使用脚本作为参数调用bash。

代码语言:javascript
复制
#! /usr/bin/env python
import os
import json,sys
from firebase import firebase
import requests
import subprocess


arg = sys.argv[1]
path = "/root/files/"+str(arg)
print path
if not os.path.exists(path):
    os.makedirs(path)
subprocess.call(['/bin/bash', '/root/Final/clone.sh', path)

现在,这不是最漂亮的解决方案。

但是您之前得到的可能是背景中的一般“拒绝权限”错误(请查看您的/var/log/apache/error.log)。

这样做是将/bin/bash作为子进程启动,第一个参数是要执行的脚本。

但是这里有零错误处理,并且不能与进程进行很大的交互。

不妨考虑做这样的事情:

代码语言:javascript
复制
import subprocess

handle = subprocess.Popen(['/bin/bash', '/root/Final/clone.sh', 'parameter'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
while handle.poll() is None:
    print(handle.stdout.read()) # There's some optimizations here to be done as well so it's not a blocking call etc.

handle.stdout.close()
handle.stdin.close()

最后一条建议是,如果您要将/root/ 集成到web前端/后端类型的东西中,那么就不要在中放置它。

你在自找麻烦

另一种方法是利用sudo。

如果您在PHP中修改您的exec()以运行exec("sudo ..."),并使您的web用户能够在没有密码提示的情况下运行脚本,那么它可以工作。

考虑到这一点,不建议给予www-data sudo访问权,而是这样做:

代码语言:javascript
复制
# useradd -m -G www-data -s /bin/bash wwwexec
# echo "myuser ALL=NOPASSWD: /usr/bin/python" >> /etc/sudoers

并将PHP脚本更改为具有以下内容:

代码语言:javascript
复制
exec("sudo -u wwwexec python /var/www/html/appgenserver.py $uid");

这样,您的整个web服务至少不会通过默认用户名获得根访问权。

如何做到这一点

而是将您的appgenserver.py放在/var/www/cgi-bin/下,并在.py配置中为.py创建一个CGI钩子,并将用户交给您访问CGI脚本的URL。

这样,一切都应该按照最佳实践,即使是理论上,你可以得到你原来的解决方案的工作。

例如,本指南应该让您开始工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37755463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档