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

第一部分 预备知识

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];//用于记录当前登录进来的用户,最大数量为USERNUM
struct 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);//切换用户su
extern 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:
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值