PHP 执行bash脚本,从PHP脚本执行一个Bash脚本

从PHP脚本执行一个Bash脚本

我想从PHP脚本执行系统上的Bash脚本。 我在系统上有两个脚本。 其中一个是名为client.php的PHP脚本,它存在于/ var / www / html,另一个是名为testscript的Bash脚本,它存在于/ home / testuser。

我的client.php脚本看起来像

<?php $message=shell_exec("/home/testuser/testscript 2>&1"); print_r($message); ?>

我的testscript看起来像

#!/bin/bash echo "Testscript run succesful"

当我在terminal上做以下事情

php client.php

我在terminal上得到以下输出

Testscript run successful

但是,当我打开页面

http://serverdomain/client.php

我得到以下输出

sh: /home/testuser/testscript: Permission denied

即使在执行了chmod + x testscript之后,我仍然得到这个错误。

我怎样才能从浏览器中工作? 请帮忙。

我将在WWW文件夹下有一个名为脚本的目录,这样它就无法从networking访问,但是可以通过PHP访问。

例如/var/www/scripts/testscript

确保您的testscript的用户/组与您的testscript相同。 例如,如果你的client.php属于apache:apache ,用chown把bash脚本改成同一个用户/组。 您可以通过执行ls -al来了解您的client.php和web文件是什么。

然后运行

<?php $message=shell_exec("/var/www/scripts/testscript 2>&1"); print_r($message); ?>

编辑:

如果你真的想要从一个Web服务器作为根运行一个文件,你可以尝试下面的二进制包装。 看看这个解决scheme,你想做同样的事情。

通过PHP执行根命令

没有真正知道设置的复杂性,我喜欢sudo路线。 首先,你必须configurationsudo以允许你的web服务器sudo以root身份运行给定的命令。 然后,你需要有脚本,Web服务器shell_exec(testscript)用sudo运行命令。

对于Apache和sudo的Debian框:

configurationsudo:

以超级用户身份运行以下命令以编辑sudo的新/专用configuration文件:

visudo -f /etc/sudoers.d/Webserver

(或者你想在/etc/sudoers.d/调用你的文件)

将以下内容添加到文件中:

www-data ALL = (root) NOPASSWD:

其中是您需要能够以其名称中的完整path(例如chown可执行文件的/bin/chown )以root身份运行的命令。 如果可执行文件每次都以相同的参数运行,则可以在可执行文件的名称后面添加它的参数,以进一步限制它的使用。

例如,假设我们总是要复制/ root /目录中的同一个文件,我们将写下如下内容:

www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2

修改脚本(testscript):

编辑你的脚本,使得sudo出现在需要root权限的命令(比如说sudo /bin/chown ...或者sudo /bin/cp /root/test1 /root/test2 )之前。 确保sudoconfiguration文件中指定的参数与此文件中的可执行文件使用的参数完全匹配。 所以,对于我们上面的例子,我们将在脚本中有以下内容:

sudo /bin/cp /root/test1 /root/test2

如果仍然拒绝权限,则脚本文件和父目录的权限可能不允许Web服务器执行脚本本身。 因此,您需要将脚本移动到更合适的目录和/或将脚本和父目录的权限更改为允许通过www-data(用户或组)执行,这超出了本教程的范围。

记住:

在configurationsudo时,目标是允许命令以最受限制的forms出现。 例如,如果参数是/ root / test1 / root / test2 ,则不允许一般使用cp命令,而只允许cp命令。 这意味着cp的参数(和cp的function不能改变)。

这是一个简单的问题。 当你从terminal运行时,你正在从terminal运行php文件作为特权用户。 当你从你的web浏览器转到php时,php脚本将作为web服务器用户运行,它不具有执行主目录中文件的权限。 在Ubuntu中,www-data用户是apache web服务器用户。 如果你使用的是Ubuntu,你需要做以下的事情:chown yourusername:www-data / home / testuser / testscript chmod g + x / home / testuser / testscript

上面所做的是将文件的用户所有权转让给你,并给予它的Web服务器组所有权。 下一个命令给组提供文件的可执行权限。 现在下一次你从浏览器开始,它应该可以工作。

我在这个问题上挣扎了三天。 我已经将脚本的权限设置为755.我一直在调用我的脚本,如下所示。

我的脚本如下。

#!bin/bash find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

我没有得到任何输出或反馈。 我为了让脚本运行而做的改变是在脚本中添加一个cd到tmp:

#!bin/bash cd /tmp; find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

这比运气好得多,但现在运作得很好。 我希望这有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值