exec()不返回特定命令

时间:2018-03-05 15:34:30

标签: php exec shell-exec

我想通过php使用ipset来自动运行ips,具体取决于他们的行为。我设法做到了:

echo exec('sudo ipset version');

正在运作! ipset v6.20.1, protocol version: 6

echo exec('sudo ipset -A setname 1.2.3.4');

同样有效,ip是防火墙。但是

echo exec('sudo ipset test setname 1.2.3.4');

不工作(它在终端中工作),它什么都不打印。它应该打印1.2.3.4 is in set setname.偶数shell_exec('sudo ipset list setname')有效,它会打印此集合中的所有ips。但ipset test无法通过php工作。

这让我花了很多时间才尝试用其他命令测试它。这个命令有什么问题?它为什么没有返回?它在服务器终端中打印通常的字符串。

1 个答案:

答案 0 :(得分:0)

来自exec()的{​​{3}}:

  

返回值:命令结果的最后一行。 [...]

要获得完整输出,您必须使用&$array参数:

exec('sudo ipset test setname 1.2.3.4', $lines) ;
$output = implode('\n', $lines) ;

shell_exec()的文件说:

  

通过shell执行命令并将完整输出作为字符串

返回

PHP内部:

在PHP内部,有两个函数,用于不同的PHP函数:

来自/ext/standard/exec.c

    内部
  • exec()system()passthru()来电:

    /* {{{ php_exec
     * If type==0, only last line of output is returned (exec)
     * If type==1, all lines will be printed and last lined returned (system)
     * If type==2, all lines will be saved to given array (exec with &$array)
     * If type==3, output will be printed binary, no lines will be saved or returned (passthru)
     */
    PHPAPI int php_exec(int type, char *cmd, zval *array, zval *return_value)
    

    PHP_FUNCTION(exec)PHP_FUNCTION(system)PHP_FUNCTION(passthru)调用。

  • 内部
  • shell_exec()来电:

    /* {{{ proto string shell_exec(string cmd)
       Execute command via shell and return complete output as string */
    PHP_FUNCTION(shell_exec)
    

这两个函数完全相同,只是php_exec使用php_stream_get_line()存储行缓冲区,PHP_FUNCTION(shell_exec)调用_php_stream_copy_to_mem()将所有数据存储在一个缓冲液中。