| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> UNIX环境高级编程 学习笔记 第六章 系统数据文件和信息 -> 正文阅读 |
|
[系统运维]UNIX环境高级编程 学习笔记 第六章 系统数据文件和信息 |
UNIX系统口令文件(POSIX.1称其为用户数据库)包含以下字段,这些字段也包含在头文件pwd.h中定义的passwd结构中: 有关口令文件的登录项的注意点: 某些系统提供vipw命令,允许管理员通过此命令编辑口令文件,此命令串行化地更改口令文件,且确保它所做的更改与其他相关文件保持一致,系统也常常由图形用户界面(GUI)提供类似的功能。 POSIX.1定义了两个获取口令文件项的函数,给出用户登录名或UID后,就能查看相关项: 以上函数返回的passwd结构通常是函数内部的静态变量,再次调用其内容会被重写。 SUS的XSI扩展中的有关口令文件的函数,可期望所有UNIX实现都提供了这些函数,但POSIX.1标准没有定义这三个函数: setpwent函数rewind到口令文件的开头,使得下次调用getepwent时返回第一条口令文件项。 endpwent函数会关闭getpwent函数打开的口令文件,用这个函数关闭打开的口令文件的原因是getpwent函数不知道何时应该关闭口令文件。 getpwnam函数的一个实现:
加密口令是经单向加密算法处理过的用户口令副本,不能从加密口令反变换到原来的口令,但可对口令进行猜测,将猜测的口令经单向算法变换成加密形式,然后将其与用户的加密口令相比较。 某些系统将加密口令存放在阴影口令文件中,该文件至少要包含用户名和加密口令,与该口令相关的其他信息也可放在该文件中: Linux 3.2.0和Solaris 10中访问阴影口令文件的函数: UNIX组文件(POSIX.1称其为组数据库)包含以下字段,这些字段包含在头文件grp.h定义的group结构中: POSIX.1定义的返回指定组的group结构的函数: 搜索整个组文件(由SUS的XSI扩展定义,不是基本POSIX.1组成,所有UNIX都提供这3个函数): 用户执行newgrp命令可更改实际组ID,执行不带参数的newgrp命令可回到与该用户名相同的预设组。 4.2 BSD引入了附属组ID,一个用户除了属于一个组外,还可属于至多16个另外的附属组。文件访问权限也修改为:不仅将进程的有效组ID与文件的组ID相比,也将所有附属组ID与文件的组ID比较。 POSIX.1早期版本中附属组ID特性是可选的。常量NGROUPS_MAX规定了附属组ID的数量,常用值为16。 获取和设置附属组ID的函数: getgroups函数将进程所属用户的各附属组ID填到grouplist中,填入数量最多是参数gidsetsize个,返回实际填写到数组中的附属组ID数。如果参数gidsetsize为0,则函数不修改grouplist参数,但仍返回附属组ID数,这样可确定grouplist参数数组的长度,以便进行分配空间。 setgroups函数可由root用户调用为调用进程设置附属组ID表,参数grouplist是组ID数组,参数ngroups说明了数组中的元素数(此值不能大于NGROUPS_MAX)。 通常只有initgroups函数调用setgroups函数(因此initgroups函数也需要超级用户权限),initgroups函数一般读整个组文件,然后用组文件中数据初始化username参数表示的用户的附属组,参数basegid也会加入用户的附属组中。login命令在用户登录时会调用此函数。 不同平台存储用户和组信息的方式: 对于阴影口令文件中的不活动字段,Solaris将其定义为自用户上次登录后到下次账户自动失效之间的天数,Linux将其定义为达到口令失效的尚余天数。 很多系统中,用户和组数据库是用网络信息服务(Network Information Service,NIS)实现的,管理员可编辑数据库的主副本,然后将它自动分发到组织中所有服务器上,客户联系服务器查看用户和组的有关信息,NIS+轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)提供了类似功能。很多客户通过配置文件/etc/nsswitch.conf控制管理每一类信息的方法。 对于除口令文件和组文件外的一些系统数据文件,一般为每个数据文件至少提供3个函数: 除以上3个函数外,如果数据文件支持某种形式的键搜索,则也提供搜索指定键数据的例程,如口令文件有getpwnam函数搜索指定用户名的记录和getpwuid函数搜索指定用户ID的记录。
Solaris中,上图里的最后4个文件都是符号链接,链接到/etc/inet下的同名文件上。 大多UNIX系统都提供下列两个数据文件:utmp文件记录当前登录到系统的各个用户;wtmp文件跟踪各个登录和注销事件。在V7中,这两个文件中写入的是以下结构的一个二进制记录: utmp结构中的信息在V7中有20字节,在SVR2中被扩充为36字节,而在SVR4中被扩充为多于350字节。 Solaris中,utmp和wtmp文件在/var/adm目录下;FreeBSD 8.0和Linux 3.2.0中,这两个文件的路径为/var/run/utmp和/var/log/wtmp;Mac OS X 10.6.8中,utmp和wtmp文件不存在。 POSIX.1定义的返回与主机和操作系统相关信息的函数: utsname结构没有给出POSIX.1版本信息,应使用宏_POSIX_VERSION获得此信息。 BSD派生的系统提供gethostname函数,它只返回主机名,该名字通常是TCP/IP网络上主机的名字(完整域名),但我运行时返回的是本地主机名: 现在POSIX.1也定义了gethostname函数,该标准指定最大主机名长度为HOST_NAME_MAX。
UNIX内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time,UTC)以来经过的秒数,这个秒数存放于数据类型time_t,称其为日历时间。 返回当前的UNIX时间戳: POSIX.1的实时扩展增加了对多个系统时钟的支持,在SUS v4中,控制这些时钟的接口从可选组移到基本组。时钟通过clockid_t类型进行标识: 获取特定时钟的精度: 设置特定时钟的时间: System V派生的系统使用stime函数设置系统时间;BSD派生的系统使用settimeofday函数设置系统时间。 SUS v4指定gettimeofday函数已经弃用,但还用很多程序使用它,因为它相比于time函数能提供更高的精度(微秒级): gettimeofday函数返回以timeval结构表示的UNIX时间戳,该结构将UNIX时间戳表示为秒和微秒。 取得UNIX时间戳后,通常调用函数将其转换为tm结构: tm结构中秒的最大值超过59,原因是这样可以表示闰秒;除月、日外,tm结构中其他字段都以0开始;如果夏令时生效,则夏令时标志为正,如果为非夏令时时间,则该标志为0,如果此信息不可用,则其值为负。 SUS的以前版本允许双闰秒,tm_sec字段的最大值为61,UTC的正式定义不允许双闰秒,因此现在tm_sec值最大值定义为60。 将UNIX时间戳转换为tm结构: 将tm结构转换为日历时间: strftime_l函数允许调用者指定时区。strftime使用TZ环境变量指定时区。 参数tmptr指向一个tm结构,是要格式化的时间值,格式化的结果存放在参数buf表示的数组中,数组的大小由maxsize参数指明(单位为字节数),如果缓冲区能容纳格式化的结果和一个null终止符,则该函数返回在buf中存放的字节数(不含null),否则函数返回0。 format参数控制输出的格式,其中的转换说明会转换为特定的时间,其他字符原样输出,ISO C规定的转换说明如下: 上图中%U表示该日期在该年中所属的周数,包含第一个星期日的周是第一周。%W与%U类似,但它将包含第一个星期一的周看做第一周。%V认为如果包含了1月1日的那周包含了新一年的4天及以上的天数,那么该周为一年中的第一周,否则该周被认为是上一年的最后一周。 strftime函数对某些转换说明支持修饰符,可使用E和O修饰符产生本地支持的另一种格式,某些系统支持另一些非标准的扩充支持。 使用strftime函数:
运行它: 在系统Linux 3.2.0和Solaris 10上,有超级用户权限时,可用以下程序从阴影口令文件中获取加密口令,如没有超级用户权限,调用getspnam会返回EACCESS错误:
在FreeBSD 8.0中,在具有超级用户权限时,可用以下程序从口令文件中输出加密口令,如果没有超级用户权限,则加密字段为星号:
以上程序在Mac OS X 10.6.8上,不管运行时用户是什么权限都输出星号。 使用strftime函数输出类似date命令的格式化串:
运行它: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 9:04:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |