无法在命令行上运行PHP exec()

时间:2015-10-08 16:23:05

标签: php linux command-line exec

希望有人可以帮助我。尝试使用exec()运行任何命令都会返回126并显示相同的错误消息。我把它缩小到这个非常小的测试用例。

root@test:~ $ sudo -u asterisk php -r 'exec("ls /", $out, $result); var_dump($result);'
sh: /bin/ls: Permission denied
int(126)

root@test:~ $ sudo -u asterisk ls /
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt   opt   proc  root  sbin  selinux  srv  sys  tmp  usr  var

root@test:~ $ su -lc 'php -r '\''exec("ls /", $out, $result); var_dump($result);'\' asterisk
This account is currently not available.
  • 未启用SELinux和PHP安全模式
  • 权限适用于//bin//bin/ls
  • 星号是使用此命令创建的系统用户:adduser -d /var/lib/asterisk -M -r -s /sbin/nologin asterisk
  • 它可以通过Apache运行,它以此用户身份运行

每次运行任何命令的尝试都会返回权限被拒绝,126返回$?。 PHP配置几乎与它一样(Scientific Linux 6.7,PHP 5.4通过Remi包。)

会很感激一些帮助(最好是需要一些神秘知识的那种,而不是那种意味着我错过了一些令人眼花缭乱明显的东西!)

编辑:如果我向用户提供登录shell,我可以使用su让它工作:

root@test:~ $ usermod -s /bin/bash asterisk
root@test:~ $ su -c 'php -r '\''exec("ls /", $out, $result); var_dump($result);'\' asterisk
int(0)

但是,这不是我的代码,因此不太可能将sudo的所有用途更改为su。此外,如果没有登录shell,不应该阻止PHP运行它。

3 个答案:

答案 0 :(得分:1)

您可能已启用sudo选项NOEXEC

当此选项处于活动状态时,您可以运行具有高权限的命令,但不能生成其他命令。这是(AFAIK)要求避免剥削者获得外壳。由于您使用的是asterisk用户,因此这也很有意义。

在您的情况下,PHP命令被授予执行为asterisk的用户,但是当它尝试使用exec生成时,该命令无法执行并返回126

编辑(如下面的评论)

将此行添加到sudoers将解决此问题:

root ALL = (ALL) EXEC: ALL

答案 1 :(得分:0)

您的帐户无权运行bash命令。

如您所知int(126)返回已执行命令的状态。来自bash man page

  

如果找到命令但不可执行,则返回状态为126。

尝试直接从ls用户运行asterisk,看看它是否有效。

如果它不起作用,请检查asterisk用户的权限,看看您是否具有必要的权限。如果您没有权限,只需使用chmod授予您asterisk用户权限。您还应该尝试创建一个新用户,看看该命令是否适用于该用户。

修改:由于您的asterisk帐户没有shell,因此无法从中执行shell命令。

答案 2 :(得分:0)

几年后回来为我自己的问题提供另一个答案。正如所接受的答案所假设的那样,我已将其设置在我的文件中:

Defaults noexec

我通过覆盖root用户来解决这个问题。

但更好的解决方案是仅将默认值应用于目标用户:

Defaults:admin noexec

这样设置不会影响我在问题中遇到问题的asterisk用户!