博客
关于我
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/

你可能感兴趣的文章
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>