6

php-fpm, nginxexec 在使用时.phpfiles() shell_exec() system()可以从命令行正常工作。

运行良好的示例:

#php myphp.php

myphp.php包含:

<?php
exec('ping -c 3 google.com', $output);
print_r($output);
?>

但是如果我装上浏览器http://localhost/myphp.php,它就不再起作用了。

有任何想法吗?我编辑

我制作了一个包含以下内容的文件:

#cat info.php

<?php
if(function_exists('exec')) {
    echo "exec is enabled";
}
    phpinfo();
?>

在我的浏览器中,打印

exec 已启用,y php 信息..

我制作了一个包含以下内容的文件:

#cat info.php

<?php 
// Check for safe mode
if( ini_get('safe_mode') ){
    // Do it the safe mode way
echo "Do it the safe mode way";
}else{
    // Do it the regular way
echo "Do it the regular way";
}

?>

在我的浏览器中,打印

以常规方式进行

我不想知道我是否在监狱里吗?

在我的 php ini

#cat /etc/php-5.5.ini

未显示安全模式,或打开或关闭。根本不存在

4

3 回答 3

1

我认为 exec 和这些功能在您的 php.ini 中被禁用。您可以通过以下方式检查

if(function_exists('exec')) {
    echo "exec is enabled";
} else {
    echo "exec is disabled";
}

打开您的 php.ini 并导航到 disable_functions 部分

如果 exec 在下面列出,请将其删除。

然后重启php-fpm

此外,如果启用了安全模式,此功能将不可用。您需要禁用它。

编辑

使用完整路径进行 ping。您可以通过在 shell 中发出此命令来找到它which ping

编辑

<?php
exec('/sbin/ping -c3 google.com', $output);
print_r($output);
?>
于 2015-03-26T14:24:05.887 回答
0

php-fpm 在 OpenBSD 上默认是 chroot 的。这可能是您看到它在 cli 上而不是在 web 上工作的原因。

你有两个解决方案。禁用 chroot(在 上注释该行chroot = /var/www/etc/php-fpm.conf或修复您可能遇到的问题。

ping 的静态编译版本位于/bin/ping(从 chroot 内部)。您需要在 chroot 中复制/etc/hosts并解析主机名(因为您正在尝试 ping google)。/etc/resolv.conf您计划调用的所有其他系统命令也必须复制到 chroot 中(连同它们的共享库或静态编译)。

用于ldd(1)找出您需要的库。根据您要实现的目标,这可能是一项乏味的工作。

正如其他用户指出的那样,Exec、system 和 shell_exec 可能已禁用。

于 2015-09-08T16:11:58.197 回答
0

<?php
//echo "Вот-вот... ещё 1 мин";
//echo "Wait... 1 min";
echo exec('/bin/bash --login -c "cd /var/www/194.7.2.2/public && /usr/local/rvm/rubies/ruby-2.5.3/bin/ruby work1.rb "'.$_GET['some_value']);

它对 4​​me 有效!

于 2019-02-05T17:43:26.473 回答