通过shell命令关闭回显
在Linux中通过stty相关指令可以关闭终端的回显,如下所示。
1
2
3
4
5
# turn off echo
stty -echo
# do something
# turn on echo
stty echo
如果是为了输入密码的话,也可用read命令的-s选项,如下所示。
1
2
# input your password
read -s password
C语言关闭回显
如果是为了输入密码而关闭回显的话,在C语言中,传统上有getpass函数。
1
2
3
#include <unistd.h>
char *getpass(const char *prompt);
但该函数现在已经被认为是过时的(obsolete),man中建议不要使用此函数,而是通过控制termios的ECHO标志来达到目的,这种做法也更为通用。一个简单的示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <termios.h>
void getpass(unsigned char *key)
{
struct termios old;
struct termios new;
char pass[32] = {0};
// save old attr
tcgetattr(STDIN_FILENO, &old);
// turn off echo
new = old;
new.c_lflag &= ~(ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &new);
if (NULL == fgets(pass, sizeof(pass), stdin))
pass[0] = '\0';
// recover old attr
tcsetattr(STDIN_FILENO, TCSANOW, &old);
printf("%s", pass);
return;
}