不能在命令行上 运行 PHP exec()

Can't run PHP exec() on command line

希望有人能帮助我。尝试 运行 使用 exec() returns 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.

每次尝试 运行 任何命令 returns 权限被拒绝,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 运行 宁此

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

如你所知 int(126) return 已执行命令的状态。来自 bash man page:

If a command is found but is not executable, the return status is 126.

直接从您的 asterisk 用户那里尝试 运行ning ls 看看它是否有效。

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

编辑:由于您的 asterisk 帐户没有 shell,您无法从中执行 shell 命令。

您可能启用了 sudo 选项 NOEXEC

启用此选项后,您可以运行 使用高权限命令,但不能生成其他命令。这是(AFAIK)避免利用者获得 shell 所必需的。由于您使用的是 asterisk 用户,这也很有意义。

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

编辑(如下评论)

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

root ALL = (ALL) EXEC: ALL

几年后回来为我自己的问题提供另一个答案。正如公认的答案所假设的那样,我在我的文件中设置了这个:

Defaults noexec

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

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

Defaults:admin noexec

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