Linux Ubuntu上的php shell_exec()权限


13

我正在使用Linux服务器开发php应用程序。我的问题是执行shell_exec()调用某些exe文件不起作用(实际上不是exe,这是Linux可执行文件)

echo shell_exec("whoami");

我有守护进程

echo shell_exec("ls")

我有一些文件名,但是

echo shell_exec("php -v")

我什么也没有,空白页

echo shell_exec("php ....bla bla bla")

也有一个空白页。

如果我在终端(用户hu)上键入所有这些命令,将可以使用。我已经在Google上搜索了几个小时,有人说是出于允许。我没有Linux经验。我必须怎么做才能在php中执行程序?

Answers:


10

www-data需要授予Apache用户的特权,以使用来执行某些应用程序sudo

  1. 运行命令sudo visudo。实际上,我们要在etc/sudoers.file中进行编辑。为此,通过sudo visudo在终端中使用它,可以复制(temp)sudoers文件进行编辑。
  2. 在文件末尾,添加以下示例:-如果我们要使用command进行restart抽烟,并使用command进行php问题中的其他操作,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(这是假设您希望使用超级用户(root)特权运行restartphp命令,并且phpusr/bin/path中使用command )

但是,如果您希望使用超级用户权限运行每个应用程序,请添加以下内容而不是上面的内容:您可能不想这样做,因为对于ALL命令而言这非常危险。

www-data ALL=NOPASSWD: ALL

3. 编辑完sudoers文件后(通过visudo编辑sudoersso保存的临时文件并退出临时文件(visudo)以写入sudoers文件。(wq!

4.就这样,现在在脚本中使用exec()shell_exec以以下方式使用xxx.php请记住sudo在php脚本中使用该命令之前要使用该命令。

例如:-

exec ("sudo /etc/init.d/smokeping restart 2>&1");

要么

shell_exec("sudo php -v"); 

因此,在您遇到的问题中,将要使用的命令添加到中,step no (2.)因为我要添加并根据需要更改PHP脚本。

这是与您的相同的问题/programming//a/22953339/1862107


这个问题不是关于使用sudo的。
tricasse 2015年

这句话措辞很糟糕
Barney Chambers

5

尝试指定php二进制文件的完整路径。例如, /usr/bin/php

如果您不知道,请使用: which php


回声shell_exec(“ / usr / bin / php -v”); 不起作用。
ngoaho91 2014年

当您说“不工作”时,您会得到什么?即有任何错误吗?您的php / apache错误日志中有内容吗?如果页面为空白,查看源代码可以为您提供任何帮助吗?不幸的是,“不起作用”一词并没有给我们提供任何帮助……
Keiran Holloway 2014年

@ ngoaho91-通常是日志/var/log/httpd/error*
slm

:D我有空白页,什么也看不到。PHP / Apache错误日志文件在哪里?
ngoaho91 2014年

@ ngoaho91-这是什么Linux发行版?CentOS,Ubuntu?
slm

4

通常你想指定的应用,如完整路径whoamils以及php。如果不确定程序的位置(完整路径),可以这样查找:

$ type php
php is /usr/bin/php

然后像这样在脚本中指定它。

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

我运行您的命令。输入php => php是/ usr / bin / php。但是完整路径命令仍然会给我空白页。
ngoaho91 2014年

如果你做什么这样的:echo shell_exec("/usr/bin/php somefile.php 2>&1")
slm

echo shell_exec(“ / usr / bin / php index.php 2>&1”)=> / usr / bin / php:重定位错误:/ usr / bin / php:符号X509_free,文件libcrypto中未定义版本OPENSSL_1.0.0。带有链接时间参考的
so.1.0.0

好的,Web服务器(Apache)通常以另一个用户(而不是)的身份运行hu。所以,你需要确保脚本php试图运行设置是这样的:chmod 755 somescript.php。这将允许运行Apache的用户能够执行和读取您的.php文件。
slm

1
@ ngoaho91-现在一切都应该没问题,该错误告诉我您的Apache / PHP设置有问题。freetutorialssubmit.com/php-relocation-error/2221
slm

2

您的php.ini是否限制可用的命令集?

这是我的 /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =

不,我的ini与您的ini一样
ngoaho91 2014年

2

如何调试shell_exec问题

好的,这是一个问题:某些东西在终端中起作用,而在php的shell_exec中不起作用(或者exec,spawn等)。让我们考虑一下:您和php有什么区别?这是三个:

从HTTP服务器规则执行PHP

实际上,您的终端正在从yournameuser 运行,而php是从运行www-data。因此,第一个想法是从www-data用户打开终端并尝试相同的命令。所以....

  • 打开/etc/passwd文件,找到与www-data用户对应的行,并将其登录shell(最后一个)从/bin/false(或其他名称)更改为/bin/bash
  • 打开www-data的终端:su www-data
  • 尝试php -v或其他无法从php执行的命令。如果它不起作用-您将看到漂亮的日志,并将能够调试问题。
  • 完成后不要忘记修复/etc/passwd文件

PHP是从PHP执行的

PHP是偏执狂,apache / nginx和php.ini配置中有很多选项可能会破坏您的尝试。

调试起来有点复杂。这里有两个选项:

  • 在浏览器中启用日志并查看问题。编辑您的php.ini,打开display_errors所有其他标志以查看浏览器中的错误。您可以阅读和调试它们。

  • 获取www-data外壳程序(请参见第一部分)并执行类似

echo '<?php shell_exec("php -v"); ?>' | php

它将在控制台中执行相同的php代码,您将能够看到错误并进行调试。

PHP是从SELinux / apparmor执行的

Selinux和apparmor是安全性事物,它们禁止应用程序执行特定操作(例如,生成其他应用程序或某些特定的其他应用程序)。也许在您的服务器上启用了它。

检查-禁用selinux / apparmor并检查是否存在问题。

要解决-阅读适当的手册并解决您的情况下的允许规则。


0

对我来说,最简单的方法是进入php.ini并注释以

disable_functions
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.