Chinaunix首页 | 论坛 | 博客
  • 博客访问: 996464
  • 博文数量: 829
  • 博客积分: 9980
  • 博客等级: 中将
  • 技术积分: 5020
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-29 14:06
文章分类

全部博文(829)

文章存档

2011年(1)

2008年(828)

我的朋友

分类: LINUX

2008-08-29 14:12:49

 
一个小问题,在linux编一个接收用户输入密码小程序,不显示密码。google和baidu了一下,竟然没有找到现成的,好吧,自己编一个。哪里想到,竟然一波三折。哈哈,最终还是搞定了!

1)很容易根据termios的结构屏蔽终端属性的输出。
但是,这样一来,用户的输入不显示在屏幕上。用户不知道自己输入的个数。对输入的内容心里也没有底。非常不方便。

2)于是改为一个一个字符的处理格式。编程实现了用''*''代替用户的输入。但是这样linux处于非授权模式,一个限制是‘退格’键不能用。用户必须保证一次输入正确,万一错了的话,只能眼睁睁的重新运行程序,重来一次。

3)我最终在2)的基础上,实现了用''*''代替用户的输入,并且backspacekey可用。

附代码:
#include
#include

#definepassLength100

intmain(intargc,char**argv)
{
structtermiotio,tin;
char*password=(char*)malloc(passLength);
char*b=password;

ioctl(0,TCGETA,&tio);
tin=tio;
tin.c_lflag&=~ECHO;/*turnoffECHO*/
tin.c_lflag&=~ICANON;/*turnoffICANON*/
tin.c_lflag&=~ISIG;
tin.c_cc[VINTR]=1;
tin.c_cc[VMIN]=1;
tin.c_cc[VTIME]=0;
/*
*Setthenewmodes.Againweignorereturn
*values.
*/
ioctl(0,TCSETA,&tin);

charselected;
intorder=0;
printf("Enterpassword:");
do{
selected=fgetc(stdin);
if((selected==''\b'')&&(order>0))
{
fputc(''\b'',stdout);
fputc('''',stdout);
fputc(''\b'',stdout);
order--;
password--;
*password=''\0'';
}elseif((selected!=''\n'')&&(selected!=''\r'')&&(selected!=''\b''){

*password =selected;
order ;
fputc(''*'',stdout);
fflush(stdout);
}
}while((selected!=''\n'')&&(selected!=''\r'')&&(order>=0)&&(order
/*
*Resettheoldttymodes.
*/
ioctl(0,TCSETA,&tio);
fprintf(stdout,"\nYouentered:%s\n",b);
free(b);
exit(0);

}

linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码linux 接收用户输入密码
阅读(393) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~