口令文件:

/* The passwd structure. */
struct passwd
{
char *pw_name; /* Username. */
char *pw_passwd; /* Password. */
__uid_t pw_uid; /* User ID. */
__gid_t pw_gid; /* Group ID. */
char *pw_gecos; /* Real name. */
char *pw_dir; /* Home directory. */
char *pw_shell; /* Shell program. */
};

定义于pwd.h

相应的数据以ASSIC文本形式存在于/etc/passed文件中

每一行包含一个结构体中指示的7个字段,以冒号隔开

Password字段是经过单项加密的字符串,但是在使用阴影文件时是无意义字符

通常有root用户和nobody用户。root用户的用户ID和组ID都是0,表示超级用户。nobody用户的用户ID和组ID都是65534,表示没有优先权,并且没有密码,提供大家都可读写的文件

pw_gecos表示附加信息,其中的内容以逗号隔开,其中如果使用&符号表示替换为登录名

查看单个口令函数:

sys/types.h;pwd.h

struct passwd *getpwuid(uid_t uid)
struct passwd *getpwnam(const char *name)

成功返回指针,出错返回NULL

getpwuid函数由ls(1)程序调用,通过i节点中的数值用户ID获取其对应的passwd结构

getpwnam函数在输入登录名的时候由login(1)程序调用,通过用户名获取对应的passwd结构

两个函数返回指针对应的结构存储在静态区,每次调用都会重写该区域的内容

查看整个口令文件函数:

sys/types.h;pwd.h

struct passed *getpwent(void)/* 成功返回值真,出错或达到文件尾返回NULL */
void setpwent(void)
void endpwent(void)

getpwent获取口令文件中的下一条记录,每次调用都存储在相同的静态区并替换上一次调用的结果

setpwent重置获取开始的位置到文件起始,通常会在程序开始的地方调用setpwent以起保护作用

endpwent关闭文件,在使用getpwent结束后必须使用此函数关闭文件

阴影口令:

为了增加获取到原始加密口令,某些系统会将至少用户名和加密口令等信息存放到阴影口令文件中而不是口令文件中,系统通常要求用户每隔一段时间修改口令,该时间间隔也会存放到阴影口令文件中

SVR4:/etc/shadow;4.3+BSD:/etc/master.passwd

组文件:

struct group
{
char *gr_name; /* Group name. */
char *gr_passwd; /* Password. */
__gid_t gr_gid; /* Group ID. */
char **gr_mem; /* Member list. */
};

定义于grp.h文件

组文件存在于/etc/group

查看一条组文件函数:

sys/types.h;grp.h

struct group *getgrgid(gid_t gid)

struct *getgrnam(const char *name)

成功返回指针,出错返回NULL

和口令文件类似,返回的指针指向静态区的地址,每次调用都会覆盖上次调用产生的内容

查看整个组文件函数:

sys/types.h;grp.h

struct group *getgrent(void)

void setgrent(void)

void endgrent(void)

添加组ID:

文件存取权限检查不仅检查进程的有效组ID还检查添加组ID。因为一个用户经常参加多个项目,所以理应同时属于多个组

存取和设置添加组ID的函数:

sys/types.h;unistd.h

int getgroups(int gidsetsize,gid_t grouplist[])/* 成功返回添加组ID个数,出错返回-1 */

int setgroups(int ngroups,const gid_t grouplist[])/* 成功返回0,出错返回-1 */

int initgroups(const char *username,gid_t basegid)/* 成功返回0,出错返回-1 */

getgroups函数获取进程所属用户的各添加组ID并放到数组grouplist中,groupsize指定了可以放到grouplist中的最多个数,如果进程的实际添加组ID数大于groupsize而且groupsize非0,就会出错。没有明确说明有效组ID是否包含在返回列表中

特别的,如果groupsize为0,那么函数将返回进程的添加组ID数但是不将内容放到grouplist中

setgroups设置进程的添加组ID,grouplist是需要设置的添加组ID列表,ngroups说明数组中的元素个数。此函数需要超级用户权限,通常只有initgroups函数调用此函数,所以initgroups函数也需要超级用户权限

initgroups函数,读取整个组文件,根据username确定其组成员关系,调用setgroups函数为用户初始化添加组ID表。basegid是额外添加的组ID。此函数只有少数程序调用,比如login(1)在用户登录时调用

其他数据文件:

其他数据文件的处理都和上面描述的口令文件和组文件类似

一般数据文件都至少有三个函数:

• get函数:获取下一条记录,通常返回指向存储在静态存储区结构的指针,下一次调用将覆盖

• set函数:将get的获取位置重置到文件起始位置

• end函数:关闭文件

登录会计:

utmp文件:记录当前登录进系统的各个用户

wtmp文件:跟踪各个登录和注销事件

有如下结构:

struct utmp {
char ut_line[]; /* tty line: "ttyh0", "ttyd0", "ttyp0", ... */
char ut_name[]; /* login name */
long ut_time; /* seconds since Epoch */
} ;

登录时login程序会填写这样一个结构然后写入到utmp文件中,同时写入wtmp文件中。注销时,init程序将utmp文件中对应的记录清零(字节填0),并将一个新的记录填入wtmp文件中

大多数UNIX版本提供utmp和wtmp文件,但是相应的utmp结构体变得更加复杂

系统标识:

sys/utsname.h

int uname(struct utsname *name)

函数返回主机和操作系统相关的信息

函数参数是一个utsname结构的地址,函数会向这个地址中填写内容

时间和日期例程:

UNIX内核提供的时间服务提供的是时间戳的形式,并以time_t格式存储。函数为:

time.h

time_t time(time_t *calptr)

函数返回时间值,如果参数非NULL,也会将时间值存放到calptr指向的存储空间中

之后其他的函数会将时间戳转化为可读的形式

/* ISO C `broken-down time' structure. */
struct tm
{
int tm_sec; /* Seconds. [0-60] (1 leap second) */
int tm_min; /* Minutes. [0-59] */
int tm_hour; /* Hours. [0-23] */
int tm_mday; /* Day. [1-31] */
int tm_mon; /* Month. [0-11] */
int tm_year; /* Year - 1900. */
int tm_wday; /* Day of week. [0-6] */
int tm_yday; /* Days in year.[0-365] */
int tm_isdst; /* DST. [-1/0/1]*/
};

localtime和gmtime函数:

区别是localtime将时间戳转化为本地时间,gmtime将时间戳转化为国际标准时间

mktime将tm结构体转化为时间戳

asctime和ctime将产生26字节字符串

strftime函数可以格式化输出自定义的时间格式

UNIX系统高级编程——第六章-系统数据文件和信息-总结的更多相关文章

  1. UNIX环境高级编程 第6章 系统数据文件和信息

    UNIX系统的正常运作需要用到大量与系统有关的数据文件,例如系统用户账号.用户密码.用户组等文件.出于历史原因,这些数据文件都是ASCII文本文件,并且使用标准I/O库函数来读取. 口令文件 /etc ...

  2. unix环境高级编程第六章笔记

    口令文件 阴影口令 组文件 附属组ID 登录账户记录 系统标识 口令文件<\h2> /etc/passwd文件是UNIX安全的关键文件之一.该文件用于用户登录时校验用户的口令,文件中每行的 ...

  3. UNIX系统高级编程——第四章-文件和目录-总结

    文件系统: 以UNIX系统V文件系统为例: 磁盘分为区,每个分区都有自己的文件系统: ​ i节点是固定长度的记录项,包含了文件的相关信息.目录项包含文件名和i节点号.stat结构中除文件名和i节点编号 ...

  4. UNIX系统高级编程——第五章-标准I/O库-总结

    基础: 标准I/O库在ANSI C中定义,可移植在不同的系统 文件指针(FILE):标准I/O库操作的不是文件描述符,而是流.FILE文件指针包含的是维护流所需的信息 通过函数fileno获取流的文件 ...

  5. UNIX环境高级编程 第13章 守护进程

    守护进程daemon是一种生存周期很长的进程.它们通常在系统引导时启动,在系统关闭时终止.守护进程是没有终端的,它们一直在后台运行. 守护进程的特征 在Linux系统中,可以通过命令 ps -efj ...

  6. UNIX环境高级编程 第5章 标准I/O库

    本章是关于C语言标准I/O库的,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系.由于UNIX系统存在很多实现,而每个实现都有自己的标准I/O库,为了统一 ...

  7. UNIX环境高级编程 第1章 UNIX基础知识

    所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程 ...

  8. UNIX环境高级编程 第8章 进程控制

    本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...

  9. UNIX环境高级编程 第7章 进程环境

    本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...

随机推荐

  1. JS中let和var的区别

    js中let和var定义变量的区别   let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781 ...

  2. XML教程!

    什么是XML? XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML.它被设计的宗旨是传输数据,而非显示数据.XML标签没有被预定义,需要 ...

  3. node——将用户提交的数据写入data.json文件

    前续 当我们在进行将数据提交到某个网页时,需要将提交数据保存下来 1.提交数据 2.获得数据 3.保存数据 先看提交数据: <!DOCTYPE html> <html lang=&q ...

  4. CF449D Jzzhu and Numbers (状压DP+容斥)

    题目大意: 给出一个长度为n的序列,构造出一个序列使得它们的位与和为0,求方案数 也就是从序列里面选出一个非空子集使这些数按位与起来为0. 看了好久才明白题解在干嘛,我们先要表示出两两组合位与和为0的 ...

  5. sql where条件子句

    where中可用的运算符: where 的执行 是从右到左: where的SQL优化:(where条件特别多的情况下,效果明显) 对于and,应该尽量把假的放到右边. 对于or,应该尽量把真的放到右边 ...

  6. Jquery学习总结(4)——高效Web开发的10个jQuery代码片段

    在过去的几年中,jQuery一直是使用最为广泛的JavaScript脚本库.今天我们将为各位Web开发者提供10个最实用的jQuery代码片段,有需要的开发者可以保存起来. 1.检测Internet ...

  7. JAVA学习之 异常处理机制

    今天就来说说java的异常处理机制,异常处理不是第一接触,尤其是写过非常多c#的代码,基本都会写到异常处理的代码,事实上c#的异常处理与java的异常处理基本都是一样的,仅仅是在一些细节上不是非常一样 ...

  8. 【原创】Zend Framework 2框架之MVC

    ZendFramework 2框架之MVC 作者:sys(360电商技术组) 1.前言 Zend Framework 2是zend官方推出的php开源框架,基于php5.3.他全然採用面向对象的代码实 ...

  9. easyui编辑器(kindeditor-4.1.10)

    //1  重写kindedit    -建一个js文件 easyui_kindeditor.js (function ($, K) {     if (!K)         throw " ...

  10. 【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序

    一.UITabBarController的几种代理方法 在AppDelegate.h中加入一个协议<UITabBarControllerDelegate>.然后再AppDelegate.m ...