<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pwd.h>
#include <shadow.h>
#include <string.h>
#include <termios.h>
pid_t sysuser_login(void);
int input_sw(int echo, int block);
int pass_shadow( char *passwd);
int user_shadow(char *user);
int main()
{
pid_t pid;
char ch;
while(1)
{
pid = sysuser_login();
if(pid == -2)
{
printf("no such user in system!\n");
}
else if(pid == -1)
{
printf("\nyou password is error\n");
}
else printf("\n%d load in system success!\n", pid);
printf("Do you want to continue?<y/n> ");
if((ch = getchar()) == 'n') break;
getchar();
}
return 0;
}
int input_sw(int echo, int block)
{
struct termios set;
tcgetattr(STDIN_FILENO,&set);
if(echo) set.c_lflag |= ECHO;
else set.c_lflag &=~ECHO;
if(block) set.c_lflag |= ICANON;
else set.c_lflag &=~ICANON;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &set);
}
int pass_shadow( char *passwd)
{
int i = 0;
char ch;
input_sw(0,0);
while((ch = getchar()) != '\n')
{
if(ch == 27)
{
if(i != 0)
{
i--;
printf("\b \b");
}
continue;
}
putchar('*');
passwd[i++] = ch;
}
passwd[i] = '\0';
input_sw(1,1);
return 0;
}
int user_shadow(char *user)
{
int i = 0;
char ch;
input_sw(0,0);
while((ch = getchar()) != '\n')
{
if(ch == 27)
{
if(i != 0)
{
i--;
printf("\b \b");
}
continue;
}
putchar(ch);
user[i++] = ch;
}
user[i]= '\0';
printf("\n");
input_sw(1,1);
return 0;
}
pid_t sysuser_login(void)
{
struct spwd *spwd;
struct passwd *pass;
char user[32];
char passwd[32];
char *sha;
char salt[32];
printf("Please input username: ");
user_shadow(user);
spwd = getspnam(user);
pass = getpwnam(user);
if(NULL == pass || NULL == spwd) return -2;
printf("Please input password: ");
pass_shadow(passwd);
int i = 0;
int flag = 0;
while(flag < 3)
{
if(spwd->sp_pwdp[i] == '$') flag++;
salt[i] = spwd->sp_pwdp[i];
i++;
}
salt[i] = '\0';
sha = crypt(passwd, salt);
if(strcmp(sha, spwd->sp_pwdp) == 0) return (pass->pw_uid);
else return -1;
}
APUE-文件与目录:一个LINUX用户登陆函数
最新推荐文章于 2022-03-15 15:57:28 发布