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:
- Linux文件系统新增1--用户管理
- Linux用户/文件系统管理
- linux 之 用户管理(新增用户与删除)
- Linux常用命令-新增用户
- linux用户新增
- Linux新增用户
- Centos新增一个管理用户
- Linux文件系统管理(1)
- linux用户管理1
- linux用户管理(1)
- Linux用户管理(1)
- linux用户管理1
- linux-文件系统管理04-文件系统
- linux新增用户和密码
- Linux、Unix新增删除用户
- 文件系统&&用户管理(一)
- 文件系统&&用户管理(二)
- linux新增硬盘,做ext4的文件系统
- T-SQL语句创建数据库
- 安卓UI控件1
- Spring+Mybatis整合事务不起作用之解决方案汇总
- iPhone 开发中 Duplicate interface definition for class’*'怎么处理那?
- system调用导致子进程socket句柄泄漏问题分析
- Linux文件系统新增1--用户管理
- CISCO switches change the VTP modeautomatically from client to transparent
- webview.addJavascriptInterface() doen not work on API 16+
- Scala基础教程(二):数据类型、变量
- 多列radiogroup
- 手把手教你轻松实现listview下拉刷新
- iOS9下修改回HTTP模式进行网络请求
- 【C++设计技巧】C++中的RAII机制
- Scala基础教程(三):访问修饰符、运算符