1

Linux 上的 C 语言中是否有任何功能允许等待用户输入而不在终端上显示他正在输入的内容?(就像你在 Linux 终端上输入密码时一样)

我找到了 getch() 但它不适用于 Linux ... :(

我发现了这个,但它太复杂了......:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>

int     main(void)
{
   char buffer[100];
   struct termios infos;
   int   size;

   if (tcgetattr(STDIN_FILENO, &infos) == -1)                                                                                                  
   {
        fprintf(stderr, "Erreur tcgetattr.\n");
        return (EXIT_FAILURE);
   }
   infos.c_lflag &= ~ECHO;                                                                                                                                 

   if (tcsetattr(STDIN_FILENO, TCSANOW, &infos) == -1)                                                                                        
   {
        fprintf(stderr, "Erreur tcsetattr.\n");
        return (EXIT_FAILURE);
   }
   if ((size = read(STDIN_FILENO, buffer, sizeof(char) * 100)) == -1)                                            
   {
        fprintf(stderr, "Erreur durant la lecture.\n");
        return (EXIT_FAILURE);
   }
   buffer[size - 1] = '\0';
   printf("le buffer contient [%s]\n", buffer);                                                                                                 
   return (EXIT_SUCCESS);
}
4

2 回答 2

3

不是scanf在屏幕上显示字符,而是终端仿真正在回显您键入的字符。您可以使用您建议的技术禁用它(或使用库来隐藏它),但是再多的摆弄其他要阅读STDIN的功能也无济于事。

于 2014-02-25T19:57:33.030 回答
1

getpass功能不可靠,并且在其联机帮助页中有“过时,避免”警告;但是,它基本上可以满足您的需求。(我怀疑它已经过时了,因为它不是可重入的,并且不允许输入任意长的密码,这在当今很重要。)该readpassphrase功能的可移植性更差,并且有自己的怪癖(大多数标志不应该是例如),但确实可以让您控制读取缓冲区的大小。gnulib 有getpass-gnu,它遵循getpass调用约定,但返回一个malloced 字符串而不是指向静态存储的指针,从而解决了原始getpass.

在一个严肃的程序中,我可能会从 gnulib 开始getpass,重命名函数(以​​避免与 libc 的潜在冲突),然后删除一些更可疑的功能(比如在/dev/tty不可用时从 stdin 读取 - 正确的事情就是失败,但提供一些其他方式将密码短语输入程序以供脚本使用)。或者,如果可行,我会围绕 SSH 密钥而不是密码构建程序。

于 2014-02-25T20:08:22.800 回答