免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2694 | 回复: 4
打印 上一主题 下一主题

问一个关于密码输入处理的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-19 15:35 |只看该作者 |倒序浏览
比如说,我现在在shell下面执行一个程序,这个程序要获得键盘输入,一般来说,我输入的内容都要显示在屏幕上的,怎么才能不显示?就好像linux登陆的时候,输入密码不显示一样?

对于stdout stderr有点迷糊,望指教

顺便再问一下...比如说我现在想看ls这个命令的源代码?再哪儿能找到?

论坛徽章:
0
2 [报告]
发表于 2007-03-19 16:04 |只看该作者
去看终端I/O相关的东西,也就是termios.h里的一些内容,可以允许你更改终端设备的某些特性,其中就包括了设置输入字符是否回显的参数ECHO,具体相关函数有tcgetattr()----获取终端属性, tcsetattr()-----设置终端属性等。

  简单来说就是通过设置终端回显标志来实现是否回显输入字符的。

  这只是实验方法之一,也可以不通过控制终端设备而在纯粹的应用代码层上实现,这就属于技巧的范畴了。

论坛徽章:
0
3 [报告]
发表于 2007-03-19 16:08 |只看该作者
另外有专门的函数来实现这个功能的。比如getpass(), 不过如同man page所说,最好不要再使用这个函数。curses库里似乎有一个相关函数,记不太清楚了, man ncurses可以看看。

论坛徽章:
0
4 [报告]
发表于 2007-03-19 21:52 |只看该作者
getch可以,不过编译出来以后,老是出现段错误....

论坛徽章:
0
5 [报告]
发表于 2007-04-28 13:24 |只看该作者
int main(int argc, char *argv[])
{
    struct termios ts,ots;
    char passbuf[1024],passbuf1[1024];
    unsigned char *epwd;
    int i;
    tcgetattr(STDIN_FILENO,&ts);
    ots = ts;
    ts.c_lflag &= ~ECHO;
    ts.c_lflag |= ECHONL;
    tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts);

   
    if(ts.c_lflag & ECHO){
        fprintf(stderr,"Failed to turn off echo \n");
        tcsetattr(STDIN_FILENO,TCSANOW,&ots);
        exit(1);
    }

    printf("Enter password:");
    fflush(stdout);
    fgets(passbuf,1024,stdin);
    printf("Re-type password:");
    fflush(stdout);
    fgets(passbuf1,1024,stdin);
   
    if(strcmp(passbuf,passbuf1) != 0){
        fprintf(stderr,"password not same \n");
        exit(1);
        
    }
    printf("%s",passbuf);

    tcsetattr(STDIN_FILENO,TCSAFLUSH,&ots);
     
    return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP