之前在写ftp客户端程序的时候遇到了一个问题就是当提示你输入password的时候实现程序能够获得到用户通过键盘的输入,但是不在屏幕上显示用户输入的字符,其实就是类似于linux用户登录时候需要输入密码的时候,你输入了字符但是在屏幕上是没有任何的提示信息的。当时一直没有想到如何去实现这样的功能,所以也就没去管它,反正只是一个作业要求没那么高,但是当时自己也上网去查了一下也没有查到结果,这几天一直在看Beginning
Linux Program这本书,没想到书上的第5章讲终端(Terminals)讲到了如何去实现那个功能。
要实现上面描述的功能只要去修改Linux终端的输入属性即可,在这里我们可以先通过shell命令去修改终端的属性。
通过stty -a命令可以查看当前终端的属性,显示的结果如下:
在这里我们要通过shell命令去修改终端的属性实现不显示输入的命令,在做这个实验之前最好是将终端的属性保存在文件中,以备实验完成以后恢复默认的属性。
1、 通过stty
–g > hyfeng命令将属性保存到文件中
2、通过stty –echo 去修改输入的属性,在执行完这个命令以后你的终端将只会有输出不会显示你通过键盘输入的任何字符,你可以输入ls命令去判断执行是否有效,我实验结果如下图:
你输入的ls命令并没有在屏幕上显示,但是它执行的结果被显示了。
3、
这样看不到输入的命令是很痛苦的,因此我们在做完上面的是实验以后一定要记得恢复终端的默认属性,命令如下stty $(cat hyfeng)这些命令都得盲输,呵呵。。。。
在linux下面用C实现需要用到如下的两个函数
int
tcgetattr(int fildes, struct termios *termios_p);函数的作用是获得终端的属性,并将它放入到struct termios结构体中。
int
tcsetattr(int fildes, int optional_actions, const struct termios *termios_p);函数的作用是设置终端的属性。
struct termios结构体,在这个结构体中包含了如下几个重要的变量
tcflag_t
c_iflag;这个变量是用来控制输入属性的
tcflag_t
c_oflag;这个变量是用来控制输出属性的
tcflag_t
c_cflag;这个变量是用来控制控制属性的
tcflag_t
c_lflag;这个变量是用来控制本地属性的
cc_t c_cc[NCCS]
#include
#include
#define
PASSWORD_LEN 8
int
main()
{
struct termios initialrsettings,
newrsettings;
char password[PASSWORD_LEN + 1];
tcgetattr(fileno(stdin),
&initialrsettings);
newrsettings = initialrsettings;
newrsettings.c_lflag
&= ~ECHO;
printf("Enter password: ");
if(tcsetattr(fileno(stdin), TCSAFLUSH,
&newrsettings) != 0) {
fprintf(stderr,"Could not set
attributes\n");
}
else {
fgets(password, PASSWORD_LEN, stdin);
tcsetattr(fileno(stdin), TCSANOW,
&initialrsettings);
fprintf(stdout, "\nYou entered
%s\n", password);
}
exit(0);
}
因为不知道怎么插入图片所以就将pdf传上来了
文件:Linux中不显示输入的字符.pdf
大小:125KB
下载: