我是一名Linux用户,我总是看到无论何时在终端输入密码,系统都会正确接受密码,但密码不会显示。
如何在 C程序中实现此目的?
答案 0 :(得分:3)
您可以在getpass
的帮助下完成此操作。但man getpass说
此功能已过时。不要使用它。如果要在未启用终端回显的情况下读取输入,请参阅termios(3)中的ECHO标志说明。
此代码可以使用(此代码是其他SO
帖子的精确副本)
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <string.h>
int main(int argc, char **argv)
{
struct termios oflags, nflags;
char password[128];
tcgetattr(fileno(stdin), &oflags);
nflags = oflags;
nflags.c_lflag &= ~ECHO;
nflags.c_lflag |= ECHONL;
if (tcsetattr(fileno(stdin), TCSADRAIN, &nflags) != 0) {
perror("tcsetattr");
return -1;
}
printf("\npassword(Echo Disabled) : ");
fgets(password, sizeof(password), stdin);
password[strlen(password) - 1] = 0;
printf("Entered password : %s\n", password);
if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) {
perror("tcsetattr");
return -1;
}
printf("\npassword(Echo Enabled) : ");
fgets(password, sizeof(password), stdin);
password[strlen(password) - 1] = 0;
printf("Entered password : %s\n", password);
return 0;
}
解释:
termios structure
在tcgetattr()
中获取终端当前属性以恢复终端属性。termios structure
并在termios structure
成员中设置禁用回显标记。termios structure
从新tcsetattr
设置新的终端属性。tcsetattr
再次设置旧保存的终端属性。这是将终端恢复到旧状态答案 1 :(得分:0)
您可以使用getpass
#include <unistd.h>
...
char *password = getpass("Password: ");
...
答案 2 :(得分:0)
使用getpass()或其他方式
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
int
main(int argc, char **argv)
{
struct termios oflags, nflags;
char password[64];
/* disabling echo */
tcgetattr(fileno(stdin), &oflags);
nflags = oflags;
nflags.c_lflag &= ~ECHO;
nflags.c_lflag |= ECHONL;
if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) {
perror("tcsetattr");
return EXIT_FAILURE;
}
printf("password: ");
fgets(password, sizeof(password), stdin);
password[strlen(password) - 1] = 0;
printf("you typed '%s'\n", password);
/* restore terminal */
if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) {
perror("tcsetattr");
return EXIT_FAILURE;
}
return 0;
}