【问题标题】:shell_exec command in php not working properlyphp中的shell_exec命令无法正常工作
【发布时间】:2017-02-04 14:32:54
【问题描述】:

我正在尝试使用 shell_exec 命令执行 C 程序,该命令需要传递参数。它适用于一种输入,但不适用于其他输入。我尝试通过终端运行 C 程序,它适用于所有输入。

这是我的 execprog.php 文件。我必须将 2 个输入作为命令行参数提供给文件。 /var/www/project 是路径。

$query = "/var/www/project/./a.out /var/www/project/constraints.txt /var/www/project/constraints_keyword.txt /var/www/project/FIB.txt /var/www/project/ANS.txt";

echo $query;

$var = shell_exec($query);

echo $var;

【问题讨论】:

标签: php shell-exec


【解决方案1】:
<?php
$query = "/var/www/project/./a.out";
$arguments = array
(
    '/var/www/project/constraints.txt',
    '/var/www/project/constraints_keyword.txt',
    '/var/www/project/FIB.txt',
    '/var/www/project/ANS.txt'
);
$string = '';
for($i=0;$i<count($arguments);$i++)
    $string.= ' %s';

$command = vsprintf("{$query}{$string}", $arguments);
$var = shell_exec($command);
echo $var;

【讨论】:

  • 不工作..!!我正在浏览器上打印查询,即 $command ..如果我运行打印在终端浏览器上的这个查询,它工作正常..
  • 你可以将web服务器用户和组更改为你自己的账户,重启服务器并检查它,如果你在debian/ubuntu中使用apache在这里:/etc/apache2/envvars
  • 以 root 身份登录并运行此脚本:/bin/su -c /var/www/project/a.out /var/www/project/constraints.txt /var/www/project/constraints_keyword.txt /var/www/project/FIB.txt /var/www/project/ANS.txt www-dataserverfault.com/a/362198/143613
  • 它说的是未知 ID:/var/www/project/input1.txt。
  • 你告诉 /etc/apache2/envvars 的路径。此 envvars 文件是只读文件。
【解决方案2】:

当它在终端上运行而不是在apache 上运行时,apache 的php.ini 文件可能会禁用shell_exec()

http://www.php.net/manual/en/ini.core.php#ini.disable-functions

您的 apache 的 php.ini 文件可能类似于

disable_functions=exec,passthru,shell_exec,system,proc_open,popen

从该列表中删除shell_exec 并重新启动网络服务器,尽管这是一个安全风险,我不建议这样做。

一般的函数如exec,shell_execsystem总是用于执行外部程序。甚至一个shell命令也可以被执行。如果启用这两个功能,则用户可以输入任何命令作为输入并在您的服务器中执行。所以通常人们在 apache 配置中禁用 disable_functions 以保护他们的网站。

它对我有用 - 这是测试运行

示例测试c 代码

[akshay@gold tmp]$ cat test.c
#include<stdio.h>

int main(int args, char *argv[]) {
 int i = 0;
 for (i = 0; i < args; i++)
 printf("Arg[%d] = %s\n",i, argv[i]);
 return 0;
}

编译

[akshay@gold tmp]$ gcc test.c 

php 脚本示例

[akshay@gold tmp]$ cat test.php
<?php
$query = "/tmp/./a.out /var/www/project/constraints.txt /var/www/project/constraints_keyword.txt /var/www/project/FIB.txt /var/www/project/ANS.txt";
$var = shell_exec($query);
echo $var;
?>

执行与输出

[akshay@gold tmp]$ php test.php
Arg[0] = /tmp/./a.out
Arg[1] = /var/www/project/constraints.txt
Arg[2] = /var/www/project/constraints_keyword.txt
Arg[3] = /var/www/project/FIB.txt
Arg[4] = /var/www/project/ANS.txt

【讨论】:

  • 如果我们在终端上运行 php 文件,它可以工作,但它不适用于浏览器..
  • 是的,我做到了。它显示分段错误(核心转储)
  • 像这样调试gdb /usr/bin/php 然后run path/to/script
猜你喜欢
  • 2012-07-23
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 2017-06-13
  • 2016-04-11
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
相关资源
最近更新 更多