如何让PHP列出所有Linux用户?

时间:2010-05-22 22:26:18

标签: php linux command-line ubuntu

我想在我的Ubuntu服务器上构建一个基于php的站点(自动化)一些命令

我做的第一件事是去文件(sudoers)并添加用户www-data所以我可以用root权限执行php命令!

# running the web apps with root power!!!
www-data    ALL=(ALL) NOPASSWD: ALL

然后我的PHP代码是

<?php
   $command = "cat /etc/passwd | cut -d\":\" -f1";
   echo 'running the command: <b>'.$command."</b><br />";
   echo exec($command);
?>

它只返回一个用户(最后一个用户)!如何让它返回所有用户?

谢谢

4 个答案:

答案 0 :(得分:3)

来自exec的PHP手册:

  

返回值

     

结果的最后一行   命令。如果你需要执行一个   命令并拥有来自的所有数据   命令直接传回没有   任何干扰,使用passthru()   功能。        要获取已执行命令的输出,请务必设置并使用   输出参数。

所以你必须做类似的事情:

<?php
   $output = array();
   $command = "cat /etc/passwd | cut -d\":\" -f1";
   echo 'running the command: <b>'.$command."</b><br />";
   exec($command, &$output);
   echo implode("<br />\n", $output);
?>

答案 1 :(得分:1)

就像Matt S所说,在您的服务器上允许www-data root访问是一个非常糟糕的主意。通过您的Web应用程序进行的最轻微的妥协可以让任何人完全控制您的系统。

更好的想法是为特定的加入制作单独的脚本,然后使用SUID权限。这意味着,特定用户(在本例中为www-data)可以通过执行脚本对系统进行小的更改。但是,这仍然不是一个好主意。您可以使用suPHP解决这个问题,但安全性仍然是一个主要问题。

答案 2 :(得分:1)

正如@benjamin解释的那样,不需要是root或sudo,也不需要SUID。
只是纯PHP。我使用了posix_getpwnam中的字段名称。

function getUsers() {
    $result = [];
    /** @see http://php.net/manual/en/function.posix-getpwnam.php */
    $keys = ['name', 'passwd', 'uid', 'gid', 'gecos', 'dir', 'shell'];
    $handle = fopen('/etc/passwd', 'r');
    if(!$handle){
        throw new \RuntimeException("failed to open /etc/passwd for reading! ".print_r(error_get_last(),true));
    }
    while ( ($values = fgetcsv($handle, 1000, ':')) !== false ) {
        $result[] = array_combine($keys, $values);
    }
    fclose($handle);
    return $result;
}

它返回一个包含所有用户的数组,格式如下:

[
  [
    'name' => 'root',
    'passwd' => 'x',
    'uid' => '0',
    'gid' => '0',
    'gecos' => 'root',
    'dir' => '/root',
    'shell' => '/bin/bash',
  ],
  [
    'name' => 'daemon',
    'passwd' => 'x',
    'uid' => '1',
    'gid' => '1',
    'gecos' => 'daemon',
    'dir' => '/usr/sbin',
    'shell' => '/usr/sbin/nologin',
  ],
  ...
]

答案 3 :(得分:0)

/ etc / passwd是任何人都可以读取的,所以你应该能够在没有任何特殊权限的情况下执行命令(除非PHP阻止它?)。