第六章-系统数据文件和信息
口令文件
口令文件/etc/passwd记录了系统中的所有用户信息,并且将这些字段信息用passwd结构体记录,该结构体定义在<pwd.h>中。每个字段用冒号隔开

加密口令也即用户密码在文件中只显示占位符x,真正的密码存于另外一个文件,提高安全性。口令文件中某些字段可能为空。shell字段指定了用户的登录shell,阻止用户登录可以将该字段设为nologin,/bin/false /bin/true


给定uid或者用户名来获得口令文件中的该用户信息,存入passwd结构体中,并且该结构体是一个静态变量,每次调用都会重写该对象内容。

这里只是查看口令文件,不需要任何的特权,也不用说你只能查看自己的用户信息。相当于普通的打开文件
getpwent函数每次调用都会查看下一个用户的所有信息,并将其写入passwd结构体中,返回该结构体的指针;setpwent使文件回到头部,相当于把文件当前位置设成开头;endpwent是关闭口令文件,以上所有函数都是会打开口令文件的,我们在查看完之后一定要用endpwent关闭口令文件。
阴影口令


用户登陆名和加密口令是必须的字段,其他是可选的。阴影文件中的加密口令就不是占位符x了,而是明文密码经过算法加密后的字符串结果了。只有root用户才能访问该文件。
组文件



与口令文件的操作基本一样。只是用了另外一个类来保存内容。
附属组ID
在口令文件中,我们显示了每个用户的组ID,这个组ID是base gid,我们每个用户还可以附属于其他最多16个组,也即附属组。所以我们的进程在进行权限测试的时候,除了测试自己的组ID外,还会测试其所有附属组ID和要访问的文件的组ID进行比较。

其中setgroups和initgroups需要超级用户权限才能调用。
其他数据文件
一般情况下,对于每种数据文件,至少提供下列三种函数:


登录账户记录

utmp记录当前登录的用户,wtmp记录历史登录的用户记录(登录和注销记录)
系统标识



时间和日程例程

time_t是从UTC开始计时的秒数,time函数把当前时间返回,若参数不为空指针还会把时间写到指针对应的对象中。
localtime gmtime可以将time_t的日历时间转换成tm结构
mktime将tm结构转换成time_t日历时间



struct tm* localtime(timt_t*ptr);
struct tm* gmtime(timt_t* ptr);
size_t strftime(char * buf,size_t max_size,char * format, tm* ptr);
size_t strftime_l(char * buf,size_t max_size,char * format, tm* ptr,local_t locale);
char* strptime(const charbuf,const charformat,struct tm*tmptr);
strftime将tm结构的时间,格式化输出到buf中,format指定了转换说明,strftime_l多了一个locale指定时区,而strftime从环境变量TZ中获得时区。
如果max_size大于等于输出字符串的大小+一个空字符,则返回存入的字符数,不包括空字符,否则返回0,不存入buf。
mktime,localtime,strftime都与环境变量TZ有关,若TZ为空,则使用UTC时间。