可能重复:
隐藏终端上的密码输入
请给我一个使用 C 语言的 Linux 密码程序的解决方案。
当我们输入密码的第一个字母时,应该显示窗口
password:*-
而不是输入的字母。
当我们输入下一个字符时,应该显示窗口
password**-
最多 8 个字符,并验证密码。
可能重复:
隐藏终端上的密码输入
请给我一个使用 C 语言的 Linux 密码程序的解决方案。
当我们输入密码的第一个字母时,应该显示窗口
password:*-
而不是输入的字母。
当我们输入下一个字符时,应该显示窗口
password**-
最多 8 个字符,并验证密码。
read -s -n 8 -p "password:" mypassword
-s
使其成为密码输入提示
-n
限制字符数
-p STRING
设置提示
输入的密码保存在$mypassword
变量中以供进一步使用。
在 linux 命令行上输入密码时通常不会显示替代字符,因此该命令不提供执行此操作的选项。尽管如此,它仍然是您正在寻找的一个很好的近似值。
使用 C 功能:
/* no test */
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
static void
changeMode(bool b)
{
static struct termios cooked;
static int raw_actived = 0;
if (raw_actived == b) return;
if (b) {
struct termios raw;
tcgetattr(STDIN_FILENO, &cooked);
raw = cooked;
cfmakeraw(&raw);
tcsetattr(STDIN_FILENO, TCSANOW, &raw);
} else {
tcsetattr(STDIN_FILENO, TCSANOW, &cooked);
}
raw_actif = b;
}
static void
clean(void)
{
int c;
do
c = getchar();
while (c != '\n' && c != EOF);
}
void
askPassword(char *s, size_t n)
{
changeMode(1);
for (size_t i = 0; i < n; ++i) {
s[i] = getchar();
clean();
putchar('*');
}
changeMode(0);
}
这只是一个想法,所以你可以尝试或不尝试。
一开始,您必须将终端设置为非回显模式。因此,不会显示用户的输入。(Termios 设置)
从变量计数器开始。您创建一个循环(while)并在其中使用 read 函数或 getchar 来获取每个输入。接下来,您检查输入是否正确。在终端上写“*”或什么都不写。