原型:char *strtok(char *s, char *delim);
功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。 strtok在s中查找包含在delim中的字符并用NULL(‘\0’)来替换,直到找遍整个字符串。 返回指向下一个标记串。当没有标记串时则返回空字符NULL。
/**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;
}
#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;
}
/*用户管理命令*/
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
/* *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)用户名+用户uid+用户所属组gid+用户默认权限+用户登录到系统中的日期(精确到秒)。
列出当前登录用户的以下信息:
1)用户名+用户uid+用户所属组gid+用户默认权限+用户登录到系统中的日期(精确到秒)。
在Linux中,root是权利最大的用户,被称为超级管理员,拥有无限的权限。普通用户的权限有限,有些操作普通用户没有权限执行,比如创建一个新用户,进入到root目录,或者删除系统的重要文件,系统为了保证安全限制了普通用户的权限。但是有时我们需要获取管理员权限去做一些必要的事情,比如安装软件。
su的最大作用就是让普通用户可以切换管理员,去执行一些作为普通用户不能执行的操作。
su的命令格式:su 用户名
在该系统中,允许普通用户向其他普通用户切换,普通用户持有正确的密码即可。
命令的执行有以下规则:
1)root->普通用户,不需要密码
2)普通用户->root/普通用户,需要密码
root->WangLin:不需要密码,用户直接切换。
WangLin->root:需要密码,密码正确才能切换。
只有管理员才有权限创建用户,普通用户不能创建用户。
WangLin用户是普通用户,执行创建用户NieZiLi时,系统会提示权限不够,请咨询管理员。于是WangLin咨询了管理员,并得到了管理员的允许,获得了管理员的密码,执行了su root,切换到了root用户,于是就有权限创建用户NieZiLi了。
root创建用户时,默认将用户的密码置为空。NieZiLi用户创建以后,使用su切换用户,由于没有密码,所以不用输入密码,直接切换。
删除用户也只有管理员才有权限
只有管理员才有权限修改用户密码。
以root身份登录:
1)修改root密码.只要输入
passwd
就会出现:
New password:
Retype new password:
按提示输入密码确认即可.
2)如果想更改其他用户密码,只要输入passwd username即可.
如:passwd WangLin
New password:
Retype new password: