2014-02-25 119 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密鑰而不是密碼構建程序。