【问题标题】:password program in Ubuntu using C language [duplicate]Ubuntu中使用C语言的密码程序[重复]
【发布时间】:2012-07-27 19:47:41
【问题描述】:

可能重复:
Hide password input on terminal

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

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

password:*-

而不是输入的字母。

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

password**-

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

【问题讨论】:

标签: c linux passwords


【解决方案1】:
read -s -n 8 -p "password:" mypassword

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

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

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

【讨论】:

  • 他清楚地说明了C语言,而不是shell。但是,通过 POSIX system("read ...") 调用仍然很有用。
  • @LukaRamishvili:你是说popen?我看不出它对system 有什么用处。提示?
  • 是的,你说得对,如果他想读回输入的密码,他需要打开一个管道,而不只是调用(虽然使用system()调用可以达到视觉效果,它可能还不够)。
【解决方案2】:
【解决方案3】:

使用 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);
}

【讨论】:

    【解决方案4】:

    这只是一个想法,你可以试试。

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

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

    【讨论】:

    • 上一篇文章反映了这个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多