3、加密密码

passwd 中的密码域的真正密码被加密,之后存放来了另外的文件中,一般是 shadow 文件。这个文件至少要包含用户名和加密之后的密码信息。其他的信息可选,具体参见参考网址。

很少有程序需要访问加密之后的密码, loginpasswd 可能会用到加密之后的密码,这样的程序一般是 set-user-id 的。 shadow 对外是不可读的,而 passwd 可以对外可读。

linux2.4solaris 有用来访问 shadow 有一组函数:

#include <shadow.h>
struct spwd *getspnam(const char *name);
struct spwd *getspent(void);

这两个函数如果运行正常则返回指针,出错返回 NULL .

void setspent(void);
void endspent(void);

这几个函数类似访问 passwd 的函数。

译者注

原文参考

参考: APUE2/ch06lev1sec3.html

4、组数据库文件

组信息的数据库文件存储在 /etc/group 文件中,其中存放了组的相关结构信息。

我们可以通过下面函数获取组数据项信息:

#include <grp.h>
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);

如果运行正常返回相应的组数据项结构的指针,如果错误返回 NULL .

函数和访问 passwd 的相关函数类似,也是 posix.1 的。

类似 passwd 相关函数,也有如下遍历组数据项的函数:

#include <grp.h>
struct group *getgrent(void);

这个函数如果运行正常则返回指针,出错或者到达文件结尾返回 NULL .

void setgrent(void);
void endgrent(void);

这三个函数类似 passwd 的相关函数, setgrent 如果在文件没有打开的时候会打开文件,然后 rewindsgetgrent 获取下一个组项。 endgrent 关闭组文件,这三个函数不是 posix.1 而是 single unixxsi 扩展。

译者注

原文参考

参考: APUE2/ch06lev1sec4.html

5、额外组信息

从前都是登录之后用户被指定了一个组,然后运行需要别的组的时候可以通过 newgrp 命令来修改和恢复用户所属的组。现在一个用户可以属于多个组了,所以不用 newgrp 来显式修改用户所属的组了。

用来设置额外组的函数是:

#include <unistd.h>
int getgroups(int gidsetsize, gid_t grouplist[]);

getgroups 函数用来获取用户所属的组 id ,并将其存放在一个数组里面。 gidsetsize 指明存放在数组里面的元素数目, grouplist 是存放组 id 的数组,函数返回获取到 grouplist 中的元素数目。如果 gidsetsize 是0那么函数返回属于的所有组的组的数目。 grouplist 不会被修改,这里允许用户自行分配 grouplist 的空间。

#include <grp.h>     /* on Linux */
#include <unistd.h>  /* on FreeBSD, Mac OS X, and Solaris */
int setgroups(int ngroups, const gid_t grouplist[]);

setgroups 函数用来设置调用进程的额外组 idgrouplist 就是要设置的 id 数组, ngroups 指明要存放在数组的元素的数目。一般只有 initgroups 才会调用 setgroups .

#include <grp.h>     /* on Linux and Solaris */
#include <unistd.h>  /* on FreeBSD and Mac OS X */
int initgroups(const char *username, gid_t basegid);

initgroups 使用 getgrent , setgrent , endgrent 来读取整个 group 文件以便决定 username 所属的组。然后这个函数调用 setgroups 来为用户初始化所属的组成员。除了 groups 文件中的组, initgroups 也会把 basegid 中的组包含到额外组中, basegid 为了 passwd 中的 usergroup id 来设置的。一般来说 initgroupslogin 来调用。

译者注

原文参考

参考: APUE2/ch06lev1sec5.html