【问题标题】:Check if a user is root检查用户是否为root
【发布时间】:2011-06-10 11:00:35
【问题描述】:

如何在 PHP 脚本中验证用户是否是 root 用户?命令是什么? 我试过类似的东西:

exec("su -l login < `echo password`");

但是su命令收不到密码...

请注意,这台机器与互联网隔离,因此如果需要,我可以以 root 身份运行 PHP。

编辑: 我不想知道当前运行脚本的用户是否是 root。 我的 PHP 脚本中有一个用户列表,我想知道每个登录的用户是否具有 root 权限。

【问题讨论】:

  • 你到底想做什么?
  • 也许是 exec("su -l login
  • 你可以试试看有没有'whoami'这个命令。
  • 在 PHP 脚本中,我想知道登录名/密码是否具有管理员权限。登录名/密码不是执行 PHP 脚本的用户。
  • 如果您想检查登录是否是超级用户,那么$username=="root" 是显而易见的选择。我猜您实际上要问的是用户是否在 sudoers 组中。不确定是否有确定性的方法。也许stackoverflow.com/questions/1133364/… - 但最好在 Unix.SE 上询问 - 如果您的问题只是输入密码,请尝试 proc_open 而不是普通的 exec。

标签: php linux root


【解决方案1】:

posix_getuid()怎么样?

if (0 == posix_getuid()) {
    echo "Running as root.";
} else {
    echo "not root";
}

【讨论】:

  • 我不想知道运行脚本的用户是不是root。我必须在 PHP 脚本中检查一些登录名/密码是否为 root
  • @scrat 我不明白。这就是示例的作用。它检查正在运行的脚本的真实用户ID; root 的 UID 通常为 0(零)。
  • @goreSplatter 我的 PHP 脚本中有一个用户列表,我想知道他是否具有 root 权限。
  • @scrat 虽然我想到了一个答案,但您可能会考虑将您的最后一条评论放入问题中。它会让它很多更容易回答。
  • @scrat789: 应该只有一个 real 根(uid 0),所以你不应该只检查他们是否是特定组的成员(管理员, sudoers 之类的)?
【解决方案2】:

首先,问问自己究竟是什么定义了“具有 root 权限”的登录。 AFAICT有2个基本解决方案。

老派的方式,系统管理员使用 uid 0 创建多个帐户,我 - 而且我当然并不孤单 - 认为这是一场噩梦。在这种情况下,您可以使用 posix_getpwnam 检查列表中的所有用户,并查看他们的 uid 是否与 0 匹配。

以下代码 sn-p 就是这样做的,$privileged 将包含具有 root 权限的用户:

$logins = array('root', 'john', 'guest', 'foo');
$privileged = array();
foreach($logins as $login) {
    $userInfo = posix_getpwnam($login);
    if ($userInfo !== FALSE) {
        if ($userInfo['uid'] == 0) {
          $privileged[] = $login;
        }
    }
}

另一种方法(恕我直言)是将所有具有 root/管理权限的用户添加到特定组(wheeladmin 已被使用在不同的 Linux 发行版中,找出适合您的版本)。这种情况更简单,因为您可以使用posix_getgrnam 获取特定组中的所有成员。

以下代码 sn-p 将匹配您提供的登录名数组,并查看谁是具有特定权限的成员,再次 $privileged 将包含结果(即您列表中的用户是您所在组的成员指定):

$logins = array('root', 'john', 'guest', 'foo');
$privileged = array();
$groupInfo = posix_getgrnam('admins');
if ($groupInfo !== FALSE) {
    $privileged = array_intersect($logins, $groupInfo['members']);
}

【讨论】:

  • 我将我的用户放在“adm”组中,并使用 posix_getgrnam() 来获取信息。谢谢。
【解决方案3】:

试试这个。

<?php
    if (posix_getuid() == 0){
        echo "This is root !";
        // add more for root
    } else {
        echo "This is non-root";
    }
?>

【讨论】:

    【解决方案4】:

    如果你的意思是“是root”,那么你可以检查whoami,看看它是否出现'root'

    exec("whoami");
    

    如果这是一件聪明的事情,那就另当别论了;)

    【讨论】:

      【解决方案5】:

      在您发表评论后重写

      “我不想知道用户是否 运行脚本是root还是no。我有 检查一些 PHP 脚本 登录名/密码,如果他们是 root 或 不是”

      我现在了解到您需要在 PHP 中执行 root 身份验证

      我建议用pwauth代替whoami/login等

      Here 是一个关于如何在 PHP 中使用它的示例,而我相信可以有更简单的测试方法。

      【讨论】:

        【解决方案6】:

        如果你想查看某个系统用户(相对于网络服务用户)是否有root权限,你可以使用posix_getpwnam()函数:

        <?php
            $u = posix_getpwnam("username");
        
            if ($u == FALSE) {
                print "no-such-user";
            } elseif ($u["uid"] == 0) {
                print "root";
            } else {
                print "non-root";
            };
        ?>
        

        请记住,这只检查用户名。如果您还需要检查密码,您实际上必须尝试通过系统进行身份验证。

        【讨论】:

        • 这是一个有趣的功能,但是当我尝试时,我得到一个 uid > 0 即使我确定登录是超级用户..
        • @scrat789:那么您必须与我们分享您对“超级用户”的定义是什么。您将如何确定一个帐户是否是“超级用户”,例如来自 bash shell?
        • @scrat789:在大多数类 Unix 系统上,超级用户帐户是 UID=0 的帐户。通常只有一个这样的帐户(“root”),尽管出于遗留兼容性原因,一些管理员为该 UID 安装了额外的别名(“operator”、“sysop”)。
        • 在 shell 中,当我在“su -l login”命令之后运行“echo $UID”时,我得到了 0(我想要的)。但是在 su 之前,我的 UID 是 500,就像 posix_getpwnam 函数的输出一样。
        • @scrat789:您必须将posix_getpwnam() 中的“用户名”替换为您要检查的用户名,而不是您自己的用户名。
        猜你喜欢
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 2011-07-04
        • 2022-10-15
        • 2011-10-01
        • 2011-01-28
        • 1970-01-01
        • 2016-05-24
        相关资源
        最近更新 更多