博客
关于我
UNIX环境高级编程之第6章:系统数据文件和信息
阅读量:713 次
发布时间:2019-03-17

本文共 3184 字,大约阅读时间需要 10 分钟。

UNIX系统的运行依赖于大量与系统相关的数据文件,例如经常被多个程序频繁使用的口令文件/etc/passwd和组文件/etc/group。在系统登录或执行命令如ls -l时,这些文件便被广泛访问。口令文件中的用户信息和组信息是应用程序获取用户权限的重要基础。

本章将探讨与这些数据文件相关的可移植接口,包括系统标识函数、时间和日期函数。这些接口为应用程序提供了便捷的方法来访问和管理系统数据,确保程序能够高效且安全地运行。

6.2 口令文件(Password File)

用户登录名或用户ID已知时,可以通过特定的函数查看关联信息。这类函数通常用于验证用户身份或提供用户详细信息。例如,getpwuid函数是ls -l命令使用的重要工具,而getpwnam函数则常用于登录验证程序login

以下函数可用于访问整个口令文件:

#include 
struct passwd *getpwent(void);void setpwent(void);void endpwent(void);

调用getpwent时,它会返回口令文件中的下一个纪录项。setpwent函数会重置指针位置,endpwent则关闭相关文件。使用getpwent遍历完口令文件后,务必调用endpwent以确保文件关闭。

此外,getpwnam函数的一个实现范例如下:

#include 
#include
#include
struct passwd *getpwnam(const char *name) { struct passwd *ptr; setpwent(); while ((ptr = getpwent()) != NULL) { if (strcmp(name, ptr->pw_name) == 0) break; } endpwent(); return ptr;}

使用完getpwent后的文件应通过endpwent关闭,以防止资源泄漏。

6.3 阴影口令(Shadow Passwords)

为了增强安全性,一些系统将加密口令存储在称为“阴影口令”的文件中。该文件至少包含用户名和密码,以及可能的其他相关信息。与传统口令文件不同,阴影口令文件通常对普通用户不具有可读性,但需要有限的程序访问权限(如loginpasswd)。

为了访问阴影口令文件,需要使用以下函数:

#include 
struct spwd *getspnam(const char *name);struct spwd *getspent(void);void setpent(void);void endspent(void);

使用这些函数时需注意文件访问权限,确保操作符合安全规范。

6.4 组文件

组文件/etc/group记录了系统中的用户组信息。与口令文件类似,可以通过以下函数查看组信息:

#include 
struct group *getgrgid(gid_t gid);struct group *getgrnam(const char *name);

如果需要遍历整组文件,则需使用以下函数组合:

#include 
struct group *getgrent(void);void setgrent(void);void endgrent(void);

在访问这些函数时,请注意遵循文件访问和资源管理的规范。

6.5 附属组ID

附属组ID(_gid)为用户提供了属于多个组的可能性。这种机制有助于更细化用户权限管理。

6.6 实现区别

不同文件类型的接口在实现上有显著差异。尽管阴影口令和普通口令文件的访问方式类似,但对文件处理方式有所不同。理解这些区别对于有效使用系统功能至关重要。

6.7 其他数据文件

除了口令和组文件,UNIX系统还维护诸多其他数据文件。例如,/etc/services记录协议信息,/etc/protocols存储网络数据等。这些文件的接口与前述文件类似,通常包括读取、重置和关闭文件的函数。

6.8 登录账户记录

utmp文件记录用户登录状态,而wtmp文件则跟踪用户登陆和注销事件。这些日志文件为系统管理员提供了监控用户活动的重要工具。

6.9 系统标识(System Identification)

uname函数用于获取主机和操作系统的信息。其参数utsname结构包含详细的系统特征数据,为程序标识系统环境提供了必要的信息。

6.10 时间和日期例程(Time and Date Routines)

时间和日期管理是系统运行的重要基础。以下函数用于获取和设置时间信息:

#include 
time_t time(time_t *calptr);

此外,以下函数提供了更高精度的时间控制:

#include 
int clock_gettime(clockid_t clock_id, struct timespec *tsp);

clock_gettime函数在设置CLOCK_REALTIME时钟ID时提供功能,与time函数类似但精度更高。

此外,还有设置和获取时间精度的函数:

int clock_getres(clockid_t clock_id, struct timespec *tsp);int clock_settime(clockid_t clock_id, const struct timespec *tsp);

日期和时间的转换功能由以下函数完成:

#include 
struct tm *gmtime(const time_t *calptr);struct tm *localtime(const time_t *calptr);

gmtimelocaltime函数将时间转换为分解的格式,区别在于gmtime使用协调世界时,而localtime考虑本地时区和夏令时。

mktime函数将本地时间转换为time_t值:

time_t mktime(struct tm *tmptr);

strftimestrptime函数则用于格式化时间字符串,前者类似于printf,后者用于解析时间字符串:

size_t strftime(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr);size_t strftime_l(char *restrict buf, size_t maxsize, const char *restrict format, const struct tm *restrict tmptr, locale_t locale);

strptime函数是strftime的逆过程,用于将字符串解析为时间对象。

6.11 小结

本章介绍了UNIX系统中口令文件、组文件及其相关接口。通过理解阴影口令的作用,可以看出其对系统安全性的重要意义。附属组ID为用户提供了更细粒度的权限管理。除了口令和组文件之外,UNIX系统还维护了大量其他数据文件,其接口方式与前述文件相似,为程序提供了统一的操作方式。此外,uname函数用于标识主机和操作系统信息,而时间和日期管理函数则为系统运行提供了必要的基础。这些工具和接口的正确使用,使得应用程序能够高效且安全地运行。

转载地址:http://qsnez.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>