您的位置:首页 > 编程语言

UNIX环境高级编程-读书笔记-系统文件信息

2017-06-27 09:27 489 查看
1.用户信息文件

用户信息文件是在/etc/passwd

struct passwd {

char pw_name; / username */

char pw_passwd; / user 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 */

};

这是用户信息一个结构体。

struct passwd *getpwnam(const char *name);

通过用户名字来获取用户的所有信息

返回值的类型:struct passwd*

这个结构体:

pw_name 用户名

pw_passwd 密码

pw_uid 用户ID

pw_gid 用户组ID

pw_dir 家目录

pw_shell shell程序

struct passwd *getpwuid(uid_t uid);

通过用户的用户id来获取用户的信息的函数。

2.用户的密码文件

用户的密码文件是在/etc/shadow

包含:登录名:加密后的密码:密码最后一次修改的时间:修改密码的最小的时间间隔:密码修改后的有效期:警告时间

struct spwd {

char sp_namp; / Login name */

char sp_pwdp; / Encrypted password */

long sp_lstchg; /* Date of last change (measured

in days since 1 Jan 1970) */

long sp_min; /* Min # of days between changes */

long sp_max; /* Max # of days between changes */

long sp_warn; /* # of days before password expires

to warn user to change it */

long sp_inact; /* # of days after password expires

until account is disabled */

long sp_expire; /* Date when account expires (measured

in days since 1 Jan 1970) */

unsigned long sp_flag; /* Reserved */

};

struct spwd *getspnam(const char *name);

通过用户的名字获取用户的密码文件的信息

3.加密函数:crypt()

char *crypt(const char *key, const char *salt);

key : 要加密的密码

salt: 加密的佐料

说明:这里的salt ,就是在加密密码的时候,我们需要添加的一些字符,从而达到加密的目的

加密的算法有很多:

ID | Method

1 | MD5

2a | Blowfish (not in mainline glibc; added in some

| Linux distributions)

5 | SHA-256 (since glibc 2.7)

6 | SHA-512 (since glibc 2.7)

通过这些加密算法加密后的密码文件的格式如下:

5saltencrypted其中的三个符号是固定的格式。

5 是加密算法的ID

salt也就是佐料是固定的16位

encrypted也就是真正是加密后的密码,不同的加密算法,其位数是不一样的,

如下:

MD5 | 22 characters

SHA-256 | 43 characters

SHA-512 | 86 characters

现在版本使用的是SHA——512的加密算法

4.目录操作:

对目录的操作,我们有两组方式:

第一种方式:

struct dirent

{

ino_t d_ino;

char d_name[NAME_MAX+1] ;目录下文件的名字

};

DIR *opendir(const char *name);

打开一个目录

返回值:DOR*类型的值 DIR其实是宏定义的一个则整数,

struct dirent * readdir(DIR* );

读一个目录中的信息

dirent结构体在上面

int closedir(DIR *dirp);

关闭一个目录。

我们在打开一个目录后,在进行了操作以后 ,一定要把它进行关闭

下面是一个使用的实例:

int main (int argc, char ** argv)

{

DIR* dirptr = NULL;

struct dirent * entry;

if((dirptr = opendir(argv[1])) == NULL)

{

sprintf(stderr, “opendir falt!”);

return -1;

}

else

{

while(entry = readdir(dirptr))

{

printf(“%s\n”,entry->d_name);

}

closedir(dirptr);

}

return 0;

}

第二种方式:

使用glob模式:是在整个的文件系统中匹配指定模式的所有文件

int glob(const char *pattern, int flags,

int (*errfunc) (const char *epath, int eerrno),glob_t *pglob);

pattern: 指定的模式:例如: “./*” 就是匹配当前目录下所有的文件

“/etc/.*” 就是匹配/etc/下的所有以.开头的文件

flages :额外的标志,如果不需要就是 0

errfunc: NULL

pglob :获取的文件的信息都存储在这个类型的数据下

他的类型glob_t 如下

typedef struct {

size_t gl_pathc; /* Count of paths matched so far */

char *gl_pathv; / List of matched pathnames. */

size_t gl_offs; /* Slots to reserve in gl_pathv. */

} glob_t;

其中:gl_pathc :表示pattern所匹配的目录下面的文件的个数 gl_pathv :表示pattern所匹配的目录下面的文件名字的数组

void globfree(glob_t *pglob);

关闭一个glob_t 的对象.

注意每一次创建的时候,在最后的时候都必须要使用此函数进行关闭

实例:

实现把符合某一模式下的所有文件的名字都打印出来

int main ()

{

glob_t * glb;

glob(“/ect/.*”, 0, NULL,glb);

int i;

for(i = 0;i < glb->gl_pathc;i++)

{

printf(“%s\n”,glb->gl_pathv[i]);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 读书笔记 unix
相关文章推荐