2014-02-25 70 views
1

Linux上的C语言中是否有任何函数允许等待用户输入而不在终端上显示他正在键入的内容? (就像当你在终端上的Linux输入密码)scanf()不显示在屏幕上

我发现的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); 
} 
+0

可能重复:http://stackoverflow.com/questions/1413445/read-a-password-from-stdcin问题是C++,但它显示了如何禁用'stdin'回波模式。 –

+0

为什么这太复杂了?另一种选择是使用像curses这样的库 –

回答

3

这不是scanf这是显示在屏幕上的字符,它是终端仿真回显您键入的字符。您可以使用您建议的技术(或使用库隐藏这一技术)禁用,但没有任何的摆弄与其他功能阅读STDIN将帮助。

1

getpass函数不可靠地存在,并且在其联机帮助页中“过时,避免”警告;然而,它基本上是你想要的。 (我怀疑这是过时的,因为它不能重返进入,不允许一个任意长密码,这是一种重要的时下进入。)的readpassphrase功能甚至不太便携,并有自己的怪癖(大部分标志例如不应该使用),但可以让您控制读取缓冲区的大小。而gnulib有getpass-gnu,附着在getpass调用约定但返回malloc编辑字符串,而不是一个指向静态存储,从而与原有getpass固定的重大问题。

在一个严肃的节目,我可能会与gnulib getpass开始,重命名功能(避免与libc中潜在的冲突),然后砍了一些比较可疑的功能(如从标准输入读取如果/dev/tty是不可用的 - 正确的事情要经过艰苦的努力,但要提供一些其他的方法让密码进入脚本使用程序)。或者,如果可行的话,我会围绕SSH密钥而不是密码构建程序。