口令文件:

/* 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. zabbix-agent端自定义监控项(free -m)服务器内存使用率

    Agent端操作 [root@agent ~]# vim /usr/local/zabbix/etc/zabbix_agentd.conf 末行追加 UserParameter=memory_user ...

  2. Pyhton学习——Day47

    # 转载:http://www.cnblogs.com/yuanchenqi/articles/6357507.html# 外键:一种约束条件,与主键对应# 主表:被绑定的表:字表# 外键约束:# - ...

  3. Airtest ——poco

    1.  Pymysql(No module named ‘cryptography’) pip install cryptography pip install paramiko 把 cryptogr ...

  4. Module build failed: Module failed because of a eslint warning

    eslint 设置 warning 级别,在 开发编译失败的原因,报错如下: F:\vue-mobile-skeleton>npm run dev > byhealth@1.0.0 dev ...

  5. CF833B The Bakery (线段树+DP)

    题目大意:给你一个序列(n<=35000),最多分不大于m块(m<=50),求每个块内不同元素的数量之和的最大值 考试的时候第一眼建图,没建出来,第二眼贪心 ,被自己hack掉了,又随手写 ...

  6. tp 在Nginx上各种404

    对于ThinkPHP的URL访问路劲如:http://域名/index.php/Index/BlogTest/read,原先的Nginx的是不支持的pathinfo路劲的,导致你在thinkPHP5上 ...

  7. 【 henuacm2016级暑期训练-动态规划专题 A 】Cards

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 很显然只要维护B,R,G的数量就好了. 可以很容易想到一个dfs(int a,int b,int c) 然后如果a+b+c==1,那 ...

  8. shell 测试命令

    一.使用 test 命令可以对文件.字符串等进行测试,一般配合控制语句使用. 1.字符串测试 test str1 = str2 //测试字符串是否相等 test str1 != str2 //测试字符 ...

  9. ASP.NET-EF基础知识

    定义 asp.net Entity Framework是微软以ADO.NET为基础发展出来的对象关系对应(OR Mapping)解决方案.   三种EF工作模式(自己理解的) 从数据库表创建类 从类创 ...

  10. 在对Activity基类的封装中,我做了什么

    在开发实践中,不同Activity有很多代码是反复冗余的.因此非常有必要将这部分抽取出来.封装一个继承自Activity的类,命名为BaseActivity. 翻看之前写过的代码,起初,BaseAct ...