当他们要求密码时,在某些终端程序中,您是否都感到奇怪,因此它不会显示任何内容或显示'**********'在打字时。
那么这些程序如何获取密码?
默认的终端输入模式是回声的,因此,一旦我们开始在终端中键入任何字符,它同时显示在那里。但是我们可以更改此默认行为以完成我们从终端获取密码的工作。
这是一个简单的程序,可以演示我们如何做到这一点。 termios.h
是定义与终端相关的所有结构和功能的标题文件。
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
int getch() {
int ch;
// struct to hold the terminal settings
struct termios old_settings, new_settings;
// take default setting in old_settings
tcgetattr(STDIN_FILENO, &old_settings);
// make of copy of it (Read my previous blog to know
// more about how to copy struct)
new_settings = old_settings;
// change the settings for by disabling ECHO mode
// read man page of termios.h for more settings info
new_settings.c_lflag &= ~(ICANON | ECHO);
// apply these new settings
tcsetattr(STDIN_FILENO, TCSANOW, &new_settings);
// now take the input in this mode
ch = getchar();
// reset back to default settings
tcsetattr(STDIN_FILENO, TCSANOW, &old_settings);
return ch;
}
int main(void) {
char password[100];
int i = 0;
int ch;
printf("Enter password: ");
while ((ch = getch()) != '\n') {
if (ch == 127 || ch == 8) { // handle backspace
if (i != 0) {
i--;
printf("\b \b");
}
} else {
password[i++] = ch;
// echo the '*' to get feel of taking password
printf("*");
}
}
password[i] = '\0';
printf("\nYou entered password: %s\n", password);
return 0;
}
输出:
Enter password: *****
You entered password: naman
而不是编写整个程序,我们可以使用Inbuild函数getoass
在unistd.h
标头中定义无需回声即可获取密码,但是我们在写作时没有太多的控制权。
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *password;
password = getpass("Enter password: ");
printf("You entered password: %s\n", password);
return 0;
}
输出:
Enter password:
You entered password: naman
注意:
getpass
的人页面说函数打开/dev/tty(过程的控制终端),输出字符串提示“密码”),恢复终端状态并再次关闭/dev/tty。,这意味着该密码不会存储在Shell历史记录中。注意:自定义该程序的实现也不会将密码存储在Shell历史记录中,即使它正在从
。stdin
中获取输入。原因是getch
函数直接从终端读取字符而不等待用户按Enter键,因此密码不会以命令传递给Shell。
非常感谢您阅读本文。我也是一个学习新事物的学生,所以如果您发现任何错误或有任何建议,请在评论中告诉我。
另外,如果以任何方式帮助您,请考虑共享并给予大拇指。