Linux文件系统新增1--用户管理

来源:互联网 发布:如何更改淘宝店铺名字 编辑:程序博客网 时间:2024/05/24 16:14

第一部分 预备知识

strtok函数

原型:char *strtok(char *s, char *delim);
功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。 strtok在s中查找包含在delim中的字符并用NULL(‘\0’)来替换,直到找遍整个字符串。 返回指向下一个标记串。当没有标记串时则返回空字符NULL。

第二部分 代码增加

一,c语言代码

0.main.cpp修改

/**Linux文件管理系统*/#include <stdio.h>#include "filesys.h"#include <string.h># include<time.h>struct hinode   hinode[NHINO];struct dir      dir;struct file     sys_ofile[SYSOPENFILE];struct filsys   filsys;struct pwd      pwd[PWDNUM];struct user     user[USERNUM];//用于记录当前登录进来的用户,最大数量为USERNUMstruct inode*   cur_path_inode;int             user_id;char            disk[(DINODEBLK+FILEBLK+2)*BLOCKSIZ];//磁盘大小=引导块+超级块+索引结点+数据块char            str[100];char            cur_username[50];//当前用户名int main(){    char password[16];    user_id=-1;    format();//格式化磁盘    install();    printf("Welcome to mini filesystem of LinWhite!\n");    while(user_id==-1)    {        printf("Login:");        scanf("%s",cur_username);//输入用户uid        printf("Password:");        scanf("%s",password);        //strcpy(cur_username,"WangLin");        //strcpy(password,"bbbb");        user_id = login(cur_username,password);    }    do    {        if(!strcmp(cur_username,"root"))            printf("[%s@Localhost]# ",cur_username);//root命令提示符#        else             printf("[%s@Localhost]$ ",cur_username);//普通用户命令提示符$        fflush(stdin);        gets(str);    }while(shell(user_id,str));    logout(cur_username);    halt();    return 0;}

1. shell.cp修改

#include "filesys.h"#define CLEN 30#define CNUM 20//enum ctype 命令矩阵char commands[CNUM][CLEN]={    "exit",    "ls",    "mkdir",    "cd",    "mkfile",    "del",    "write",    "read",    /*用户管理命令*/    "who",//查看登录用户    "useradd",//增加用户    "userdel",//删除用户    "su",//切换用户    "passwd"//修改用户密码};
/*用户管理命令*/    case 8:/*who&who am i:查看登录用户*/        token=strtok(NULL,seps);        if(token)        {            token=strtok(NULL,seps);            if(token)            {                lsCurUser();                }            else printf("command not found: %s!\n",str);        }        else lsAllUser();//列出当前系统中已经登录的用户        break;    case 9:/*useradd:创建用户*/        if(strcmp(cur_username,"root"))//普通用户没有创建用户的权限        {            printf("权限不够,请咨询管理员!\n");            break;        }        else         {            token=strtok(NULL,seps);            if(token)                addUser(token);            else                 printf("command not found: %s!\n",str);            break;        }    case 10:/*userdel:删除用户*/        if(strcmp(cur_username,"root"))//普通用户没有删除用户的权限        {            printf("权限不够,请咨询管理员!\n");            break;        }        else         {            token=strtok(NULL,seps);            if(token)                delUser(token);            else                 printf("command not found: %s!\n",str);            break;        }    case 11:/*su:切换用户*/        token=strtok(NULL,seps);        if(token)        {            chanUser(token);        }        else        {            printf("command not found: %s!\n",str);        }        break;    case 12:/*passwd:修改用户密码*/        if(strcmp(cur_username,"root"))//普通用户没有修改用户密码的权限        {            printf("权限不够,请咨询管理员!\n");            break;        }        else        {            token=strtok(NULL,seps);            if(token)//输入的是passwd+username            {                chanPasswd(token);            }            else//如果只输入passwd,代表修改root的密码            {                chanPasswd("root");            }            break;        }

2.filesys.h修改

/*用户管理命令*/extern void          lsCurUser();//命令who:查看登录用户extern void          lsAllUser();//命令who am i:查看当前用户extern char*         getCurDate();//获取当前系统的时间extern void          addUser(char* uname);//创建用户extern void          delUser(char* uname);//删除用户extern void          chanUser(char* uname);//切换用户suextern void          chanPasswd(char* uname);//修改用户密码 passwd

3.新建usr.cpp

/**Name:usr.cpp*Author:WangLin*Created on:2015/12/10*Function:用户管理命令:who ;who am i;adduser;deluser;su*/#include <stdio.h>#include <string.h>#include "filesys.h"# include<time.h>/*获取系统当前日期,精确到秒*/char* getCurDate(){    time_t rawtime;    struct tm * timeinfo;    time ( &rawtime );    timeinfo = localtime ( &rawtime );    return asctime (timeinfo);}/*命令who am i:列出当前用户*/void lsCurUser(){    for(int i=0;i<USERNUM;++i)    {        if(!strcmp(cur_username,user[i].u_username))//根据用户名去索引,只列出当前用户的信息        {            printf("%-10s",user[i].u_username);//用户名            printf("%-6d",user[i].u_uid);//用户uid            printf("%-6d",user[i].u_gid);//用户组gid            printf("%-6d",user[i].u_default_mode);//用户默认权限            printf("%s\n",user[i].u_date);//用户登录时间            break;        }    }}/*命令who:列出当前登录的所有用户*/void lsAllUser(){    for(int i=0;i<USERNUM;++i)    {        if(user[i].u_uid!=0)//列出所有登录到系统中的用户        {            printf("%-10s",user[i].u_username);//用户名            printf("%-6d",user[i].u_uid);//用户uid            printf("%-6d",user[i].u_gid);//用户组gid            printf("%-6d",user[i].u_default_mode);//用户默认权限            printf("%s\n",user[i].u_date);//用户登录时间        }    }}/*命令:useradd创建用户*/void addUser(char* uname){    //检查username是否已经存在了 pwd    for (int i=0; i<PWDNUM; i++)    {        if(pwd[i].p_uid!=0&&!strcmp(pwd[i].p_name,uname))        {            printf("user already exists!\n");            return ;        }    }    //用户不存在,则新建用户:用户名+uid+password 内容写入到pwd末尾    for (int i=0; i<PWDNUM; i++)    {        if(pwd[i].p_uid==0)        {            pwd[i].p_uid=2116+i;            strcpy(pwd[i].p_name,uname);            pwd[i].p_gid=05;            printf("用户已创建!\n");            return ;        }    }    printf("创建的用户已达上限!\n");}/*命令:userdel删除用户*/void delUser(char* uname){    for (int i=0; i<PWDNUM; i++)    {        if(!strcmp(pwd[i].p_name,uname))        {            pwd[i].p_uid = 0;            pwd[i].p_gid = 0;            memset(pwd[i].p_name,0x00,sizeof(char*));            strcpy(pwd[i].password, "            ");  // 密码为空            printf("用户已删除!\n");            return ;        }    }}/*命令:su切换用户*/void chanUser(char* uname){    char passwd[PWDSIZ];    //root->普通用户,不需要密码    if(!strcmp(cur_username,"root"))    {        strcpy(cur_username,uname);        logout("root");//root用户logout        for(int i=0;i<PWDNUM;++i)//新用户login         {            if(!strcmp(uname,pwd[i].p_name))            {                login(uname,pwd[i].password);//系统自动获取普通用户的密码                break;            }        }    }    //普通用户->root,需要密码    else     {        printf("password:");//普通用户必须持有正确的root/其他用户的密码        scanf("%s",passwd);        for(int i=0;i<PWDNUM;++i)        {            if(!strcmp(passwd,pwd[i].password)&&!strcmp(uname,pwd[i].p_name))            {                logout(cur_username);//原来的用户logout                strcpy(cur_username,uname);//当前用户名修改为新用户的用户名                login(cur_username,passwd);//新用户login                return;            }        }        printf("密码错误!\n");    }}/*命令passwd:修改密码,只有root才有权限执行*/void chanPasswd(char* uname){    char passwd_1[PWDSIZ];    char passwd_2[PWDSIZ];    printf("输入新密码:");    scanf("%s",passwd_1);    printf("再次输入新密码:");    scanf("%s",passwd_2);    if(!strcmp(passwd_1,passwd_2))//两次密码一致    {        if(!strcmp(uname,"root"))//修改root密码        {            strcpy(pwd[0].password,passwd_1);            printf("root用户密码修改成功!\n");        }        else//修改普通用户密码        {            for(int i=0;i<PWDNUM;++i)            {                if(!strcmp(uname,pwd[i].p_name))                {                    strcpy(pwd[i].password,passwd_1);                    printf("%s用户密码修改成功!\n",uname);                    break;                }            }        }    }    else        printf("两次密码不匹配!\n");//两次密码不一致}

二,实现说明&运行结果

1.who—查看所有登录用户

列出所有登录用户的以下信息:
1)用户名+用户uid+用户所属组gid+用户默认权限+用户登录到系统中的日期(精确到秒)。

2.who am i—查看当前登录用户

列出当前登录用户的以下信息:
1)用户名+用户uid+用户所属组gid+用户默认权限+用户登录到系统中的日期(精确到秒)。
这里写图片描述

3.su—切换用户

在Linux中,root是权利最大的用户,被称为超级管理员,拥有无限的权限。普通用户的权限有限,有些操作普通用户没有权限执行,比如创建一个新用户,进入到root目录,或者删除系统的重要文件,系统为了保证安全限制了普通用户的权限。但是有时我们需要获取管理员权限去做一些必要的事情,比如安装软件。
su的最大作用就是让普通用户可以切换管理员,去执行一些作为普通用户不能执行的操作。
su的命令格式:su 用户名
在该系统中,允许普通用户向其他普通用户切换,普通用户持有正确的密码即可。
命令的执行有以下规则:
1)root->普通用户,不需要密码
2)普通用户->root/普通用户,需要密码

这里写图片描述

root->WangLin:不需要密码,用户直接切换。
WangLin->root:需要密码,密码正确才能切换。

这里写图片描述

4.useradd—创建用户

只有管理员才有权限创建用户,普通用户不能创建用户。
这里写图片描述
WangLin用户是普通用户,执行创建用户NieZiLi时,系统会提示权限不够,请咨询管理员。于是WangLin咨询了管理员,并得到了管理员的允许,获得了管理员的密码,执行了su root,切换到了root用户,于是就有权限创建用户NieZiLi了。
root创建用户时,默认将用户的密码置为空。NieZiLi用户创建以后,使用su切换用户,由于没有密码,所以不用输入密码,直接切换。

5. userdel删除用户

删除用户也只有管理员才有权限
这里写图片描述

6.passwd—修改用户密码

只有管理员才有权限修改用户密码。
以root身份登录:
1)修改root密码.只要输入
passwd
就会出现:
New password:
Retype new password:
按提示输入密码确认即可.
2)如果想更改其他用户密码,只要输入passwd username即可.
如:passwd WangLin
New password:
Retype new password:
这里写图片描述

0 0
原创粉丝点击