PHP脚本无法运行bash脚本。sh:权限被拒绝


14

我正在尝试从PHP执行.sh脚本,但是未执行。

我检查了错误日志,并收到“ sh:权限被拒绝”错误。我检查了在哪个用户php下运行,并且它是在apache用户下完成的。

我尝试将.sh的所有权更改为apache用户,但是没有结果。

我最初以为这是因为脚本位于www / dir之外,但是即使将脚本放在同一目录中,仍然会出现错误。

除了将apache用户添加到SUDOers列表之外,还有其他解决方案吗?

如果我使用'php filename.php'命令从腻子启动sh脚本,它将运行良好。


3
它是Shell脚本还是PHP文件?您的最后一段不清楚。另外,您是否x在文件上设置了执行权限()?您是否在shebang行中指定了脚本解释器?
丹尼尔·贝克

这是从PHP运行的bash脚本。是的,我确实使其成为可执行文件,并且确实指定了脚本解释器。当我从腻子执行PHP脚本并且bash脚本被调用并正确运行时,它可以正常工作。但是,如果我从Webbrowser运行php脚本,它将无法运行bash脚本,并且会出现此错误,因为它以apache用户而不是我在腻子中使用的用户身份运行。
罗宾·普雷斯托

1
尝试chmod 775 yourscript.sh。这将赋予r-x该文件“其他”用户(读取和执行)权限。
Rhyuk

我尝试过这个。不走运..直到明天我才能知道确切的原因。我无法从我的位置访问日志。我会回头给你们的。谢谢您的帮助。:)
罗宾普雷斯托

Answers:


10

尝试以下建议:

  • 尝试在测试命令下运行,并检查其是否有效:
    • php -r "echo exec('whoami');"
  • 确保所有父目录和文件至少具有r-x标志权限:
    • chmod 755 dir; chmod 755 file
  • 确保文件的所有者是您的Apache用户
    • 还尝试向文件添加+s标志(sudo)(不推荐):
      • chmod u+s file
  • 确保您的PHP未在中运行safe_mode
  • 确保该脚本位于您的Apache根目录内:
    • 否则,将脚本移入其中,
    • 或将该目录添加到您的Apache配置中,
    • 或将此目录添加到您的中include_path,例如:
      • php.ini 文件: include_path ".:/usr/local/lib/php:/your/dir"
      • .htaccess文件:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • 检查您的shell是否设置为/bin/sh对Apache用户有效(例如)(例如,使用:进行检查finger)。
  • 确保您php.ini不使用:disable_functions用于exec功能
  • 如果使用SELinux或已selinux-utils安装(增强安全性的Linux系统),请按照@Tonin答案中的说明进行检查getenforce/ setenforce配置。

故障排除:

  • 如果您更改了php.inihttpd.conf文件,请不要忘记重启Web服务器,
  • 检查您的Apache错误日志以获取更多详细信息。
  • 启用你的php.ini所有类型的错误(的display_errorerror_reporting等等)。

1
那是我的问题..父目录没有执行权限...现在可以使用!谢谢!:)
罗宾·普雷斯托

我还是没有运气:(有什么建议吗?```[root @ kiwi tmp]#ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep'^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x。27 root root 4096 Sep 3 12:31 / drwxrwxrwt.4 root root 4096 Sep 3 15:45 / tmp -rwxr-xr-x.1 root root 24 Sep 3 15:39 / tmp / sleep safe_mode =关闭include_path =“ / tmp:/ home / kiwi_build”```
pihentagy 2015年

1
恩,setenforce解决了它。OMG
pihentagy 2015年

13

此类问题可能取决于您使用的操作系统以及其配置方式。某些Linux发行版(主要是基于RHEL的发行版,如CentOS或Fedora)在默认情况下带有SELinux。可以使用以下命令检查并临时更改它:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

您还可以通过以下方式对当前配置有更完整的了解:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

可以通过编辑/etc/selinux/config文件并将此SELINUX变量设置为permissive或来使此更改永久生效disabled

但是,解决这种问题的正确方法(如果确实如此)是检查/var/log/audit/audit.log日志文件。它将包含与SELinux规则有关的所有事件。然后,您可能应该为脚本提供正确的上下文,即被apache / php用户授权运行。使用以下方法检查SELinux安全上下文ls -Z

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

此列表列出了每个文件/目录的用户,角色和类型。在这里,该httpd_sys_script_exec_t类型使cgi目录中的文件具有由httpd执行的权限。您的shell脚本可能应该具有相同的类型。

您还可以将这些audit.log行输入audit2allow命令。它将输出使SELinux满意所需的更改。但是通常建议的更改需要在SELinux策略本身上完成,这不是您应做的事情(不过,此输出可以为正在发生的事情提供一些线索)。

以下页面描述了类似的问题以及解决此问题的不同方法:http : //sheltren.com/stop-disabling-selinux


感谢您的详细答复!las,就像我提到的那样,直到明天我才能拥有root用户访问权限。因此,我也将尽快与您联系!:)是的,我正在使用CentOS。
罗宾·普雷斯托

我喜欢您的回答,非常有帮助!不幸的是,我没有选择您的,因为强制执行已被禁用,这不是问题。尽管我确实从您的回答中学到了很多东西,但还是谢谢您。当我获得足够的声誉时,我会投票支持您:)
罗宾·普雷斯托

不用担心,很高兴得知您从我的帖子中学到了!
Tonin

如果问题出在问题上,那么到底发生了什么并不十分明显。它挽救了我的一天!
pihentagy 2015年

1

因此,我在Google上搜索了类似的问题后才来到这里。我想放弃关于SELinux的评论为我指明了正确的方向。

就我自己而言,我使用的是使用shell命令的自定义Git部署脚本。该命令在BASH上运行良好,但是在Git上具有“权限被拒绝”和“不是存储库”。这真的很奇怪,我经历了多次修复,直到偶然发现了这个答案。

root@ls:~# /usr/sbin/setenforce Permissive 为我解决了问题。


0

我的情况略有不同,但是Google将我带到了这里,所以我想与您分享...

我的服务器正在运行debian稳定版,尝试执行一次Shell脚本后工作了一次,然后权限自动更改为644,下一次尝试运行该脚本了Permission denied。事实证明,这对我来说是一个samba服务器问题,直到现在我才注意到这种模式。

通过Windows编辑器将文件保存在Samba分区上时,QA Strange权限发生了更改map archive = no即使使用桑巴股票十年后,我也不知道该选项。

在Windows桌面上使用Notepad ++的某些操作会将目标文件的权限更改为675,而不是设置了umask的775。


-7

通过Apache在PHP中运行root命令

我有一个Web应用程序,需要在PHP函数中以root身份执行shell命令,并且您会认为这很简单……但是确实花了我几个Google来获取所有详细信息,所以这里是我的一些方便注释它。这是在运行Apache的Linux系统上,我们将在“ shell_exec”中使用“ sudo”来运行命令。

最主要的是编辑/ etc / sudoers文件,通常,您可以(以root身份)使用“ visudo”命令进行编辑。

确保apache可以运行命令,并且不需要密码:

apache  ALL=(ALL)       NOPASSWD: ALL

然后,您需要注释掉这一行:

#Defaults    requiretty

如果不这样做,那么您将在/ var / log / secure中看到以下错误:“对不起,您必须有一个tty才能运行sudo”。现在您可以开始使用了,PHP代码很简单:

$ results = shell_exec('sudo date');


5
这是一个可怕的主意。如果您的apache安装受到威胁或您正在运行的应用程序受到威胁,您的黑客将很容易获得对系统的完全访问权限。正确的做法是更改脚本的权限,而不是
让其

2
由于给apache用户/角色所有权限带来明显的安全隐患,因此我不得不对此答案发表不赞成意见。
Ramhound

@JourneymanGeek这不是“如果”,这是安装得到妥协。
迈克尔·汉普顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.