不能在命令行上 运行 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.
- SELinux和PHP安全模式未启用
/
、/bin/
和 /bin/ls
的权限很好
- asterisk 是使用此命令创建的系统用户:
adduser -d /var/lib/asterisk -M -r -s /sbin/nologin asterisk
- 它通过 Apache 工作正常,运行作为这个用户
每次尝试 运行 任何命令 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
用户!
希望有人能帮助我。尝试 运行 使用 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.
- SELinux和PHP安全模式未启用
/
、/bin/
和/bin/ls
的权限很好
- asterisk 是使用此命令创建的系统用户:
adduser -d /var/lib/asterisk -M -r -s /sbin/nologin asterisk
- 它通过 Apache 工作正常,运行作为这个用户
每次尝试 运行 任何命令 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.
您的帐户无权执行 运行 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
用户!