programacion - manual completo de c++ pdf
Obtener una contraseña en C sin usar getpass(3)? (5)
Aunque esta es una pregunta muy antigua que ya se ha respondido, esto es lo que he estado usando (que es muy similar a la respuesta aceptada):
#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;
}
Podría usar getpass()
para obtener una contraseña. Sin embargo, la página man dice:
Esta función es obsoleta. No lo uses.
¿Cuál es la forma actual de obtener una contraseña del terminal del usuario sin hacer eco, de una manera compatible con POSIX? [Originalmente dije "portably", pero mi intención era evitar el uso de una función obsoleta.]
En Windows, probablemente pueda usar la API SetConsoleMode
, que se describe here .
Puede usar la biblioteca ncurses para leer desde la entrada estándar sin repetir los resultados en la pantalla. (Llame a noecho()
antes de obtener cualquier entrada). La biblioteca ha existido durante años y funciona en una amplia variedad de plataformas (la versión de Windows se puede encontrar here )
Según la documentación de la Universidad de Milwaukee, está obsoleto porque:
La función
getpass()
no es segura para los hilos porque manipula el estado de la señal global.La función
getpass()
está programada para retirarse de una versión futura de la especificación X / Open CAE.
esto debería funcionar en linux / macosx, una versión de Windows debería usar 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;
}