本文共 3184 字,大约阅读时间需要 10 分钟。
UNIX系统的运行依赖于大量与系统相关的数据文件,例如经常被多个程序频繁使用的口令文件/etc/passwd
和组文件/etc/group
。在系统登录或执行命令如ls -l
时,这些文件便被广泛访问。口令文件中的用户信息和组信息是应用程序获取用户权限的重要基础。
本章将探讨与这些数据文件相关的可移植接口,包括系统标识函数、时间和日期函数。这些接口为应用程序提供了便捷的方法来访问和管理系统数据,确保程序能够高效且安全地运行。
用户登录名或用户ID已知时,可以通过特定的函数查看关联信息。这类函数通常用于验证用户身份或提供用户详细信息。例如,getpwuid
函数是ls -l
命令使用的重要工具,而getpwnam
函数则常用于登录验证程序login
。
以下函数可用于访问整个口令文件:
#includestruct 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
关闭,以防止资源泄漏。
为了增强安全性,一些系统将加密口令存储在称为“阴影口令”的文件中。该文件至少包含用户名和密码,以及可能的其他相关信息。与传统口令文件不同,阴影口令文件通常对普通用户不具有可读性,但需要有限的程序访问权限(如login
和passwd
)。
为了访问阴影口令文件,需要使用以下函数:
#includestruct spwd *getspnam(const char *name);struct spwd *getspent(void);void setpent(void);void endspent(void);
使用这些函数时需注意文件访问权限,确保操作符合安全规范。
组文件/etc/group
记录了系统中的用户组信息。与口令文件类似,可以通过以下函数查看组信息:
#includestruct group *getgrgid(gid_t gid);struct group *getgrnam(const char *name);
如果需要遍历整组文件,则需使用以下函数组合:
#includestruct group *getgrent(void);void setgrent(void);void endgrent(void);
在访问这些函数时,请注意遵循文件访问和资源管理的规范。
附属组ID(_gid)为用户提供了属于多个组的可能性。这种机制有助于更细化用户权限管理。
不同文件类型的接口在实现上有显著差异。尽管阴影口令和普通口令文件的访问方式类似,但对文件处理方式有所不同。理解这些区别对于有效使用系统功能至关重要。
除了口令和组文件,UNIX系统还维护诸多其他数据文件。例如,/etc/services
记录协议信息,/etc/protocols
存储网络数据等。这些文件的接口与前述文件类似,通常包括读取、重置和关闭文件的函数。
utmp
文件记录用户登录状态,而wtmp
文件则跟踪用户登陆和注销事件。这些日志文件为系统管理员提供了监控用户活动的重要工具。
uname
函数用于获取主机和操作系统的信息。其参数utsname
结构包含详细的系统特征数据,为程序标识系统环境提供了必要的信息。
时间和日期管理是系统运行的重要基础。以下函数用于获取和设置时间信息:
#includetime_t time(time_t *calptr);
此外,以下函数提供了更高精度的时间控制:
#includeint 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);
日期和时间的转换功能由以下函数完成:
#includestruct tm *gmtime(const time_t *calptr);struct tm *localtime(const time_t *calptr);
gmtime
和localtime
函数将时间转换为分解的格式,区别在于gmtime
使用协调世界时,而localtime
考虑本地时区和夏令时。
mktime
函数将本地时间转换为time_t
值:
time_t mktime(struct tm *tmptr);
strftime
和strptime
函数则用于格式化时间字符串,前者类似于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
的逆过程,用于将字符串解析为时间对象。
本章介绍了UNIX系统中口令文件、组文件及其相关接口。通过理解阴影口令的作用,可以看出其对系统安全性的重要意义。附属组ID为用户提供了更细粒度的权限管理。除了口令和组文件之外,UNIX系统还维护了大量其他数据文件,其接口方式与前述文件相似,为程序提供了统一的操作方式。此外,uname
函数用于标识主机和操作系统信息,而时间和日期管理函数则为系统运行提供了必要的基础。这些工具和接口的正确使用,使得应用程序能够高效且安全地运行。
转载地址:http://qsnez.baihongyu.com/