第六章 系统数据文件和信息
6.1 引言
6.2 口令文件
1.口令文件即存放在/etc/passwd中。
格式如:root:x:0:0:root:/root:/bin/bash
一次代表:用户名,加密口令,UID,GID,全名,主目录,默认shell
2.passwd结构体:
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. */
};
3. 函数原型:
struct passwd * getpwuid(uid_t uid);
struct passwd * getpwnam(const char * name);
头文件:pwd.h
返回值:成功返回指针,出错返回NULL。
函数功能:根据登录名或用户ID,获取口令文件项(passwd结构)
struct passwd * getpwent(void); //返回口令文件中的下一个记录项(passwd结构的指针)
void setpwent(void); //使指针定位在文件的开始位置
void endpwent(void); //关闭口令文件
头文件:pwd.h
返回值:getpwent()成功返回指针,出错或到达文件末尾返回NULL
函数功能:3个函数一起使用,查看整个口令文件
4. 示例
********************** 下面是 例 6-1 ***************************
#include <pwd.h>
#include <stdio.h>
int main()
{
struct passwd *ptr;
setpwent();
while((ptr=getpwent())!=NULL){
printf("name=%s,uid=%d,gid=%d,dir=%s,shell=%s/n",ptr->pw_name,
ptr->pw_uid,ptr->pw_gid,ptr->pw_dir,ptr->pw_shell);
}
return 0;
}
**************************************************************
6.3 阴影口令
1. 阴影口令文件存放在/etc/shadow中。
2. spwd结构体:
/* Structure of the password file. */
struct spwd
{
char * sp_namp; /* Login name. */
char * sp_pwdp; /* Encrypted password. */
long int sp_lstchg; /* Date of last change. */
long int sp_min; /* Minimum number of days between changes. */
long int sp_max; /* Maximum number of days between changes. */
long int sp_warn; /* Number of days to warn user to change the password. */
long int sp_inact; /*Number of days the account may be inactive. */
long int sp_expire; /* Number of days since 1970-01-01 until account expires. */
unsigned long int sp_flag; /* Reserved. */
};
3.函数原型:
struct spwd * getspnam(const char *name);
头文件:shadow.h
函数功能:根据登录名,返回spwd结构体指针
返回值:成功返回指针,出错返回NULL
struct spwd *getspent(void);
void setspent(void);
void endspent(void);
头文件:shadow.h
函数功能:使用这3个函数,读取整个阴影口令文件。使用方法,参考例6-1.
返回值:getspent成功则返回指针,出错返回NULL。
6.4 组文件
1、组文件存放在/etc/group
2. group 结构体
/* The group structure. */
struct group
{
char * gr_name; /* Group name. */
char * gr_passwd; /* Password. */
gid_t gr_gid; /* Group ID. */
char ** gr_mem; /* Member list. */
};
3. 函数原型:
struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);
头文件:grp.h
函数功能:由组名或组ID来获取组文件的一项(也就是group结构)。
返回值:成功则返回指针,出错则返回NULL
struct group *getgrent(void);
void setgrent(void);
void endgrent(void);
头文件:grp.h
函数功能:获取整个组文件
返回值:getgrent()若成功则返回指针,出错则或到达文件末尾则返回NULL
使用方法:参看例6-1
6.5 附加组ID
1.函数原型:
getgroups(int gidsetsize,gid_t grouplist[]);
头文件:unistd.h
函数功能:取得当前用户的所有的组ID。
返回值:若成功则返回附加组ID数,若出错则返回-1.
setgroups(int ngroups,const gid_t grouplist[]);
initgroups(const char *username,gid_t basegid);
头文件:grp.h
返回值:若成功则返回0,出错则返回-1.
注意:不会使用这两个函数。
2. 示例
************* 例 6-2 **************************
#include <stdio.h>
#include <unistd.h>
int main()
{
gid_t list[500];
int x,i;
x=getgroups(0,list);
getgroups(x,list);
for(i=0;i<x;i++)
{
printf("%d:%d/n",i,list[i]);
}
return 0;
}
********************************************
6.6 实现的区别
6.7 其他数据文件
1.读取数据文件至少有这个3个函数:
(1) get 函数:读取下一个记录。
(2) set 函数:打开数据文件(如果尚未打开),然后将指针定位在文件开始位置。
(3) end函数:关闭相应的数据文件。
2.存取系统数据文件:
说明 数据文件 头文件 结构 附加的关键字查找函数
口令 /etc/passwd pwd.h passwd getpwnam,getpwuid
组 /etc/group grp.h group getgrnam,getgrgid
阴影 /etc/shadow shadow.h spwd getspnam
主机 /etc/hosts netdb.h hostent gethostbyname,gethostbyaddr
网络 /etc/networks netdb.h netent getnetbyname,getnetbyaddr
协议 /etc/protocols netdb.h protoent getprotobyname,getprotobynumber
服务 /etc/services netdb.h servent getservbyname,getservbyname
6.8 登陆账户记录
1、/var/run/utmp:记录当前登录进系统的各个用户。
2、/var/log/wtmp:它跟踪各个登陆和注销事件。
3、每次写入上面两个文件中的是包含下列utmp结构的一条二进制记录:
struct exit_status {
short int e_termination; /* process termination status */
short int e_exit; /* process exit status */
};
struct utmp {
short ut_type; /* type of login */
pid_t ut_pid; /* PID of login process */
char ut_line[UT_LINESIZE]; /* device name of tty - "/dev/" */
char ut_id[4]; /* init id or abbrev. ttyname */
char ut_user[UT_NAMESIZE]; /* user name */
char ut_host[UT_HOSTSIZE]; /* hostname for remote login */
struct exit_status ut_exit; /* The exit status of a process marked as DEAD_PROCESS */
long int ut_session; /* Session ID, used for windowing */
struct timeval ut_tv; /* Time entry was made */
int32_t ut_addr_v6[4]; /* IP address of remote host */
char __unused[20]; /* Reserved for future use */
};
6.9 系统标识
1.utsname结构,用于存储当前主机和操作系统的有关信息。
/* Structure describing the system and machine. */
struct utsname
{
char sysname[]; /* Name of the implementation of the operating system. */
char nodename[]; /* Name of this node on the network. */
char release[]; /* Current release level of this implementation. */
char version[]; /* Current version level of this release. */
char machine[]; /* Name of the hardware type the system is running on. */
};
2.函数原型:int uname(struct utsname * name);
头文件:sys/utsname.h
返回值:成功则返回非负值,出错则返回-1.
int gethostname(char *name,int namelen);
头文件:unistd.h
返回值:成功则返回0,出错则返回-1.
6.10 时间和日期例程
1.日历时间:用数据类型time_t表示,其值是从1970年1月1日00:00:00:00到现在的秒数。
2.设置当前时间:settimeofday函数
3.时间函数关系图:
4. 结构体timeval,tm
struct timeval
{
time_t tv_sec; //seconds
long tv_usec; //microseconds
}
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]*/
}
5.函数原型:
int gettimeofday(struct timeval *restrict tp,void *restrict tzp);
头文件:sys/time.h
返回值:总是返回0
函数功能:获取当前时间
注意:tp要定义成结构变量,这样引用"&tp"。
time_t time(time_t * calptr);
头文件: time.h
返回值:若成功则返回时间值,若出错则返回-1。
函数功能:获取当前时间
struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);
头文件:time.h
返回值:指向tm结构的指针
time_t mktime(struct tm*tmptr);
头文件:time.h
返回值:若成功则返回日历时间,若出错则返回-1.
char *asctime(const struct tm *tmptr);
char *ctime(const time_t *calptr);
头文件:time.h
返回值:指向以null结尾的字符串的指针(如:Tue Feb 10 18:27:38 2004/n/0)。
size_t strftime(char *restrict buf,size_t maxsize,const char *restrict format, const
struct tm *restrict tmptr);
头文件:time.h
返回值:若有空间则返回存入数组的字符串,否则返回0
6、localtime,mktime,ctime,strftime受环境变量TZ影响:如果定义了TZ,则这些函数将使用其值以代替系
统默认时区。如果TZ定义为空串,则使用国际标准时间UTC。
链接:ttp://blog.csdn.net/wyjlovec/archive/2009/10/06/4635650.aspx
作者:wyjlovec
QQ:294448030
转载请保留作者信息