PHP Conference Japan 2024

posix_getpwnam

(PHP 4、PHP 5、PHP 7、PHP 8)

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

描述

posix_getpwnam(string $username): array|false

返回一个包含给定用户信息的 数组

参数

username

字母数字用户名。

返回值

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

用户信息数组
元素 描述
name name 元素包含用户的用户名。这是一个简短的,通常少于 16 个字符的用户“句柄”,而不是真实的全名。这应该与调用函数时使用的 username 参数相同,因此是冗余的。
passwd passwd 元素包含加密格式的用户密码。通常,例如在使用“影子”密码的系统上,会返回一个星号。
uid 用户的数字形式的用户 ID。
gid 用户的组 ID。使用函数 posix_getgrgid() 解析组名及其成员列表。
gecos GECOS 是一个过时的术语,指的是 Honeywell 批处理系统上的 finger 信息字段。但是,该字段仍然存在,其内容已由 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
23 年前
如果您需要在使用影子密码的系统上验证*真正的* 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);

如果(!$r)
返回 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>

静态字符 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();

如果(fscanf(stdin, "%127s %127s", user, pass) != 2)
返回 1;

如果(!(passwd = getspnam(user)))
返回 1;

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

如果(!strncmp(pass, passwd->sp_pwdp, 127))
返回 0;

返回 1;
}

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

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

我花了几分钟时间才弄清楚为什么它找不到它正在搜索的用户。
marcus at nospamsynchromedia dot co dot uk
22 年前
如果用户名不存在,此函数将返回布尔值 FALSE。
vision_1967 at hotmail dot com
23 年前
我需要访问用户信息才能通过 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
23 年前
用户和组函数在最近的 Redhat 系统上不起作用,因为这些函数基于 /etc/group 文件,但新的 redhat 不会将组成员列表放入此文件中。相反,您需要检查 /etc/passwd 文件并通过检查组 ID 来查找组的成员。
bau at kg-fds dot de
18 年前
您好,我尝试了另一种比检查 pop3 服务器更容易的检查密码的方法。如果您正在运行 samba 服务器或 Windows PDC,那么您可以尝试使用您想要检查的用户名/密码连接到此服务器的 netlogon

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

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

祝你好运
Baumgärnter (鲍姆加特纳)
bau at kg-fds dot de
18 年前
哦,我忘记了以下内容

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

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

如果发生错误,exec 命令将返回 ""(然后查看 Web 服务器的 error_log)
或消息“密码已更改”。
祝你好运。

POSIX 权限
Baumgärnter (鲍姆加特纳)
To Top