Hit's Hit's - 10 months ago 68
Linux Question

Hide password input on terminal

I want to mask my password while writing it with

I use Linux GCC for this code.
I know one solution is to use
function like this

#include <conio.h>
int main()
char c,password[10];
int i;
while( (c=getch())!= '\n');{
password[i] = c;
return 1;

but the problem is that
does not include
file so,
is useless for me.
Does anyone have a solution?

Answer Source

Hmm in the Linux world masking isn't usually done with asterisks, normally echoing is just turned off and the terminal displays blanks E.g. if you use su or log into a virtual terminal etc.

There is a library function to handle getting passwords, it won't mask the password with asterisks but will disable echoing of the password to terminal. I pulled this out of a linux book I have. I believe its part of the posix standard

#include <unistd.h>
char *getpass(const char *prompt);

/*Returns pointer to statically allocated input password string
on success, or NULL on error*/

The getpass() function first disables echoing and all processing of terminal special characters (such as the interrupt character, normally Control-C).

It then prints the string pointed to by prompt, and reads a line of input, returning the null-terminated input string with the trailing newline stripped, as its function result.

A google search for getpass() has a reference to the GNU implementation (should be in most linux distros) and some sample code for implementing your own if need be


Their example for rolling your own:

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

 my_getpass (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;

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

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

   return nread;

If need be you could use this as the basis as modify it to display asterisks.