繁体   English   中英

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

[英]Can't run PHP exec() on command line

希望有人可以帮助我。 尝试使用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上的权限很好
  • asterisk是用这个命令创建的系统用户: 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 此外,不应该有任何东西阻止 PHP 在没有登录 shell 的情况下运行它。

您可能已启用sudo选项NOEXEC

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

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

编辑(如下面的评论)

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

root ALL = (ALL) EXEC: ALL

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

如您所知, int(126)返回已执行命令的状态。 bash 手册页

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

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

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

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

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

Defaults noexec

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

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

Defaults:admin noexec

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM