posix_getpwnam

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getpwnam根据用户名返回用户信息

说明

posix_getpwnam(string $username): array|false

返回一个关于给定用户的 array

参数

username

一个字母数字用户名。

返回值

成功时返回一个包含以下元素的数组,否则返回 false

用户信息数组
元素 说明
name name 元素包含用户的用户名。这是一个简短的,通常少于 16 个字符的“句柄”,不是用户的真实全名。它应该与调用函数时使用的 username 参数相同,因此是多余的。
passwd passwd 元素包含用户以加密格式存储的密码。通常,例如在使用“shadow”密码的系统上,会返回一个星号 (*) 代替。
uid 用户的用户 ID,以数字形式表示。
gid 用户的组 ID。使用函数 posix_getgrgid() 来解析组名及其成员列表。
gecos GECOS 是一个过时的术语,指的是 Honeywell 批量处理系统上的指纹信息字段。但是,该字段仍然存在,其内容已由 POSIX 规范化。该字段包含一个以逗号分隔的列表,其中包含用户的全名、办公室电话、办公室号码和家庭电话号码。在大多数系统上,只有用户的全名可用。
dir 此元素包含用户主目录的绝对路径。
shell shell 元素包含用户默认 shell 可执行文件的绝对路径。

范例

示例 #1 posix_getpwnam() 的使用示例

<?php

$userinfo
= posix_getpwnam("tom");

print_r($userinfo);
?>

上面的例子将输出类似于

Array
(
    [name]    => tom
    [passwd]  => x
    [uid]     => 10000
    [gid]     => 42
    [gecos]   => "tom,,,"
    [dir]     => "/home/tom"
    [shell]   => "/bin/bash"
)

参见

  • posix_getpwuid() - 根据用户 ID 返回用户信息
  • POSIX 手册页 GETPWNAM(3)

添加注释

用户贡献的注释 9 个注释

darryl at pointclark dot net
22 年前
如果您需要验证使用阴影密码的系统上的 *真实* Unix 密码,则 PHP 中的 posix_getpwnam() 函数将不起作用(如上所述,密码字段中将是 'x' 或 '*')。

我需要在 PHP 中验证用户/密码(使用 SSL!)。我不知道这是否是最好的方法,但这是我目前正在做的事情(效果很好!)。

首先,您需要操作系统的一些帮助。我编写了一个小型 C 实用程序,它为我执行阴影查找... 它需要 root 权限才能读取 /etc/shadow。因此,在您编译(gcc -O2 -s -o spasswd -lcrypt spasswd.c)之后,您需要使用 sudo 运行它,或者

# chown root spasswd && chmod u+s spasswd

我用于从 PHP 身份验证用户/密码的代码如下所示

function Authenticate($realm)
{
global $PHP_AUTH_USER;
global $PHP_AUTH_PW;

if(!isset($PHP_AUTH_USER))
{
header("WWW-Authenticate: Basic realm=\"$realm\"");
header("HTTP/1.0 401 Unauthorized");

return false;
}
else
{
if(($fh = popen("/usr/sbin/spasswd", "w")))
{
fputs($fh, "$PHP_AUTH_USER $PHP_AUTH_PW");
$r = pclose($fh);

if(!$r)
return true;
}
}

header("WWW-Authenticate: Basic realm=\"$realm\"");
header("HTTP/1.0 401 Unauthorized");

return false;
}

spasswd.c 的 C 源代码

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crypt.h>
#include <shadow.h>

static char salt[12], user[128], pass[128];

void die(void)
{
memset(salt, '\0', 12);
memset(user, '\0', 128);
memset(pass, '\0', 128);
}

int main(int argc, char *argv[])
{
struct spwd *passwd;

atexit(die); die();

if(fscanf(stdin, "%127s %127s", user, pass) != 2)
return 1;

if(!(passwd = getspnam(user)))
return 1;

strncpy(salt, passwd->sp_pwdp, 11);
strncpy(pass, crypt(pass, salt), 127);

if(!strncmp(pass, passwd->sp_pwdp, 127))
return 0;

return 1;
}

希望这对某人有帮助...
perreal at lyon dot cemagref dot fr
22 年前
要检查 Unix 盒子上的密码,请查看 Apache 的 mod_auth_external 模块,它使用外部程序来执行实际工作。服务器永远不会读取加密的密码。

其中之一,pwauth,可以配置为使用 PAM 或您的系统上使用的任何其他方法。可以在编译时配置可以运行此程序的用户。可以使用 exec(...) 从 PHP 调用此程序。
bau at kg-fds dot de
18 年前
如果您运行的是 pop3 守护程序,那么您可以使用 fsockopen :-) 并检查它是否返回 +OK 或 -ERR 来进行 pop3 身份验证。
corychristison at lavacube dot net
19 年前
对于那些使用 PHP 编写守护程序并注重安全的人来说,如果您已经调用了 PHP 的 chroot() 函数,此函数将不会返回任何信息。

我花了几分钟才弄清楚为什么它找不到它要搜索的用户。
marcus at nospamsynchromedia dot co dot uk
21 年前
给定一个不存在的用户名,此函数返回布尔值 FALSE。
vision_1967 at hotmail dot com
22 年前
我需要访问用户信息才能通过 SSL 连接进行登录/验证,并且遇到了在密码字段中收到 '*' 的相同问题。在检查了 posix_getpwnam 的文档后,我看到了之前涉及编写 C 程序的解决方案。这对我来说有点笨重,所以我提出了自己的解决方案。

这个主题的变体可能可以做到让解决方案对程序员/读者更友好,但我使用的方法完成了我的任务。

如果您需要从 posix_getpwnam 获取的信息来自参与 NIS 网络的服务器,则可以使用以下命令来完成相同的事情


$autharray = split(":",`ypmatch $USER passwd`);


(对于如此短的解决方案,解释很长吧?)

您必须使用此方法通过其索引号 ($autharray[0]、$autharray[1]、...) 获取字段。

要创建一个与 posix_getpwnam 函数兼容的关联数组,您可能需要使用 'list' 说明符来进行赋值。

希望这对某人有帮助。

--S
sezery at damla dot net
22 年前
用户和组函数在最新的 Redhat 系统上不起作用,因为这些函数基于 /etc/group 文件,但新的 Redhat 不会将组成员列表放在此文件中。相反,您需要检查 /etc/passwd 文件,并通过检查组 ID 来查找组的成员。
bau at kg-fds dot de
18 年前
您好,我尝试了另一种更简单的方法来检查密码,而不是将其检查到 pop3 服务器。如果您运行的是 samba 服务器或 Windows PDC,那么您可以尝试使用您要检查的用户名/密码连接到此服务器的 netlogon

if (exec('echo "exit"|smbclient //server/netlogon -U'.$user.' '.$pass)=="") { ... }

如果用户名/密码不匹配,则 LINUX 上的 exec 命令将返回错误。

祝好
Baumg?rtner
bau at kg-fds dot de
18 年前
哦,我忘了以下内容

通过 PHP 更改用户密码,
您可以使用以下方法(在安装了 Samba 的 Linux 上)

exec('echo -e "'.$oldpassword.'\n'.$newpassword.'\n'.$newpassword.'
"|smbpasswd -U'.$user.' -s')

exec 命令返回 ""
如果出现错误(然后查看 Web 服务器的错误日志)
或一条消息“密码已更改”。

祝好。
Baumg?rtner
To Top