2009-07-28 8 views
20

मैं पासवर्ड प्राप्त करने के लिए getpass() का उपयोग कर सकता हूं। हालांकि, मैन पेज कहता है:गेटपास (3) के बिना सी में पासवर्ड प्राप्त करना?

यह फ़ंक्शन अप्रचलित है। का उपयोग न करें।

किसी पॉज़िक्स-अनुरूप तरीके से उपयोगकर्ता के टर्मिनल से पासवर्ड प्राप्त करने का वर्तमान तरीका क्या है? [मूल रूप से मैंने "पोर्टेबल" कहा, लेकिन मेरा इरादा एक अप्रचलित फ़ंक्शन का उपयोग करने से बचाना था।]

+4

कोई पोर्टेबल तरीका नहीं है - यह आपके प्लेटफ़ॉर्म पर भारी निर्भर करता है। –

+0

@ जेरी, यह इसके लायक नहीं है ... भले ही यह लीगेसी है, यह इसके बारे में जाने का सबसे पोर्टेबल तरीका है। –

उत्तर

13

इस linux/MacOSX पर काम करना चाहिए, एक विंडोज़ संस्करण Get/Set ConsoleMode

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

int 
main(int argc, char **argv) 
{ 
    struct termios oflags, nflags; 
    char password[64]; 

    /* disabling echo */ 
    tcgetattr(fileno(stdin), &oflags); 
    nflags = oflags; 
    nflags.c_lflag &= ~ECHO; 
    nflags.c_lflag |= ECHONL; 

    if (tcsetattr(fileno(stdin), TCSANOW, &nflags) != 0) { 
     perror("tcsetattr"); 
     return EXIT_FAILURE; 
    } 

    printf("password: "); 
    fgets(password, sizeof(password), stdin); 
    password[strlen(password) - 1] = 0; 
    printf("you typed '%s'\n", password); 

    /* restore terminal */ 
    if (tcsetattr(fileno(stdin), TCSANOW, &oflags) != 0) { 
     perror("tcsetattr"); 
     return EXIT_FAILURE; 
    } 

    return 0; 
} 
+0

यह मेरे लिए सबसे सरल तरीका लगता है। –

+3

आपको stdin की कोशिश करने से पहले/dev/tty का उपयोग करना चाहिए, जैसे कि आप पाइप का उपयोग कर रहे हैं, stdin पाइप सामग्री होगी, टर्मिनल इनपुट नहीं। – xryl669

+3

मुझे चार पासवर्ड देखने में कोई दिक्कत नहीं होगी [64] = {0}; या इसका उपयोग करने से पहले एक मेमसेट का उपयोग किया जाता है यदि यह –

4

आप स्क्रीन पर परिणामों को प्रतिबिंबित किए बिना मानक इनपुट से पढ़ने के लिए ncurses लाइब्रेरी का उपयोग कर सकते हैं। (कोई इनपुट प्राप्त करने से पहले noecho() पर कॉल करें)। पुस्तकालय उम्र के लिए चारों ओर हो गया और प्लेटफार्मों की एक विस्तृत विविधता पर काम करता है (विंडोज़ संस्करण पाया जा सकता है here)

+0

मैंने एक साधारण शाप ऐप बनाया है (जब मैंने शाप का उपयोग किया था तो यह दो दशक में तय किया गया है), और पाया कि जब मैंने initscr() किया था तो स्क्रीन को साफ़ कर दिया था। शायद इसके चारों ओर कुछ रास्ता है, लेकिन यह मनुष्यों के पृष्ठों की त्वरित जानकारी से स्पष्ट नहीं था। –

1

खिड़कियों पर, आप शायद SetConsoleMode एपीआई का उपयोग कर सकते है, here का वर्णन किया।

2

University of Milwaukee's documentation के अनुसार यह अप्रचलित है क्योंकि:

getpass() समारोह threadsafe क्योंकि यह वैश्विक संकेत राज्य manipulates नहीं है।

getpass() फ़ंक्शन एक्स/ओपन सीएई विशिष्टता के भविष्य के संस्करण से वापस लेना निर्धारित है।

+3

2001 से इसे पीओएसईक्स/सिंगल यूनिक्स (एक्स/ओपन के उत्तराधिकारी) से वापस ले लिया गया है। –

+2

यह एक उत्तर कैसे है? यह वास्तव में एक टिप्पणी होना चाहिए। –

3

का उपयोग करना चाहिए भले ही इस एक बहुत पुरानी सवाल है कि पहले से ही उत्तर दिया गया है, यहाँ मैं क्या उपयोग करते आ रहे हैं (जो स्वीकार्य उत्तर के समान ही है):

#include <termios.h> 
#include <cstdio> 

// 
// The following is a slightly modifed version taken from: 
// http://www.gnu.org/software/libc/manual/html_node/getpass.html 
// 
ssize_t my_getpass (char *prompt, char **lineptr, size_t *n, FILE *stream) 
{ 
    struct termios _old, _new; 
    int nread; 

    /* Turn echoing off and fail if we can’t. */ 
    if (tcgetattr (fileno (stream), &_old) != 0) 
     return -1; 
    _new = _old; 
    _new.c_lflag &= ~ECHO; 
    if (tcsetattr (fileno (stream), TCSAFLUSH, &_new) != 0) 
     return -1; 

    /* Display the prompt */ 
    if (prompt) 
     printf("%s", prompt); 

    /* Read the password. */ 
    nread = getline (lineptr, n, stream); 

    /* Remove the carriage return */ 
    if (nread >= 1 && (*lineptr)[nread - 1] == '\n') 
    { 
     (*lineptr)[nread-1] = 0; 
     nread--; 
    } 
    printf("\n"); 

    /* Restore terminal. */ 
    (void) tcsetattr (fileno (stream), TCSAFLUSH, &_old); 

    return nread; 
} 

// 
// Test harness - demonstrate calling my_getpass(). 
// 
int main(int argc, char *argv[]) 
{ 
    size_t maxlen = 255; 
    char pwd[maxlen]; 
    char *pPwd = pwd; // <-- haven't figured out how to avoid this. 

    int count = my_getpass((char*)"Enter Password: ", &pPwd, &maxlen, stdin); 

    printf("Size of password: %d\nPassword in plaintext: %s\n", count, pwd); 

    return 0; 
} 
+0

मुझे गुस्ता। यह आपको कमांड लाइन से अपने पासवर्ड में पाइप करने देगा; हालांकि, अगर आप ऐसा करने वाले हैं तो आप पासवर्ड प्रॉम्प्ट प्रिंट नहीं करना चाहेंगे। – JesseTG

संबंधित मुद्दे