【问题标题】:What can't getpass take input from stdin?什么 getpass 不能从标准输入获取输入?
【发布时间】:2021-03-28 22:22:02
【问题描述】:
#include <unistd.h>
#include <stdio.h>

int main() {
    char *password = getpass("Password: ");
    puts(password);
    return 0;
}

我看到 getpass 无法从标准输入获取输入。

$ ./getpass <<< abc
Password:
xxx

这似乎与termios有关。谁能告诉我与这个程序等效的底层代码是如何完成的?

【问题讨论】:

    标签: c passwords glibc termios


    【解决方案1】:

    并不是getpass“不能”从stdin读取。它不是从stdin 读取的,因为这是它的手册页所示的设计方式,它从/dev/tty 读取:

    getpass()函数打开/dev/tty(进程的控制终端),输出字符串prompt,关闭回显,读取一行(“密码”),恢复终端状态并关闭@987654330再次@。

    如何使用termios中的函数关闭回显的例子出现在Michael Kerrisk的优秀The Linux Programming Interface中;示例代码是available online

    【讨论】:

    • 您能提供确切的等效代码吗?您提到的链接不等效。如果我在不等待从终端获取任何输入的情况下将某些内容通过管道传输到其标准输入,它将终止。
    • 获取程序行为的最简单方法(从/dev/tty而不是stdin读取)是将stdin重新打开为/dev/tty,您可以通过添加行来做到这一点` dup2(open("/dev/tty", O_RDWR), STDIN_FILENO);` 在buf 的声明之后。您还需要将#include &lt;fcntl.h&gt; 添加到包含中,以获得openO_RDWR 的声明。
    • getpass()做的完全一样吗?
    • Getpass 不会重新分配标准输入,所以不,它不一样。但我认为它向您展示了编写执行您想要的功能所需的所有知识。如果有什么具体的事情你不知道怎么做,你可以问一个具体的问题。
    • 我只想拥有相同的密码底层代码,而不仅仅是一个相似的。
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    相关资源
    最近更新 更多