Zeichenkette von stdin unwsichtbar einlesen



  • Hi, mit welchem Syscall kann ich eine Zeichenkette derart einlesen, dass die Zeichen nicht auf der Shell angezeigt werden? Beispiele dafür sind z.B. passwd und gpg.

    Danke 🙂



  • Dazu musst du mit der Funktion tcsetattr() das "Echo" der Terminal-Schnittstelle abschalten. Hier ein Beispielprogramm aus meinem Buch "C und Linux":

    /*
        password.c - Passwortabfrage ohne Echo
    */
    
    # include <stdio.h>
    # include <unistd.h>
    # include <fcntl.h>
    # include <termios.h>
    
    int main()
     {
      int old_flags;
      char password[16];
      struct termios term_attr;
    
      if (tcgetattr(STDIN_FILENO, &term_attr) != 0)
       {
        perror("password: tcgetattr() failed");
        return(1);
       }			 /* alte Einst. sichern */
      old_flags = term_attr.c_lflag;
      term_attr.c_lflag &= ~ECHO;
      if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr)
          != 0)
        perror("password: tcsetattr() failed");
    
      printf("password: ");
      scanf("%15s", password);
    			/* Std.-Eingabe wie vorher */
      term_attr.c_lflag = old_flags;
      if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_attr)
          != 0)
        perror("password: tcsetattr() failed");
    
      if (strcmp(password, "secret") == 0)
        printf("\npassword accepted.\n");
      else
        printf("\nwrong password.\n");
    
      return(0);
     }
    

    Martin



  • Besten Dank! 🙂



  • Siehe auch die FAQ


Anmelden zum Antworten