3、加密密码
passwd
中的密码域的真正密码被加密,之后存放来了另外的文件中,一般是 shadow
文件。这个文件至少要包含用户名和加密之后的密码信息。其他的信息可选,具体参见参考网址。
很少有程序需要访问加密之后的密码, login
和 passwd
可能会用到加密之后的密码,这样的程序一般是 set-user-id
的。 shadow
对外是不可读的,而 passwd
可以对外可读。
linux2.4
和 solaris
有用来访问 shadow
有一组函数:
#include <shadow.h>
struct spwd *getspnam(const char *name);
struct spwd *getspent(void);
这两个函数如果运行正常则返回指针,出错返回 NULL
.
void setspent(void);
void endspent(void);
这几个函数类似访问 passwd
的函数。
译者注
原文参考
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
如果在文件没有打开的时候会打开文件,然后 rewinds
。 getgrent
获取下一个组项。 endgrent
关闭组文件,这三个函数不是 posix.1
而是 single unix
的 xsi
扩展。
译者注
原文参考
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
函数用来设置调用进程的额外组 id
。 grouplist
就是要设置的 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
中的 user
的 group id
来设置的。一般来说 initgroups
由 login
来调用。