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

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)

通过这些加密算法加密后的密码文件的格式如下:
5 saltencrypted符号是固定的格式。
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值