【问题标题】:how to make PHP lists all Linux Users?如何让 PHP 列出所有 Linux 用户?
【发布时间】:2011-02-22 19:36:22
【问题描述】:

我想在我的 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);
?>

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

谢谢

【问题讨论】:

  • 出于安全原因,这是一个非常糟糕的主意。
  • 之后您能告诉我们您的服务器地址吗? :-)
  • @Matt:是的,我知道,那么实现这种功能的最佳方法是什么? @Alexander:服务器位于专用网络中,用于测试和学习目的,抱歉 ;-)

标签: php linux command-line ubuntu


【解决方案1】:

来自 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);
?>

【讨论】:

    【解决方案2】:

    正如@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】:

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

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

      【讨论】:

      • 但是我如何构建一个可以进行一些系统更改的页面?比如添加/删除用户/更改系统主机的 ip 我将始终需要 som admin poer o 这样做!
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-22
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        相关资源
        最近更新 更多