请教linux下如何不回显输入密码?

prhanxben 2011-03-22 11:48:48
如题,登录linux的时候密码都是不显示的.
虽然有种方法是改变终端属性来不回显密码,但使用中存在问题.
我想系统api应该提供了类似方法让终端不回显输入密码吧?

不知linux/unix 上有没有成熟的办法来处理密码输入.
...全文
247 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
李亚超 2011-03-22
  • 打赏
  • 举报
回复
没有现成的
prhanxben 2011-03-22
  • 打赏
  • 举报
回复
感谢1楼,再问一个问题,请问如何在密码输入时处理控制字符?
我以为至少要处理一个BackSpace 让用户可以回退错误输入。
但我怎么能在输入中确认是BackSpace 呢? 改终端属性以后,getchar得到的ASCII码不是BS的8,而是127
无知者无谓 2011-03-22
  • 打赏
  • 举报
回复
在很多情况下,我们希望在控制台下,按键盘字符,程序马上反应而不是等待回车后才响应。
在Windows平台下可以使用getch ()(要求#include “conio.h“)实现,
而在Linux平台下没有这个头文件,也就无法使用这个函数。
车到山前必有路,我们另有办法。
先看下面这段代码:
struct termios stored_settings;
struct termios new_settings;
tcgetattr (0, &stored_settings);
new_settings = stored_settings;
new_settings.c_lflag &= (~ICANON);
new_settings.c_cc[VTIME] = 0;
new_settings.c_cc[VMIN] = 1;
tcsetattr (0, TCSANOW, &new_settings);

termios结构的描述了终端的模式,在这段代码中我们改变了它,使得终端能够接收到键盘输入马上返回。所以就能够使用一般的读取字符函数getchar ()来获得输入字符。
在退出你的程序时,要记得把终端环境改回来:
tcsetattr (0, TCSANOW, &stored_settings);


这几个函数以及结构要求包含头文件termios.h和stdio.h。
下面是一个测试文件,可以在Windows和Linux操作系统下,编译运行:
#include "stdio.h"
#include "stdlib.h"
#ifdef _WIN32 //Win32 platform
#include "conio.h"
#define get_char getch
#else
#include "termios.h"
#define get_char getchar
#endif

int main (int argc, char* argv[])
{
#ifdef _WIN32
//Do nothing
#else
struct termios stored_settings;
struct termios new_settings;
tcgetattr (0, &stored_settings);
new_settings = stored_settings;
new_settings.c_lflag &= (~ICANON);
new_settings.c_cc[VTIME] = 0;
new_settings.c_cc[VMIN] = 1;
tcsetattr (0, TCSANOW, &new_settings);
#endif
while (1) {
char c = get_char ();
if ('q' == c || 'Q' == c)
break;
printf ("You input: %c\n", c);
}
#ifdef _WIN32
//Do nothing
#else
tcsetattr (0, TCSANOW, &stored_settings);
#endif
return 0;
}

要提的一点是,getch ()是没有回显的,而getchar ()是有回显的,所以在Windows和Linux下的运行有点不同。
zxt6405 2011-03-22
  • 打赏
  • 举报
回复
LZ是要在自己的程序中实现密码的不显示么?
如果这样的话,你可以用ncurses库,这个库可以很成熟地处理字符界面的这些处理。

它有一对函数echo()和noecho()可以设置输入的回显。
应用到密码上就可以实现密码输入的不回显。
另外,LZ你要的对于backspace的处理,ncurses也做到了。
ncurses还有一对函数cbreak()和nocbreak(),可以设置输入的模式。在cbreak模式下,ncurses可以用getch()函数实现终端输入的处理,其中包括了对于backspace的识别。

ncurses处理各种字符终端的输入输出是一个挺成熟的库了,推荐LZ你试一试。
无知者无谓 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 prhanxben 的回复:]

感谢1楼,再问一个问题,请问如何在密码输入时处理控制字符?
我以为至少要处理一个BackSpace 让用户可以回退错误输入。
但我怎么能在输入中确认是BackSpace 呢? 改终端属性以后,getchar得到的ASCII码不是BS的8,而是127
[/Quote]
这是好多年前的代码,我自己也记不清了,你可以man tcsetattr 看看,有一些关于控制键的设定。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧