Unix编程,不确定如何使用passwd结构

xmd2e60i  于 2023-02-04  发布在  Unix
关注(0)|答案(3)|浏览(150)

我做了一些研究,但仍在为passwd结构而苦恼。
http://www.opengroup.org/onlinepubs/000095399/basedefs/pwd.h.html
我需要获取用户ID,但是,我想我根本不了解它的功能:
int getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **);
这个函数调用返回一个指向一个结构的指针,这个结构包含了我需要的所有数据。我对函数参数有点困惑,比如:
struct passwd
我需要先声明这个吗?比如struct passwd passwd
我只是完全不知道该怎么用这个功能。
最后,一旦我“填充”了指针,我可以使用什么调用来获取数据?
谢谢你的帮助。

ubbxdtey

ubbxdtey1#

getpwuid_r签名中:

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, 
    size_t buflen, struct passwd **pwbufp);

uid是一个输入参数-它是您要查找的用户的UID。其余的基本上是输出参数:由pwbuf指向的结构将被填充口令信息,并且如果调用成功则由pwbufp指向的指针将被设置为pwbuf的值(如果不是,则为NULL)。bufbuflen参数对指定用户-提供的缓冲区,用于存储返回的struct passwd结构的成员所指向的字符串。
您可以这样使用它(这将查找UID为101的用户):

struct passwd pwent;
    struct passwd *pwentp;
    char buf[1024];

    if (getpwuid_r(101, &pwent, buf, sizeof buf, &pwentp))
    {
            perror("getpwuid_r");
    }
    else
    {
            printf("Username: %s\n", pwent.pw_name);
            printf("Real Name: %s\n", pwent.pw_gecos);
            printf("Home Directory: %s\n", pwent.pw_dir);
    }

如果您希望按名称查找用户以查找其ID,请使用getpwnam_r并检查返回的结构体的pw_uid字段。

xeufq47z

xeufq47z2#

首先,如果你想得到UID,那么你应该已经有了用户名,在这种情况下,你应该使用getpwnam_r(),这个函数的用法和getpwuid_r()完全一样,除了你传递给它一个名称(char *)作为第一个参数。
第二,你不需要声明'struct passwd',当你包含pwd. h时就声明了。
第三,函数的确切签名为:

int getpwnam_r(const char *name, struct passwd *pwd,
               char *buf, size_t buflen, struct passwd **result);

在上面的代码中,pwd是一个output参数,如果找到了密码,函数将返回密码。
最后,Linux getpwnam_r手册页中有一个完整的示例,说明如何使用getpwnam_r,可访问here
1:此处为http://manpages.ubuntu.com/manpages/jaunty/en/man3/getpwnam.3.html

6jjcrrmo

6jjcrrmo3#

好吧,首先,我不太确定你想要达到什么目的-你说你需要获得uid,但是getpwuid是用来基于uid查找其他信息的。你可能想要getpwnam,它基于用户名查找信息吗?然后你需要把uid用于另一个函数。
在任何情况下,我下面所说的一切都适用于getpwnam和getpwuid --只需将uid参数替换为username参数即可。
您的文档有点混淆了。几乎引用了手册页中的一句话:

struct passwd *getpwuid(uid_t uid);

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp);

getpwuid()函数返回一个结构指针,该结构包含密码数据库中与用户ID uid匹配的记录的断开字段。
getpwuid_r()函数获取相同的信息,但将检索到的passwd结构存储在pwbuf指向的空间中。
听起来你只是对指针有点模糊,但是,你不必为这份工作担心太多,听起来简单的版本对你来说可能是好的:

struct passwd * my_passwd;
my_passwd = getpwuid(uid);
// or:
// my_passwd = getpwnam(username);

if (my_passwd == NULL) {
    // the lookup failed - handle the error!
} else {
    // the lookup succeeded - do your thing 
    printf("User name: %s\n", my_passwd->pw_name);
    printf("User password: %s\n", my_passwd->pw_passwd);
    ...
}

注意,在这种情况下,您不需要为指针分配内存,因为getpwuid返回一个指针,指向已分配内存并存储了信息的结构。
该结构的完整定义(其他成员的名称)在手册页中。
第二种形式getpwuid_r更适合于更仔细的错误处理和内存管理,但是如果您所需要做的只是快速查找,那么这应该是可以的。

相关问题