检查用户是否为root

3
如何在PHP脚本中验证用户是否为root?命令是什么?
我尝试了类似这样的命令:
exec("su -l login < `echo password`");

但是su命令无法接收密码...

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

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


1
你究竟想要做什么? - thkala
也许可以使用exec("su -l login < " . $password)来实现? - Mike Lentini
1
你可以尝试并查看是否存在命令“whoami”。 - Knubo
在一个 PHP 脚本中,我想知道登录/密码是否具有管理员权限。登录/密码不是执行 PHP 脚本的用户。 - scrat789
如果您想检查登录是否为超级用户,则$username=="root"是显而易见的选择。我猜你实际上想问的是用户是否在sudoers组中。不确定是否有一种确定性方法。也许可以参考http://stackoverflow.com/questions/1133364/fastest-way-to-determine-user-permissions-in-etc-sudoer - 但最好在Unix.SE上询问--如果您的问题只是将密码传递给管道,请尝试使用proc_open而不是普通的exec。 - mario
6个回答

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

@scrat 我不明白。这就是示例的作用。它检查运行脚本的真实用户ID;root的UID通常为0(零)。 - Linus Kleen
@scrat 在我想到答案的同时,你可以考虑把你最后的评论放到问题里。这样回答起来会容易得多 - Linus Kleen
@scrat789:应该只有一个真正的根(具有uid 0),所以你只需要检查他们是否是特定组(管理员、sudoers或类似组)的成员即可。 - wimvds
@goreSplatter:我知道,我见过一些管理员这样做,但对于我来说(我猜任何想保持理智的系统管理员都是如此),使用组更有意义。 - wimvds
更多信息:https://superuser.com/questions/626843/does-the-root-account-always-have-uid-gid-0 - MAChitgarha
显示剩余6条评论

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

3

首先,你需要问自己什么样的登录才能拥有“root权限”。据我所知,有两种基本解决方案。

一种是老派的方法,系统管理员创建多个uid为0的账户,我个人认为这种方法是噩梦。在这种情况下,你可以使用posix_getpwnam检查用户列表中的所有用户,并查看其uid是否匹配0。

以下代码段就是这样做的,$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/administrative 权限的用户添加到一个特定的组中(在不同的 Linux 发行版中已经使用了 wheeladmin,请找出适合您的那个)。这种情况甚至更简单,因为您可以使用 posix_getgrnam 函数获取特定组中的所有成员。
以下代码片段将匹配您提供的登录名数组,并查看谁是具有特定权限的成员,再次 $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()获取信息。谢谢。 - scrat789

1

根据您的评论重写

"我不想知道脚本运行的用户是否具有root权限。我需要在PHP脚本中检查一些登录密码是否具有root权限"

我现在明白您需要在PHP中执行root身份验证

我建议使用pwauth而不是whoami/login等。

这里提供了如何从PHP中使用它的示例,尽管我认为可能有更简单的测试方法。


1
如果你真的是指“是否为root”,那么你可以检查一下whoami,看它是否显示为“root”。
exec("whoami");

这是否是一个明智的做法是另一个问题 ;)


1
如果您想查看某个系统用户(而不是 Web 服务用户)是否具有 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
@scrat789:那么你必须与我们分享你对“超级用户”的定义是什么。你如何确定一个帐户是否是“超级用户”,例如从bash shell? - thkala
@scrat789:在大多数类Unix系统中,超级用户账户是一个UID=0的账户。通常只有一个这样的账户(“root”),尽管一些管理员出于传统兼容性原因会为该UID安装其他别名(“operator”,“sysop”)。 - thkala
在shell中,当我运行“su -l login”命令后运行“echo $UID”,我得到了0(这正是我想要的)。但在su之前,我的UID是500,就像posix_getpwnam函数的输出一样。 - scrat789
@scrat789:你需要将posix_getpwnam()中的“username”替换为你想要检查的用户名,而不是你自己的用户名。 - thkala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接