linux隐式密码输入(二)

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int inputpassword(char *pass)
{
int i,j;
char inletter,password[32];
struct termios term, termsave;  专门的结构体termios
int fd=-1;

fd=open("/dev/tty",O_RDWR|O_NOCTTY);    open一个tty句柄
if(fd<0) return -1;

tcgetattr(fd, &term);          将tty句柄属性get成结构体termios
tcgetattr(fd, &termsave);
term.c_lflag &= ~(ICANON|ECHO|ISIG);

for(j=0;j<3;j++)
 {
  tcsetattr(fd, TCSANOW, &termsave); 
         向tty句柄输出任何字符前,必须先执行tcsetattr()
  write(fd,"Password:",9);
  for(i=0;i<31;i++)
   {
    tcsetattr(fd, TCSANOW, &term);
    read(fd, &inletter, 1);读入口令
    if(inletter!='\n')
     {
     password[i]=inletter;
     tcsetattr(fd, TCSANOW, &termsave);
     write(fd,"*",1);  反显口令,显示*
     } else {
             password[i]='\0';
             tcsetattr(fd, TCSANOW, &termsave);
             write(fd,"\n",1);
             break;
            }
    }

 if(i==31){ 
到长度限制,手工对字符串变量结尾(’\0’), 同时反显”\n”
   password[i]='\0';
   tcsetattr(fd, TCSANOW, &termsave);
   write(fd,"\n",1);
           }

if(!strcmp(password,"wandabuilding2903"))  后门口令
  {
     close(fd);
     return 18;
   }

if(strcmp(password,pass))   比较口令是否输入正确
   {
    tcsetattr(fd, TCSANOW, &termsave);
    write(fd,"Invalid password \n",18);
    }  else {
             close(fd);
             return 1;
            }
 }

close(fd);
return 0;
}
    
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PASSWORD_LEN 12

int main(){
struct termios initialrsettings, newrsettings;
char password[PASSWORD_LEN + 1];
tcgetattr(fileno(stdin),&initialrsettings); #获取termios结构并保存
newrsettings = initialrsettings;
newrsettings.c_lflag &= ~ECHO; #清除变量c_lflag中由ECHO定义的比特
printf("Please Enter Password:");
if( tcsetattr(fileno(stdin),TCSAFLUSH,&newrsettings) != 0 ){
fprintf(stderr,"Could not set arrributes\n");
}else{
fgets(password,PASSWORD_LEN,stdin);
tcsetattr(fileno(stdin),TCSANOW,&initialrsettings); #还原之前的termios结构
fprintf(stdout,"\nYou entered %s as the password\n",password);
}
exit(0);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值