1

可能重复:
隐藏终端上的密码输入

请给我一个使用 C 语言的 Linux 密码程序的解决方案。

当我们输入密码的第一个字母时,应该显示窗口

password:*-

而不是输入的字母。

当我们输入下一个字符时,应该显示窗口

password**-

最多 8 个字符,并验证密码。

4

4 回答 4

2
read -s -n 8 -p "password:" mypassword

-s使其成为密码输入提示
-n限制字符数
-p STRING设置提示

输入的密码保存在$mypassword变量中以供进一步使用。

在 linux 命令行上输入密码时通常不会显示替代字符,因此该命令不提供执行此操作的选项。尽管如此,它仍然是您正在寻找的一个很好的近似值。

于 2012-07-30T06:51:49.100 回答
2

可能这可以帮助你

http://www.askdavetaylor.com/how_to_read_password_without_echoing_c.html

于 2012-07-30T07:42:26.267 回答
2

使用 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);
}
于 2012-07-30T08:26:34.760 回答
1

这只是一个想法,所以你可以尝试或不尝试。

一开始,您必须将终端设置为非回显模式。因此,不会显示用户的输入。(Termios 设置)

从变量计数器开始。您创建一个循环(while)并在其中使用 read 函数或 getchar 来获取每个输入。接下来,您检查输入是否正确。在终端上写“*”或什么都不写。

于 2012-07-30T08:34:43.933 回答